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

相关文章

HarmonyOS学习(七)——UI(五)常用布局总结

自适应布局 1.1、线性布局(LinearLayout) 通过线性容器Row和Column实现线性布局。Column容器内的子组件按照垂直方向排列,Row组件中的子组件按照水平方向排列。 属性说明space通过space参数设置主轴上子组件的间距,达到各子组件在排列上的等间距效果alignItems设置子组件在交叉轴上的对齐方式,且在各类尺寸屏幕上表现一致,其中交叉轴为垂直时,取值为Vert

JS常用组件收集

收集了一些平时遇到的前端比较优秀的组件,方便以后开发的时候查找!!! 函数工具: Lodash 页面固定: stickUp、jQuery.Pin 轮播: unslider、swiper 开关: switch 复选框: icheck 气泡: grumble 隐藏元素: Headroom

Zookeeper安装和配置说明

一、Zookeeper的搭建方式 Zookeeper安装方式有三种,单机模式和集群模式以及伪集群模式。 ■ 单机模式:Zookeeper只运行在一台服务器上,适合测试环境; ■ 伪集群模式:就是在一台物理机上运行多个Zookeeper 实例; ■ 集群模式:Zookeeper运行于一个集群上,适合生产环境,这个计算机集群被称为一个“集合体”(ensemble) Zookeeper通过复制来实现

这15个Vue指令,让你的项目开发爽到爆

1. V-Hotkey 仓库地址: github.com/Dafrok/v-ho… Demo: 戳这里 https://dafrok.github.io/v-hotkey 安装: npm install --save v-hotkey 这个指令可以给组件绑定一个或多个快捷键。你想要通过按下 Escape 键后隐藏某个组件,按住 Control 和回车键再显示它吗?小菜一碟: <template

CentOS7安装配置mysql5.7 tar免安装版

一、CentOS7.4系统自带mariadb # 查看系统自带的Mariadb[root@localhost~]# rpm -qa|grep mariadbmariadb-libs-5.5.44-2.el7.centos.x86_64# 卸载系统自带的Mariadb[root@localhost ~]# rpm -e --nodeps mariadb-libs-5.5.44-2.el7

Hadoop企业开发案例调优场景

需求 (1)需求:从1G数据中,统计每个单词出现次数。服务器3台,每台配置4G内存,4核CPU,4线程。 (2)需求分析: 1G / 128m = 8个MapTask;1个ReduceTask;1个mrAppMaster 平均每个节点运行10个 / 3台 ≈ 3个任务(4    3    3) HDFS参数调优 (1)修改:hadoop-env.sh export HDFS_NAMENOD

hadoop开启回收站配置

开启回收站功能,可以将删除的文件在不超时的情况下,恢复原数据,起到防止误删除、备份等作用。 开启回收站功能参数说明 (1)默认值fs.trash.interval = 0,0表示禁用回收站;其他值表示设置文件的存活时间。 (2)默认值fs.trash.checkpoint.interval = 0,检查回收站的间隔时间。如果该值为0,则该值设置和fs.trash.interval的参数值相等。

NameNode内存生产配置

Hadoop2.x 系列,配置 NameNode 内存 NameNode 内存默认 2000m ,如果服务器内存 4G , NameNode 内存可以配置 3g 。在 hadoop-env.sh 文件中配置如下。 HADOOP_NAMENODE_OPTS=-Xmx3072m Hadoop3.x 系列,配置 Nam

第10章 中断和动态时钟显示

第10章 中断和动态时钟显示 从本章开始,按照书籍的划分,第10章开始就进入保护模式(Protected Mode)部分了,感觉从这里开始难度突然就增加了。 书中介绍了为什么有中断(Interrupt)的设计,中断的几种方式:外部硬件中断、内部中断和软中断。通过中断做了一个会走的时钟和屏幕上输入字符的程序。 我自己理解中断的一些作用: 为了更好的利用处理器的性能。协同快速和慢速设备一起工作

wolfSSL参数设置或配置项解释

1. wolfCrypt Only 解释:wolfCrypt是一个开源的、轻量级的、可移植的加密库,支持多种加密算法和协议。选择“wolfCrypt Only”意味着系统或应用将仅使用wolfCrypt库进行加密操作,而不依赖其他加密库。 2. DTLS Support 解释:DTLS(Datagram Transport Layer Security)是一种基于UDP的安全协议,提供类似于