EXTI中断程序编写总结
- EXTI中断主要涉及到AFIO、EXTI、NVIC以及GPIO这几个寄存器
EXTI中断的具体编写步骤:
- 先初始化与EXTI中断相关的GPIO寄存器,即欲将哪个GPIO端口设置为中断响应
- 初始化EXTI寄存器,用于中断或者事件的产生。
- 先绑定输入线,即控制AFIO寄存器
- 初始化EXTI结构体,即配置EXTI寄存器的相关参数
- 初始化NVIC,用于处理中断(主要用来设置中断优先级)
- 编写中断服务函数(相关函数名称需要对应,可以在启动文件中初始化中断向量表中找到相应函数名)
- 编写main中的调用初始化逻辑
- 6.
具体程序示例如下:
void Key_EXTI_config(void)
{
GPIO_InitTypeDef key1_gpio_initStruct, key2_gpio_initStruct;
EXTI_InitTypeDef key1_exti_initStruct, key2_exti_initStruct;
NVIC_InitTypeDef key1_nvic_initstruct, key2_nvic_initstruct;
key2_gpio_initStruct.GPIO_Pin = KEY2_GPIO_PIN;
key2_gpio_initStruct.GPIO_Mode = GPIO_Mode_IN_FLOATING;
key1_gpio_initStruct.GPIO_Pin = KEY1_GPIO_PIN;
key1_gpio_initStruct.GPIO_Mode = GPIO_Mode_IN_FLOATING;
RCC_APB2PeriphClockCmd(KEY2_GPIO_CLK, ENABLE);
GPIO_Init(KEY2_GPIO_PORT, &key2_gpio_initStruct);
RCC_APB2PeriphClockCmd(KEY1_GPIO_CLK, ENABLE);
GPIO_Init(KEY1_GPIO_PORT, &key1_gpio_initStruct);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);
GPIO_EXTILineConfig(KEY1_portSource, KEY1_PinSource);
GPIO_EXTILineConfig(KEY2_portSource, KEY2_PinSource);
key1_exti_initStruct.EXTI_Line = KEY1_exti_line;
key1_exti_initStruct.EXTI_LineCmd = ENABLE;
key1_exti_initStruct.EXTI_Mode = EXTI_Mode_Interrupt;
key1_exti_initStruct.EXTI_Trigger = EXTI_Trigger_Rising;
key2_exti_initStruct.EXTI_Line = KEY2_exti_line;
key2_exti_initStruct.EXTI_LineCmd = ENABLE;
key2_exti_initStruct.EXTI_Mode = EXTI_Mode_Interrupt;
key2_exti_initStruct.EXTI_Trigger = EXTI_Trigger_Rising;
EXTI_Init(&key1_exti_initStruct);
EXTI_Init(&key2_exti_initStruct);
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);
key1_nvic_initstruct.NVIC_IRQChannel = EXTI0_IRQn;
key1_nvic_initstruct.NVIC_IRQChannelCmd = ENABLE;
key1_nvic_initstruct.NVIC_IRQChannelPreemptionPriority = 1;
key1_nvic_initstruct.NVIC_IRQChannelSubPriority = 1;
key2_nvic_initstruct.NVIC_IRQChannel = EXTI15_10_IRQn;
key2_nvic_initstruct.NVIC_IRQChannelCmd = ENABLE;
key2_nvic_initstruct.NVIC_IRQChannelPreemptionPriority = 1;
key2_nvic_initstruct.NVIC_IRQChannelSubPriority = 1;
NVIC_Init(&key1_nvic_initstruct);
NVIC_Init(&key2_nvic_initstruct);
}
void EXTI0_IRQHandler(void)
{
if (EXTI_GetITStatus(KEY1_exti_line))
{
LED_R(OFF);
LED_G(ON);
}
EXTI_ClearITPendingBit(KEY1_exti_line);
}
void EXTI15_10_IRQHandler(void)
{
if (EXTI_GetITStatus(KEY2_exti_line))
{
LED_G(OFF);
LED_R(ON);
}
EXTI_ClearITPendingBit(KEY2_exti_line);
}