STM32中断系统详解:NVIC与EXTI原理与实践
·
一、中断概述
中断是微控制器(MCU)响应外部或内部事件的一种机制。当某个事件发生时,它会打断CPU当前正在执行的程序,转而去执行一个特定的函数(中断服务程序,ISR),处理完该事件后再返回原程序继续执行。STM32的中断系统非常强大,能够高效处理多种异步事件。
二、嵌套向量中断控制器(NVIC)
NVIC是ARM Cortex-M内核的一部分,负责管理所有中断的优先级和响应。它是STM32中断系统的核心。
2.1 中断优先级
STM32使用4位优先级分组,可分为:
- 抢占优先级:高抢占优先级的中断可以打断低抢占优先级的中断。
- 响应优先级:当抢占优先级相同时,响应优先级高的先执行,但不能互相打断。
综上优先级的原则是:
- 抢占优先级说了算,抢占优先级高的,先执行,可以任意打断低优先级的执行过程。
- 抢占优先级相同时,再比较响应优先级,响应优先级高的先执行,但不可打断其他优先级的执行。
- 抢占和响应优先级都相同时,比较自然优先级,高的先执行。
- 比较的原则是数值小的,等级高,优先级越靠前。
优先级分组通过SCB->AIRCR寄存器的PRIGROUP位设置,常见的分组方式有:
// 设置优先级分组为组2:2位抢占优先级,2位响应优先级
NVIC_SetPriorityGrouping(2);
2.2 NVIC的工作原理

2.3 NVIC配置步骤
- 使能中断通道:
NVIC_EnableIRQ(IRQn_Type IRQn) - 设置中断优先级:
NVIC_SetPriority(IRQn_Type IRQn, uint32_t priority) - 清除中断挂起标志:
NVIC_ClearPendingIRQ(IRQn_Type IRQn)
三、外部中断/事件控制器(EXTI)
EXTI负责管理GPIO引脚的外部中断和事件。它能够检测GPIO引脚上的边沿信号(上升沿、下降沿或双边沿),并产生中断请求或事件。
3.1 EXTI主要特性
- 支持多达23条中断/事件线:线0~15对应GPIO引脚,线16~22对应特定外设事件。常用的一般是0~15的对应的GPIO的引脚来使用。
- 可配置触发方式:上升沿触发、下降沿触发、双边沿触发。
- 软件中断/事件:可以通过软件触发中断或事件。
- 中断与事件分离:中断会进入NVIC,事件直接触发外设而不经过CPU。
注:中断和事件的区别:
- 中断:要进入NVIC,执行相应的中断函数,需要CPU的处理。
- 事件:不需NVIC,仅用内部的硬件自动控制,比如:TIM/DMA/ADC。
3.2 EXTI线映射
EXTI线0~15可以映射到任意具有相同编号的GPIO引脚。例如,EXTI线0可以连接到PA0、PB0、PC0等引脚,数字对应相同,且需要配置使用的通道口,但同一时刻只能连接到一个引脚。
// 将PA0连接到EXTI线0
__HAL_RCC_GPIOA_CLK_ENABLE();
GPIO_InitTypeDef GPIO_InitStruct = {0};
GPIO_InitStruct.Pin = GPIO_PIN_0;
GPIO_InitStruct.Mode = GPIO_MODE_IT_RISING; // 上升沿中断
GPIO_InitStruct.Pull = GPIO_NOPULL;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
// 配置EXTI线0
HAL_NVIC_SetPriority(EXTI0_IRQn, 0, 0);
HAL_NVIC_EnableIRQ(EXTI0_IRQn);
3.3 EXTI的工作原理

3.4 EXTI中断处理流程
- GPIO引脚产生边沿信号
- EXTI检测到边沿,设置挂起标志位
- EXTI向NVIC发送中断请求
- NVIC根据优先级决定是否响应
- CPU跳转到对应的中断服务程序
- 执行中断回调函数,在ISR中清除EXTI挂起标志
四、中断嵌套与优先级管理
合理设置中断优先级对于系统稳定性至关重要。
4.1 优先级设置原则
- 实时性要求高的中断设置高优先级:如电机控制、通信接收等。
- 系统关键中断设置高优先级:如看门狗、电源管理等。
- 避免优先级反转:高优先级任务不应长时间等待低优先级任务释放资源。
- 合理使用中断屏蔽:在关键代码段可以暂时屏蔽中断。
4.2 中断嵌套示例
// 设置EXTI0为高优先级(抢占优先级0)
NVIC_SetPriority(EXTI0_IRQn, 0);
// 设置USART1为低优先级(抢占优先级1)
NVIC_SetPriority(USART1_IRQn, 1);
// 当USART1中断正在执行时,EXTI0中断可以打断它
// 处理完EXTI0后,返回继续执行USART1中断
五、常见问题与调试技巧
5.1 常见问题
- 中断不触发:检查GPIO模式、EXTI配置、NVIC使能、中断标志清除。
- 重复进入中断:忘记清除中断标志位。
- 中断优先级无效:优先级分组设置错误。
5.2 调试技巧
- 通过GPIO翻转测量中断响应时间
- 使用调试器查看NVIC和EXTI寄存器状态
六、总结
STM32的中断系统通过NVIC和EXTI的协同工作,为嵌入式系统提供了高效的事件响应机制。在实际项目中,需要根据具体需求合理设计中断优先级,并注意中断相关的调试。
更多推荐

所有评论(0)