泰凌微TLSR825X开发二 GPIO常用配置与中断休眠唤醒

2024-03-11 14:50

本文主要是介绍泰凌微TLSR825X开发二 GPIO常用配置与中断休眠唤醒,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

前言

TLSR825X系列的IO配置与常用MCU相差无几,应用到低功耗设计的话差异比较大,825X系列的停止模式下功耗相对较高(suspend模式),要做到较低功耗需要类似于ST单片机进入待机Standby模式(deepsleep模式),仅通过wakeup引脚或时钟来唤醒,唤醒后系统重新通过启动文件来跳转到main入口
本章讲下GPIO的常用配置与IO中断、IO唤醒功能,如有异议,欢迎留言指正

功能简介

  • 8258系列共有5组36个GPIO,PA0-PA7、PB0-PB7、PC0-PC7、PD0-PD7、PE0-PE3
  • PA0~PD7可以用作通用IO口,其中上下拉寄存器为模拟寄存器控制,该寄存器可以在deepsleep模式中保持
  • PA7默认用作SWS功能(调试下载),必须内部上拉
  • PE0~PE3被用于内部flash的SPI读写通信引脚,用户不允许使用
  • PA5~PA6可复用DM和DP用作USB功能

不同的型号封装和IO管脚不同,以实际型号为准
具体引脚复用表可查看数据手册第7章7.1GPIO章节

在这里插入图片描述

寄存器配置

寄存器
  • GPIO寄存器偏移地址为0x580~0x59c,对应PA0~PE3中的输入、输出、上下拉、强弱输出、中断等配置
#define reg_gpio_pa_in			 REG_ADDR8(0x580)
#define reg_gpio_pa_ie			 REG_ADDR8(0x581)
#define reg_gpio_pa_oen			 REG_ADDR8(0x582)
#define reg_gpio_pa_out			 REG_ADDR8(0x583)
#define reg_gpio_pa_pol			 REG_ADDR8(0x584)
#define reg_gpio_pa_ds			 REG_ADDR8(0x585)
#define reg_gpio_pa_gpio		 REG_ADDR8(0x586)
#define reg_gpio_pa_irq_en		 REG_ADDR8(0x587)
- - - - - - - - - 
常用接口
  • 功能配置:主要是配置成普通IO还是复用高级功能(uart、spi、iic等)
void gpio_set_func(GPIO_PinTypeDef pin, GPIO_FuncTypeDef func);
  • 输入使能
void gpio_set_input_en(GPIO_PinTypeDef pin, unsigned int value);
  • 读取管脚电平
 unsigned int gpio_read(GPIO_PinTypeDef pin);
  • 输出使能
int gpio_is_output_en(GPIO_PinTypeDef pin);
  • 设置管脚输出电平
void gpio_write(GPIO_PinTypeDef pin, unsigned int value)
  • 设置上下拉
void gpio_setup_up_down_resistor(GPIO_PinTypeDef gpio, GPIO_PullTypeDef up_down)
输出实例
gpio_set_func(GPIO_PA4, AS_GPIO); // 数字gpio
gpio_set_output_en(GPIO_PA4, 1);//使能输出
gpio_set_input_en(GPIO_PA4, 0); //禁用输入
gpio_write(GPIO_PA4, 0); //输出低
gpio_write(GPIO_PA4, 1); //输出高
输入实例
gpio_set_func(GPIO_PA4, AS_GPIO); // 数字gpio
gpio_set_output_en(GPIO_PA4, 0);//禁用输出
gpio_set_input_en(GPIO_PA4, 1); //使能输入
gpio_setup_up_down_resistor(GPIO_PA4, PM_PIN_PULLUP_10K);  //上拉10K
if(gpio_read(GPIO_PA4)){ //读取电平 H;
}else{//L;
}

IO中断

中断响应会映射到统一入口,通过中断标志来判断是哪个中断源;
IO中断源获取到后,如果单组中断源存在多个IO使能的中断,可以进一步判断IO电平来决定是哪个IO触发了中断

  • IO中断最大支持三组,分别对应IRQ_GPIOIRQ_GPIO_RISC0IRQ_GPIO_RISC1,实际需要根据应用来合理分配,建议一组设置一个IO中断(相互独立),如果同组使能多个GPIO需要在入口中断中进行判断
代码实例
  • 参考app_gpio_irq.c的例程代码,分别配置了三组独立的GPIO中断
