在STM32微控制器编程中,中断是实现实时响应和多任务处理的关键技术。本文将详细介绍如何配置STM32的外部中断(EXTI)和编写中断服务例程(ISR)。
一、外部中断(EXTI)概述
STM32的外部中断/事件控制器(EXTI)管理20个外部中断线和事件线。每个中断线可以配置为响应上升沿、下降沿或双边沿触发。
二、NVIC配置
NVIC(Nested Vectored Interrupt Controller)是STM32的中断控制器,负责管理中断请求、优先级和中断向量。配置NVIC的步骤如下:
-
设置中断优先级分组:
cNVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
这行代码设置了NVIC的优先级分组,决定了抢占优先级和子优先级的位数分配。
-
设置中断通道的优先级:
cNVIC_InitTypeDef NVIC_InitStructure; NVIC_InitStructure.NVIC_IRQChannel = EXTI9_5_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x0F; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x0F; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure);
这段代码初始化了NVIC,设置了中断线的抢占优先级和子优先级,并使能了中断线。
三、外部中断(EXTI)配置
配置外部中断的步骤如下:
-
使能GPIO时钟:
c__HAL_RCC_GPIOA_CLK_ENABLE();
-
配置GPIO为输入模式:
cGPIO_InitTypeDef GPIO_InitStruct; GPIO_InitStruct.Pin = GPIO_PIN_0; GPIO_InitStruct.Mode = GPIO_MODE_IT_FALLING; GPIO_InitStruct.Pull = GPIO_NOPULL; HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
-
连接EXTI线到GPIO:
cSYSCFG_EXTILineConfig(EXTI_PortSourceGPIOA, EXTI_PinSource0);
-
初始化EXTI线:
cEXTI_InitTypeDef EXTI_InitStruct; EXTI_InitStruct.Line = EXTI_Line0; EXTI_InitStruct.Mode = EXTI_Mode_Interrupt; EXTI_InitStruct.Trigger = EXTI_Trigger_Falling; EXTI_InitStruct.LineCmd = ENABLE; HAL_EXTI_Init(&EXTI_InitStruct);
四、编写中断服务例程(ISR)
每个外部中断线都需要一个对应的中断服务例程。以下是EXTI0的中断服务例程示例:
c
void EXTI0_IRQHandler(void)
{
if(__HAL_GPIO_EXTI_GET_IT(GPIO_PIN_0) != RESET)
{
__HAL_GPIO_EXTI_CLEAR_IT(GPIO_PIN_0);
// 执行中断处理逻辑
}
}
在这个例程中,我们首先检查是否是GPIO_PIN_0触发了中断,如果是,则清除中断标志位,并执行相应的处理逻辑。
五、总结
通过上述步骤,我们可以配置STM32的外部中断和编写中断服务例程。正确配置NVIC和EXTI对于确保系统的实时响应和稳定性至关重要。在实际应用中,开发者应根据具体需求合理配置中断优先级,以实现高效的中断处理。
✅作者简介:热爱科研的嵌入式开发者,修心和技术同步精进
❤欢迎关注我的知乎:对error视而不见
代码获取、问题探讨及文章转载可私信。
☁ 愿你的生命中有够多的云翳,来造就一个美丽的黄昏。
🍎获取更多嵌入式资料可点击链接进群领取,谢谢支持!👇