引言:中断——嵌入式系统的“实时响应”灵魂
在嵌入式系统中,中断是实现实时响应、多任务并发和低功耗的核心机制。STM32基于ARM Cortex-M3内核,拥有一套成熟且强大的中断管理系统。理解这套系统,是编写稳定、高效嵌入式程序的关键。
本文将从中断来源分类切入,逐步深入到中断向量表的组织、NVIC控制器的寄存器级原理、优先级分组的精细配置,最后总结出中断编程的标准化四步流程。
第一部分:中断来源与向量表
B1. 异常类型:系统异常与外部中断
STM32的中断并非单一类型,而是分为内核级与外设级两大类。
1. 系统异常(System Exceptions)—— 内核“内部”的紧急事件
系统异常是由Cortex-M3内核内部产生的事件,与芯片外设无关。它们反映了CPU核心自身的状态或调试需求。
来源:内核外设(如SysTick、SCB)以及内核运行时的故障(如访问非对齐地址、执行未定义指令)。
特点:
由内核直接管理
中断号较小(编号1~15)
优先级分组与外部中断共享,但部分异常有固定优先级(如Reset、NMI)
常见的系统异常:
| 异常名称 | 异常编号 | 优先级(数值越小越高) | 说明 |
|---|---|---|---|
| Reset | 1 | -3(固定最高) | 系统上电或复位后最先执行 |
| NMI | 2 | -2 | 不可屏蔽中断,用于电源、时钟等关键错误 |
| HardFault | 3 | -1(可编程) | 处理其他故障未使能时的统一入口 |
| SVCall | 11 | 可编程 | 由SVC指令触发,常用于操作系统上下文切换 |
| SysTick | 15 | 可编程 | 内核SysTick定时器触发,RTOS心跳的典型选择 |
辨析:系统异常虽然常被称为“异常”,但在Cortex-M3中,“异常”与“中断”是同一个概念——即所有打断主程序的事件统称为异常。本章中“系统异常”与“外部中断”只是为了区分来源,并不代表中断机制不同。
2. 外部中断(External Interrupts)—— 外设“外部”的请求
外部中断是由STM32芯片上的各种外设(GPIO、定时器、USART等)产生的中断请求。这些外设通过自身事件向NVIC发送中断信号。
特点:
外设级,每个外设内部可能包含多个中断请求
中断号范围较大(CM3中从16开始,STM32F1系列最多60个)
可独立使能/挂起/清除,优先级可配置
常见外部中断来源:
| 外设 | 常见中断事件 |
|---|---|
| EXTI | GPIO引脚上升沿、下降沿或双边沿检测 |
| TIM | 更新中断(溢出)、捕获/比较中断 |
| USART | 接收缓冲区非空(RXNE)、发送缓冲区空(TXE)、空闲帧检测 |
| SPI/I2C | 传输完成、接收缓冲区非空、错误 |