#define GPIO_TEST_PIN1				GPIO_PD0
#define GPIO_TEST_PIN2				GPIO_PD1
#define GPIO_TEST_PIN3				GPIO_PD2
void app_gpio_irq_test_init(void)
{//IRQ_GPIO  下降沿触发/***step1. 配置为输入*/gpio_set_func(GPIO_TEST_PIN1, AS_GPIO);           //enable GPIO funcgpio_set_input_en(GPIO_TEST_PIN1, 1);             //enable inputgpio_set_output_en(GPIO_TEST_PIN1, 0);            //disable output/***step2.      上拉 下降沿中断 ***/gpio_setup_up_down_resistor(GPIO_TEST_PIN1, PM_PIN_PULLUP_10K);  //上拉10K open pull up resistorgpio_set_interrupt_pol(GPIO_TEST_PIN1, pol_falling);    //下降沿 falling edge/***step3.     设置IRQ中断  ***/reg_irq_src = FLD_IRQ_GPIO_EN; //清中断标志reg_irq_mask |= FLD_IRQ_GPIO_EN;//使能irq中断gpio_en_interrupt(GPIO_TEST_PIN1, 1);//IRQ_GPIO_RISC0 下降沿触发/***step1. 配置为输入********/gpio_set_func(GPIO_TEST_PIN2, AS_GPIO);           //enable GPIO funcgpio_set_input_en(GPIO_TEST_PIN2, 1);             //enable inputgpio_set_output_en(GPIO_TEST_PIN2, 0);            //disable output  /***step2.      上拉 下降沿中断 ***/gpio_setup_up_down_resistor(GPIO_TEST_PIN2, PM_PIN_PULLUP_10K);  //上拉10K open pull up resistorgpio_set_interrupt_pol(GPIO_TEST_PIN2, pol_falling);    //下降沿 falling edge/***step3.     设置IRQ中断  ***/reg_irq_src = FLD_IRQ_GPIO_RISC0_EN; //清中断标志reg_irq_mask |= FLD_IRQ_GPIO_RISC0_EN;//使能irq_risc0中断gpio_en_interrupt_risc0(GPIO_TEST_PIN2, 1);//IRQ_GPIO_RISC1 上升沿触发/***step1. 配置为输入********/gpio_set_func(GPIO_TEST_PIN3, AS_GPIO);           //enable GPIO funcgpio_set_input_en(GPIO_TEST_PIN3, 1);             //enable inputgpio_set_output_en(GPIO_TEST_PIN3, 0);            //disable output/***step2.      set the polarity and open pullup ***/gpio_setup_up_down_resistor(GPIO_TEST_PIN3, PM_PIN_PULLDOWN_100K);  //下拉100K open pull down resistorgpio_set_interrupt_pol(GPIO_TEST_PIN3, pol_rising); //上升沿 rising edge//***step3.     设置IRQ中断  ***/reg_irq_src = FLD_IRQ_GPIO_RISC1_EN; //清中断标志reg_irq_mask |= FLD_IRQ_GPIO_RISC1_EN;//使能irq_risc1中断gpio_en_interrupt_risc1(GPIO_TEST_PIN3, 1);irq_enable();  //开启总中断
}
  • 函数irq_handler为中断入口,通过判断中断标志来进行相对应处理
//所有中断入口
_attribute_ram_code_ void irq_handler(void)
{irq_blt_sdk_handler (); //ble中断处理/************ test1 irq  ***************/if(reg_irq_src & FLD_IRQ_GPIO_EN){reg_irq_src = FLD_IRQ_GPIO_EN;        // clear irq_gpio irq flagprintf("test1 irq !\n");}/************* test2 irq risc0 *************/if(reg_irq_src & FLD_IRQ_GPIO_RISC0_EN){reg_irq_src = FLD_IRQ_GPIO_RISC0_EN;        // clear irq_gpio irq flagprintf("test2 irq risc0 !\n");}/************* test3 irq risc1 *************/if(reg_irq_src & FLD_IRQ_GPIO_RISC1_EN){reg_irq_src = FLD_IRQ_GPIO_RISC1_EN;        // clear irq_gpio irq flagprintf("test3 irq risc1!\n");}
}

IO唤醒

系统休眠状态下是无法直接通过IO中断唤醒的,唤醒机制仅支持Timer与PAD;休眠前可通过配置使能PAD的唤醒电平来触发

代码实例

参考test_low_power.c文件代码,实际开发可同时使能多个IO进行指定的电平唤醒;

DEEPSLEEP模式
  • 调用cpu_sleep_wakeup进入深度休眠后,管脚PB6产生低电平脉冲系统会立即重启
    gpio_setup_up_down_resistor(GPIO_PB6, PM_PIN_PULLUP_10K); //上拉10Kcpu_set_gpio_wakeup(GPIO_PB6, Level_Low,1); //低电平唤醒while(1){cpu_sleep_wakeup(DEEPSLEEP_MODE, PM_WAKEUP_PAD, 0);  //进入deepsleep,开启PAD唤醒}
