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端口介绍
//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仅有三个端口,但是功能特殊核心板并未引出
二,GPIO库函数介绍
1)gpio_init()函数使用
/-------------------------------------------------------------------------------------------------------------------
// @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)
2)gpio_interrupt_init()函数
//-------------------------------------------------------------------------------------------------------------------
// @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)
3)设置中断优先级
NVIC_SetPriority(GPIO2_Combined_16_31_IRQn,15);
//设置中断优先级 范围0-15 越小优先级越高
4)gpio_toggle()设置优先级
//-------------------------------------------------------------------------------------------------------------------
// @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));
}
三,while(1)循环中代码
while(1)
{
gpio_toggle(C17);//设置引脚电平为高电平
systick_delay_ms(100);
}
四,整体代码与运行结果展示
#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);
}
}
2) 将C16 C17使用杜邦线链接起来然后在线调试查看gpio_int_test变量,变量会持续增加