泰凌微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

相关文章

mybatis映射器配置小结

《mybatis映射器配置小结》本文详解MyBatis映射器配置,重点讲解字段映射的三种解决方案(别名、自动驼峰映射、resultMap),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定... 目录select中字段的映射问题使用SQL语句中的别名功能使用mapUnderscoreToCame

Linux下MySQL数据库定时备份脚本与Crontab配置教学

《Linux下MySQL数据库定时备份脚本与Crontab配置教学》在生产环境中,数据库是核心资产之一,定期备份数据库可以有效防止意外数据丢失,本文将分享一份MySQL定时备份脚本,并讲解如何通过cr... 目录备份脚本详解脚本功能说明授权与可执行权限使用 Crontab 定时执行编辑 Crontab添加定

Java使用jar命令配置服务器端口的完整指南

《Java使用jar命令配置服务器端口的完整指南》本文将详细介绍如何使用java-jar命令启动应用,并重点讲解如何配置服务器端口,同时提供一个实用的Web工具来简化这一过程,希望对大家有所帮助... 目录1. Java Jar文件简介1.1 什么是Jar文件1.2 创建可执行Jar文件2. 使用java

SpringBoot 多环境开发实战(从配置、管理与控制)

《SpringBoot多环境开发实战(从配置、管理与控制)》本文详解SpringBoot多环境配置,涵盖单文件YAML、多文件模式、MavenProfile分组及激活策略,通过优先级控制灵活切换环境... 目录一、多环境开发基础(单文件 YAML 版)(一)配置原理与优势(二)实操示例二、多环境开发多文件版

Vite 打包目录结构自定义配置小结

《Vite打包目录结构自定义配置小结》在Vite工程开发中,默认打包后的dist目录资源常集中在asset目录下,不利于资源管理,本文基于Rollup配置原理,本文就来介绍一下通过Vite配置自定义... 目录一、实现原理二、具体配置步骤1. 基础配置文件2. 配置说明(1)js 资源分离(2)非 JS 资

使用docker搭建嵌入式Linux开发环境

《使用docker搭建嵌入式Linux开发环境》本文主要介绍了使用docker搭建嵌入式Linux开发环境,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面... 目录1、前言2、安装docker3、编写容器管理脚本4、创建容器1、前言在日常开发全志、rk等不同

MySQL8 密码强度评估与配置详解

《MySQL8密码强度评估与配置详解》MySQL8默认启用密码强度插件,实施MEDIUM策略(长度8、含数字/字母/特殊字符),支持动态调整与配置文件设置,推荐使用STRONG策略并定期更新密码以提... 目录一、mysql 8 密码强度评估机制1.核心插件:validate_password2.密码策略级

ShardingProxy读写分离之原理、配置与实践过程

《ShardingProxy读写分离之原理、配置与实践过程》ShardingProxy是ApacheShardingSphere的数据库中间件,通过三层架构实现读写分离,解决高并发场景下数据库性能瓶... 目录一、ShardingProxy技术定位与读写分离核心价值1.1 技术定位1.2 读写分离核心价值二

JavaScript中比较两个数组是否有相同元素(交集)的三种常用方法

《JavaScript中比较两个数组是否有相同元素(交集)的三种常用方法》:本文主要介绍JavaScript中比较两个数组是否有相同元素(交集)的三种常用方法,每种方法结合实例代码给大家介绍的非常... 目录引言:为什么"相等"判断如此重要?方法1:使用some()+includes()(适合小数组)方法2

SpringBoot 获取请求参数的常用注解及用法

《SpringBoot获取请求参数的常用注解及用法》SpringBoot通过@RequestParam、@PathVariable等注解支持从HTTP请求中获取参数,涵盖查询、路径、请求体、头、C... 目录SpringBoot 提供了多种注解来方便地从 HTTP 请求中获取参数以下是主要的注解及其用法:1