1. STM32中断系统概述
中断是嵌入式系统中实现实时响应的核心机制。在STM32微控制器中,中断系统允许处理器在执行主程序时,能够及时响应外部或内部事件。当特定事件发生时,处理器会暂停当前任务,转去执行中断服务程序(ISR),处理完后再返回原任务继续执行。
STM32的中断系统由嵌套向量中断控制器(NVIC)管理,它支持多达240个中断源(具体数量取决于型号),包括外部中断、定时器中断、通信接口中断等。NVIC采用优先级分组机制,允许灵活配置中断的抢占优先级和子优先级,确保关键中断能够及时得到响应。
提示:初学者常犯的错误是低估中断优先级配置的重要性。不合理的优先级设置可能导致中断嵌套混乱或关键事件响应延迟。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. STM32中断工作原理详解
2.1 中断触发条件与类型
STM32的中断触发条件主要分为三类:
- 外部中断:通过GPIO引脚触发,可配置为上升沿、下降沿或双边沿触发
- 内部外设中断:定时器溢出、ADC转换完成、USART接收数据等
- 软件中断:通过软件指令触发的中断
以外部中断为例,STM32的EXTI(外部中断/事件控制器)模块管理着16个可配置的中断线。这些中断线可以映射到不同的GPIO引脚,但需要注意同一时刻一个中断线只能映射到一个引脚。
2.2 中断处理流程
当中断发生时,STM32的处理流程如下:
- 当前指令执行完成后,处理器检测到中断请求
- 自动保存当前程序计数器(PC)和程序状态寄存器(xPSR)到堆栈
- 根据中断向量表跳转到对应的中断服务程序
- 执行中断服务程序中的用户代码
- 中断返回,恢复之前保存的上下文
c复制// 典型的中断服务程序示例
void EXTI0_IRQHandler(void) {
if(EXTI_GetITStatus(EXTI_Line0) != RESET) {
// 用户处理代码
EXTI_ClearITPendingBit(EXTI_Line0); // 必须清除中断标志
}
}
2.3 中断优先级机制
STM32采用4位优先级配置,可分为抢占优先级和子优先级:
- 抢占优先级:高优先级中断可以打断低优先级中断的执行
- 子优先级:当多个中断同时挂起时,决定它们的执行顺序
优先级分组通过NVIC_PriorityGroupConfig()函数设置,常见配置方式:
c复制NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); // 2位抢占优先级,2位子优先级
3. STM32中断配置实战
3.1 外部中断配置步骤
以配置PA0引脚的外部中断为例:
- 启用GPIO时钟和AFIO时钟:
c复制RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_AFIO, ENABLE);
- 配置GPIO为输入模式:
c复制GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; // 上拉输入
GPIO_Init(GPIOA, &GPIO_InitStructure);
- 配置外部中断线:
c复制GPIO_EXTILineConfig(GPIO_PortSourceGPI