SUSPEND模式
  • 调用cpu_sleep_wakeup进入停止模式后,管脚PB6产生低电平脉,系统唤醒并执行打印
    gpio_setup_up_down_resistor(GPIO_PB6, PM_PIN_PULLUP_10K); //上拉10Kcpu_set_gpio_wakeup(GPIO_PB6, Level_Low,1); //低电平唤醒while(1){cpu_sleep_wakeup(SUSPEND_MODE, PM_WAKEUP_PAD, 0);  //进入suspend,开启PAD唤醒printf("suspend mode wakeup\n");break;}
IO唤醒常见问题
  • 休眠前如果唤醒管脚电平处于有效状态,调用cpu_sleep_wakeup进入DEEPSLEEP_MODE会立即重启; 而配置进入SUSPEND_MODEDEEPSLEEP_RETENTION_MODE并立即返回错误结果状态
  • deepsleep深度休眠模式下为了保持IO的输出能力,需要通过上下拉来实现,但是上拉1M的电平会比VCC(3.3V)略低,建议配置为10K
  • 上拉10K的控制中不要使用PC0~PC7,在deepsleep retention wakeup时会有短时间的抖动,产生毛刺

这篇关于泰凌微TLSR825X开发二 GPIO常用配置与中断休眠唤醒的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/798119

相关文章

SpringBoot线程池配置使用示例详解

《SpringBoot线程池配置使用示例详解》SpringBoot集成@Async注解,支持线程池参数配置(核心数、队列容量、拒绝策略等)及生命周期管理,结合监控与任务装饰器,提升异步处理效率与系统... 目录一、核心特性二、添加依赖三、参数详解四、配置线程池五、应用实践代码说明拒绝策略(Rejected

Spring Boot中WebSocket常用使用方法详解

《SpringBoot中WebSocket常用使用方法详解》本文从WebSocket的基础概念出发,详细介绍了SpringBoot集成WebSocket的步骤,并重点讲解了常用的使用方法,包括简单消... 目录一、WebSocket基础概念1.1 什么是WebSocket1.2 WebSocket与HTTP

SQL Server配置管理器无法打开的四种解决方法

《SQLServer配置管理器无法打开的四种解决方法》本文总结了SQLServer配置管理器无法打开的四种解决方法,文中通过图文示例介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的... 目录方法一:桌面图标进入方法二:运行窗口进入检查版本号对照表php方法三:查找文件路径方法四:检查 S

golang中reflect包的常用方法

《golang中reflect包的常用方法》Go反射reflect包提供类型和值方法,用于获取类型信息、访问字段、调用方法等,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值... 目录reflect包方法总结类型 (Type) 方法值 (Value) 方法reflect包方法总结

C# 比较两个list 之间元素差异的常用方法

《C#比较两个list之间元素差异的常用方法》:本文主要介绍C#比较两个list之间元素差异,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录1. 使用Except方法2. 使用Except的逆操作3. 使用LINQ的Join,GroupJoin

python常用的正则表达式及作用

《python常用的正则表达式及作用》正则表达式是处理字符串的强大工具,Python通过re模块提供正则表达式支持,本文给大家介绍python常用的正则表达式及作用详解,感兴趣的朋友跟随小编一起看看吧... 目录python常用正则表达式及作用基本匹配模式常用正则表达式示例常用量词边界匹配分组和捕获常用re

Linux中SSH服务配置的全面指南

《Linux中SSH服务配置的全面指南》作为网络安全工程师,SSH(SecureShell)服务的安全配置是我们日常工作中不可忽视的重要环节,本文将从基础配置到高级安全加固,全面解析SSH服务的各项参... 目录概述基础配置详解端口与监听设置主机密钥配置认证机制强化禁用密码认证禁止root直接登录实现双因素

嵌入式数据库SQLite 3配置使用讲解

《嵌入式数据库SQLite3配置使用讲解》本文强调嵌入式项目中SQLite3数据库的重要性,因其零配置、轻量级、跨平台及事务处理特性,可保障数据溯源与责任明确,详细讲解安装配置、基础语法及SQLit... 目录0、惨痛教训1、SQLite3环境配置(1)、下载安装SQLite库(2)、解压下载的文件(3)、

SpringBoot开发中十大常见陷阱深度解析与避坑指南

《SpringBoot开发中十大常见陷阱深度解析与避坑指南》在SpringBoot的开发过程中,即使是经验丰富的开发者也难免会遇到各种棘手的问题,本文将针对SpringBoot开发中十大常见的“坑... 目录引言一、配置总出错?是不是同时用了.properties和.yml?二、换个位置配置就失效?搞清楚加

Linux如何快速检查服务器的硬件配置和性能指标

《Linux如何快速检查服务器的硬件配置和性能指标》在运维和开发工作中,我们经常需要快速检查Linux服务器的硬件配置和性能指标,本文将以CentOS为例,介绍如何通过命令行快速获取这些关键信息,... 目录引言一、查询CPU核心数编程(几C?)1. 使用 nproc(最简单)2. 使用 lscpu(详细信