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

相关文章

Java String字符串的常用使用方法

《JavaString字符串的常用使用方法》String是JDK提供的一个类,是引用类型,并不是基本的数据类型,String用于字符串操作,在之前学习c语言的时候,对于一些字符串,会初始化字符数组表... 目录一、什么是String二、如何定义一个String1. 用双引号定义2. 通过构造函数定义三、St

浅谈配置MMCV环境,解决报错,版本不匹配问题

《浅谈配置MMCV环境,解决报错,版本不匹配问题》:本文主要介绍浅谈配置MMCV环境,解决报错,版本不匹配问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录配置MMCV环境,解决报错,版本不匹配错误示例正确示例总结配置MMCV环境,解决报错,版本不匹配在col

Python通过模块化开发优化代码的技巧分享

《Python通过模块化开发优化代码的技巧分享》模块化开发就是把代码拆成一个个“零件”,该封装封装,该拆分拆分,下面小编就来和大家简单聊聊python如何用模块化开发进行代码优化吧... 目录什么是模块化开发如何拆分代码改进版:拆分成模块让模块更强大:使用 __init__.py你一定会遇到的问题模www.

Nginx中配置HTTP/2协议的详细指南

《Nginx中配置HTTP/2协议的详细指南》HTTP/2是HTTP协议的下一代版本,旨在提高性能、减少延迟并优化现代网络环境中的通信效率,本文将为大家介绍Nginx配置HTTP/2协议想详细步骤,需... 目录一、HTTP/2 协议概述1.HTTP/22. HTTP/2 的核心特性3. HTTP/2 的优

Python 安装和配置flask, flask_cors的图文教程

《Python安装和配置flask,flask_cors的图文教程》:本文主要介绍Python安装和配置flask,flask_cors的图文教程,本文通过图文并茂的形式给大家介绍的非常详细,... 目录一.python安装:二,配置环境变量,三:检查Python安装和环境变量,四:安装flask和flas

Spring Security基于数据库的ABAC属性权限模型实战开发教程

《SpringSecurity基于数据库的ABAC属性权限模型实战开发教程》:本文主要介绍SpringSecurity基于数据库的ABAC属性权限模型实战开发教程,本文给大家介绍的非常详细,对大... 目录1. 前言2. 权限决策依据RBACABAC综合对比3. 数据库表结构说明4. 实战开始5. MyBA

使用Python开发一个简单的本地图片服务器

《使用Python开发一个简单的本地图片服务器》本文介绍了如何结合wxPython构建的图形用户界面GUI和Python内建的Web服务器功能,在本地网络中搭建一个私人的,即开即用的网页相册,文中的示... 目录项目目标核心技术栈代码深度解析完整代码工作流程主要功能与优势潜在改进与思考运行结果总结你是否曾经

Spring Boot + MyBatis Plus 高效开发实战从入门到进阶优化(推荐)

《SpringBoot+MyBatisPlus高效开发实战从入门到进阶优化(推荐)》本文将详细介绍SpringBoot+MyBatisPlus的完整开发流程,并深入剖析分页查询、批量操作、动... 目录Spring Boot + MyBATis Plus 高效开发实战:从入门到进阶优化1. MyBatis

SpringCloud动态配置注解@RefreshScope与@Component的深度解析

《SpringCloud动态配置注解@RefreshScope与@Component的深度解析》在现代微服务架构中,动态配置管理是一个关键需求,本文将为大家介绍SpringCloud中相关的注解@Re... 目录引言1. @RefreshScope 的作用与原理1.1 什么是 @RefreshScope1.

Python基于wxPython和FFmpeg开发一个视频标签工具

《Python基于wxPython和FFmpeg开发一个视频标签工具》在当今数字媒体时代,视频内容的管理和标记变得越来越重要,无论是研究人员需要对实验视频进行时间点标记,还是个人用户希望对家庭视频进行... 目录引言1. 应用概述2. 技术栈分析2.1 核心库和模块2.2 wxpython作为GUI选择的优