RT1064学习笔记(4)--GPIO中断例程(GPIO Interrupt Demo)
RT1064之GPIO中断例程
Ps:本例程主要作用是,展示如何使用GPIO Interrupt以及GPIO中断的概念
主板为:逐飞RT1064 + 母板
一,GPIO中断简介(基于RT1052)
RT1052 拥有 5 组 GPIO,每组 GPIO 拥有 32 个 GPIO 输入输出引脚,每个输入输出引脚都能够触发中断。 RT1052 并没有为每个输入输出引脚分配一个中断号,而是为每组GPIO 分配两个中断编号,其中低 16 个输入输出引脚(GPIOx_n, x 取 1 到 5, n 取 0 到 15)共用一个中断编号,高 16 个输入输出引脚使用另外一个中断编号。
二,GPIO端口介绍
- <font size="3" face="微软雅黑">//gpio的中断函数名称为GPIO2_Combined_16_31_IRQHandler,定义在isr.c文件内
- //GPIO0表示A端口 RT没有这个端口
- //GPIO1表示B端口
- //GPIO2表示C端口 0_15表示C0-C15 IO口的中断响应都由这个中断函数管理 16_31表示C16-C31 IO口的中断响应都由这个中断函数管理
- //GPIO3表示D端口
- //GPIO4表示E端口 RT1064该端口全部IO被SDRAM占用
- //GPIO5表示F端口 RT仅有三个端口,但是功能特殊核心板并未引出
- </font>
复制代码 三,GPIO库函数介绍
1)gpio_init()函数使用
- <font size="3" face="微软雅黑">/-------------------------------------------------------------------------------------------------------------------
- // @brief GPIO初始化
- // @param pin 选择的引脚 (可选择范围由 common.h 内PIN_enum枚举值确定)
- // @param dir 引脚的方向 输出:GPO 输入:GPI
- // @param dat 引脚初始化时设置的电平状态,输出时有效 0:低电平 1:高电平
- // @param pinconf 引脚配置(可设置参数由zf_iomuxc.h文件内PINCONF_enum枚举值确定,多个条件使用 | 相或)
- // @return void
- // Sample usage: gpio_init(D0, GPO, 1, GPIO_PIN_CONFIG);//D0初始化为GPIO功能、输出模式、输出高电平、上拉47K IO速度100MHZ 驱动强度R0
- //-------------------------------------------------------------------------------------------------------------------
- void gpio_init(PIN_enum pin, GPIODIR_enum dir, uint8 dat, uint32 pinconf)
- </font>
复制代码 2)gpio_interrupt_init()函数
- <font size="3" face="微软雅黑">/-------------------------------------------------------------------------------------------------------------------
- // @brief GPIO 外部中断初始化
- // @param pin 选择的引脚 (可选择范围由 common.h 内PIN_enum枚举值确定)
- // @param trigger 中断触发方式 选择范围参见h文件TRIGGER_enum枚举
- // @param pinconf 引脚配置 (可设置参数由zf_iomuxc.h文件内PINCONF_enum枚举值确定,多个条件使用 | 相或)
- // @return void
- // Sample usage: gpio_interrupt_init(D0,RISING,GPIO_INT_CONFIG);//D0上升沿中断
- //-------------------------------------------------------------------------------------------------------------------
- void gpio_interrupt_init(PIN_enum pin, TRIGGER_enum trigger, uint32 pinconf)
- </font>
复制代码 3)设置中断优先级
- <font size="3" face="微软雅黑"> NVIC_SetPriority(GPIO2_Combined_16_31_IRQn,15);
- //设置中断优先级 范围0-15 越小优先级越高</font>
复制代码 4)gpio_toggle()设置优先级
- <font size="3" face="微软雅黑">//-------------------------------------------------------------------------------------------------------------------
- // @brief GPIO 翻转
- // @param pin 选择的引脚 (可选择范围由 common.h 内PIN_enum枚举值确定)
- // @return void
- // Sample usage: gpio_toggle(D0);//D0引脚电平翻转
- //-------------------------------------------------------------------------------------------------------------------
- void gpio_toggle(PIN_enum pin)
- {
- GPIO_PortToggle(PORTPTR[pin>>5],1<<(pin&0x1f));
- }
- </font>
复制代码 四,while(1)循环中代码
- <font size="3" face="微软雅黑"> while(1)
- {
- gpio_toggle(C17);//设置引脚电平为高电平
- systick_delay_ms(100);
-
- }</font>
复制代码 五,整体代码与运行结果展示
- <font size="3" face="微软雅黑">#include "headfile.h"
- uint8 gpio_status;
- int main(void)
- {
- DisableGlobalIRQ();
- board_init(); //务必保留,本函数用于初始化MPU 时钟 调试串口
-
-
- //初始化GPIO C17 为输出 默认输出低电平 使用默认引脚配置GPIO_PIN_CONFIG
- gpio_init(C17,GPO,0,GPIO_PIN_CONFIG);
-
- //初始化GPIO C16 中断模式 使用默认引脚配置GPIO_INT_CONFIG
- gpio_interrupt_init(C16,RISING,GPIO_INT_CONFIG);
- NVIC_SetPriority(GPIO2_Combined_16_31_IRQn,15); //设置中断优先级 范围0-15 越小优先级越高
-
- EnableGlobalIRQ(0);
-
-
- //将C16 C17使用杜邦线链接起来然后在线调试查看gpio_int_test变量
- //变量会持续增加
-
- //gpio的中断函数名称为GPIO2_Combined_16_31_IRQHandler,定义在isr.c文件内
- //GPIO0表示A端口 RT没有这个端口
- //GPIO1表示B端口
- //GPIO2表示C端口 0_15表示C0-C15 IO口的中断响应都由这个中断函数管理 16_31表示C16-C31 IO口的中断响应都由这个中断函数管理
- //GPIO3表示D端口
- //GPIO4表示E端口 RT1064该端口全部IO被SDRAM占用
- //GPIO5表示F端口 RT仅有三个端口,但是功能特殊核心板并未引出
-
- while(1)
- {
- gpio_toggle(C17);//设置引脚电平为高电平
- systick_delay_ms(100);
- }
- }
- </font>
复制代码 2) 将C16 C17使用杜邦线链接起来然后在线调试查看gpio_int_test变量,变量会持续增加
文章出处:CSDN
|