一、中断概述

中断是微控制器(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配置步骤

  1. 使能中断通道:NVIC_EnableIRQ(IRQn_Type IRQn)
  2. 设置中断优先级:NVIC_SetPriority(IRQn_Type IRQn, uint32_t priority)
  3. 清除中断挂起标志: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中断处理流程

  1. GPIO引脚产生边沿信号
  2. EXTI检测到边沿,设置挂起标志位
  3. EXTI向NVIC发送中断请求
  4. NVIC根据优先级决定是否响应
  5. CPU跳转到对应的中断服务程序
  6. 执行中断回调函数,在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的协同工作,为嵌入式系统提供了高效的事件响应机制。在实际项目中,需要根据具体需求合理设计中断优先级,并注意中断相关的调试。

Logo

智能硬件社区聚焦AI智能硬件技术生态,汇聚嵌入式AI、物联网硬件开发者,打造交流分享平台,同步全国赛事资讯、开展 OPC 核心人才招募,助力技术落地与开发者成长。

更多推荐