中科蓝讯SDK开发 GPIO介绍和 IO中断示例
中科蓝讯SDK开发 GPIO介绍和 IO中断示例
哈喽,大家好。
相信刚接触中科蓝讯的小伙伴都有这样的疑惑:初始化 GPIO 要设置哪些寄存器?在哪里调用 GPIO 初始化函数?今天就来给大家介绍一下中科蓝讯 GPIO 的使用,在此篇文章中以 GPIOA 为例,方便大家在自定义 GPIO 功能时候可以做一个参考。
接着介绍一个 IO 中断示例,希望对大家使用到 IO 中断时有所帮助。
一、GPIO 介绍及示例
1、寄存器介绍
中科蓝讯的SOC芯片内置RISC-V 32位CPU, IO引脚控制功能选择,由对应的SFR(Special Function Register)进行设置,
① GPIOAFEN
设置为 0 表示作为通用 IO(GPIO) 使用;设置为 1 表示做其它功能性IO,如串口 /SPI。
② GPIOADE
设置 0为模拟IO;设置 1 为数字IO。如作为 AUX 输入的 IO 口就需要设置成模拟 IO, 减少数字 IO 对 AUX 的干扰。
③ GPIOADIR
设置 0为 IO 输出;设置 1为 IO 输入。
④ GPIOADRV
设置为 0 时 IO 输出驱动为 8mA;设置为 1 时 IO 输出驱动为32mA。注意 IO 方向为输出且是数字 IO 时此寄存器才有效。
⑤ 控制上拉或下拉的寄存器
GPIOAPU //10K上拉使能
GPIOAPD //10K下拉使能
GPIOAPU200K //200K上拉使能
GPIOAPD200K //200K下拉使能
GPIOAPU300 //300欧上拉使能
GPIOAPD300 //300欧下拉使能
注意,只有当 IO 设置为输入时, 上下拉才有效。
⑥ GPIOA
IO 方向为输入时,读此寄存器的值即得到引脚的高低状态;IO 为输出时,设置此寄存器的高低即设置对应引脚的高低输出。
⑦ GPIOASET/GPIOACLR
作为输出时,输出电平的高低可以通过设置 GPIOASET/GPIOACLR 来快速实现。注意,GPIOASET/GPIOACLR 只对写 1 的位有效,并且不会改变其它位的状态。
GPIOASET = BIT(0); //PA0 输出高,等效于 GPIOA |= BIT(0);
GPIOACLR = BIT(0); //PA0 输出低,等效于 GPIOA &= ~BIT(0);
优化原理:
如程序把IO设置为高, 一般这样写GPIOA |= BIT(0);
这里实际上有三个步骤:
1) 先读出GPIOA.
2) 再把GPIOA | BIT(0);
3) 把或后的结果再写回GPIOA
而使用GPIOASET等效优化后, 直一条指令GPIOASET = BIT(0);即达到 上面三步才能达到的效果.
NOTE:
具体配置管脚时候,根据需求设置以上13个寄存器,当然,不是所有寄存器都需要设置,一定需要设置的寄存器包括:
数字功能使能寄存器GPIOADE,用于选择当做数字功能,而不是模拟功能;
输入输出功能设置寄存器GPIOADIR,用于设置管脚是输出还是输入,如果是输入还需要设置对应的上下拉功能;
数据寄存器GPIOA,可读可写,作为输出的时候,就写寄存器,作为输入的时候就需要读寄存器。
2、GPIOA 使用示例
① GPIOA 初始化函数
② 代码示例
int main(void) { printf("Hello AB5300\n"); //示例开始 GPIOAFEN &= ~BIT(0); //PA0作为GPIO使用 GPIOADE |= BIT(0); //PA0设置为数字IO GPIOADIR &= ~BIT(0); //PA0方向设置为输出 WDT_DIS(); //测试代码,关看门狗,防止看门狗复位 while(1) { GPIOA |= BIT(0); //PA0输出高, 等效于GPIOASET = BIT(0); delay_ms(100); GPIOA &= ~BIT(0); //PA0输出低, 等效于GPIOACLR = BIT(0); delay_ms(100); } }
③ GPIOA 初始化函数调用
GPIOA 初始化函数可以放在 bsp_sys_init() 函数的最后。初始化之后,即可以在其他需要的地方通过 GPIOASET/GPIOACLR 来翻转 GPIOA0 的状态。
二、IO 中断示例
1、寄存器接介绍
① WKUPEDG
7:0,8 组唤醒输入边沿设置;0:上升沿出发,1:下降沿触发。
23:16,8 组唤醒中断产生标志;0:无中断;1:中断产生。
② WKUPCPND:唤醒清除挂起寄存器
③ PORTINTEN:端口中断使能寄存器
共有 32 个 IO 中断,使用 IO 中断需使能相应的中断使能位。
④ PORTINTEDG:端口中断边沿选择寄存器
⑤ WKUPCON:唤醒控制寄存器
2、IO 中断处理函数
WKUPEDG & (BIT(6) << 16) 中,BIT(6) 代表第 6 组唤醒中断,当有 IO 中断产生时,此为硬件置 1。WKUPCPND 则是清除相应中断挂起位。
注意,数组 strisr0[]、strisr1[] 是把打印函数中的常量字符串放进 COM 区,com区程序常驻于RAM中, CPU可以迅速响应中断函数,否则中断处理函数调用 printf 函数则有可能导致重启。
3、IO 中断配置函数(以 GPIOE7 为例)
PORTINTEN |= BIT(20) 中为何与上 BIT(20)?因为 GPIOE7 对应的是 32 个端口中断的第 20 个;PORTINTEDG 同理;各个 IO 中断的位号可以按下图从右往左算:
sys_irq_init() 函数设置中断优先级,IRQ_PORT_VECTOR 代表设置的是端口中断。
4、IO 中断函数调用
注意,端口中断配置函数必须在 sys_set_tmr_enable() 函数前调用。
GPIO 介绍和 IO 中断示例就介绍到这里,希望可以在大家自定义 GPIO 功能和使用 IO 中断时帮助到大家。如有错误欢迎大家批评指正。如果大家还有什么其他的问题或者功能想要询问,亦可以在评论区中提出,可以共同探讨,一起进步。
共同关键字:中科蓝讯 SDK
中科蓝讯 SDK 开发——工程浅析
中科蓝讯 SDK 开发——耳机充电配置
中科蓝讯 SDK TWS 组队和蓝牙配对过程分析
中科蓝讯 SDK 开发——TWS 左右声道分配
中科蓝讯AB5607E蓝牙5.4 低成本蓝牙接近开关定时开关方案
AB137A中科蓝讯SOP16封装带插卡带U盘音箱语音识别IC MP3方案开发
中科蓝讯AB5607E蓝牙5.4 低成本带插卡带U盘音箱方案
中科蓝讯SDK 开发环境搭建安装及 Downloader 配置
参考文档:
1、中科蓝讯蓝皮书
2、BT892X DataSheet.pdf