RT1052之GPIO中断
1、RT1052的中断系统
2、GPIO外设中断
GPIO可以因四种情况产生中断,分别是:
- 检测到低电平
- 检测到高电平
- 检测到上升沿
- 检测到下降沿
由GPIOx_ICRn寄存器配置。
3、中断的初始化流程
-
通过GPIOx_ICRn寄存器配置GPIO外设的中断触发源(上升沿触发还是下降沿触发……)
-
通过GPIOx_IMR寄存器使能GPIO外设的中断信号(当检测到第4步选择的信号后,就发出一个信号给NVIC,在由NVIC转交内核)
以上是配置GPIO外设的中断请求(在此之前,要先配置IO口电气属性和复用属性)
以下三步都是对内核的NVIC进行配置
-
配置RT1052的中断优先级分组
-
配置GPIO外设中断源优先级
-
使能GPIO外设中断源
4、代码实例
/* gpio及其中断初始化函数 */
void rt1052_gpio_interrupt_init(void)
{
/* 配置IO口电气属性和复用属性(将IO口连接到GPIO外设) */
IOMUXC_SetPinMux(IOMUXC_GPIO_AD_B0_05_GPIO1_IO05, 0U);
IOMUXC_SetPinConfig(IOMUXC_GPIO_AD_B0_05_GPIO1_IO05,
SRE_0_SLOW_SLEW_RATE|
DSE_0_OUTPUT_DRIVER_DISABLED|
SPEED_2_MEDIUM_100MHz|
ODE_0_OPEN_DRAIN_DISABLED|
PKE_1_PULL_KEEPER_ENABLED|
PUE_1_PULL_SELECTED|
PUS_3_22K_OHM_PULL_UP|
HYS_1_HYSTERESIS_ENABLED));
/* 配置GPIO外设的中断请求 */
gpio_pin_config_t key_config;
key_config.direction = kGPIO_DigitalInput; //输入模式
key_config.outputLogic = 1; //默认高电平(输入模式时无效)
key_config.interruptMode = kGPIO_IntLowLevel; //低电平触发中断
GPIO_PinInit(CORE_BOARD_MODE_KEY_GPIO, CORE_BOARD_MODE_KEY_GPIO_PIN, &key_config);
GPIO_PortEnableInterrupts(GPIO1, 1U << 5U);
/* 对NVIC进行配置 */
set_IRQn_Priority(GPIO1_Combined_0_15_IRQn,Group4_PreemptPriority_6, Group4_SubPriority_1);
EnableIRQ(GPIO1_Combined_0_15_IRQn);
/* 至此,GPIO中断配置全部完成,当有低电平来到之后,就会触发中断,
也就是进入函数 GPIO1_Combined_0_15_IRQHandle()*/
}
/* 中断服务函数 */
void GPIO1_Combined_0_15_IRQHandle(void)
{
/* 清除中断标志位 */
GPIO_PortClearInterruptFlags(GPIO1,
1U << 5U);
/* 设置按键中断标志 */
g_KeyDown[CORE_BOARD_MODE_KEY_ID] = true;
}
5、参考资料
1、[野火]《i.MX RT库开发实战指南》.pdf
2、IMXRT1052RM.pdf