STM32 的中断分为Cortex-M 内核中断(系统异常) 和STM32 片上外设中断------ 内核中断是 Cortex-M3/M4/M7 内核自带的通用异常,所有 STM32 该内核系列通用;外设中断是 STM32 片上外设(如 USART、ADC、TIM)对应的中断,不同系列(F1/F4/F7/H7)外设数量和中断通道略有差异,但核心常用外设中断一致。以下按 "内核中断(全系列通用)+ 常用外设中断(覆盖 M3/M4/M7 核心系列)" 分类,详细列出并说明:
一、Cortex-M3/M4/M7 内核中断(系统异常,全系列通用)
内核中断是 Cortex-M 内核固化的系统异常,优先级由内核默认分配(部分可配置),直接影响系统稳定性,与 FreeRTOS 关联紧密。按优先级从高到低排列:
| 中断名称 | 硬件来源 | 触发方式 | 核心作用 | FreeRTOS 关联要点 |
|---|---|---|---|---|
| NMI(不可屏蔽中断) | 内核内置不可屏蔽异常通道 | 硬件触发(如外部 NMI 引脚电平、内部故障) | 最高优先级中断,不可被屏蔽,用于处理致命故障(如电源掉电、硬件错误) | 无直接关联,但触发后会打断所有任务和其他中断,FreeRTOS 无法干预 |
| HardFault(硬故障) | 内核内置故障检测模块 | 硬件触发(如非法内存访问、总线错误) | 处理内核级致命故障,如数组越界、空指针访问、栈溢出(未开启栈检测时) | 任务执行错误(如非法 API 调用)可能触发,FreeRTOS 的configASSERT可辅助定位故障原因 |
| MemManage(内存管理故障) | 内核 MMU/MPU 模块 | 硬件触发(如 MPU 权限违规、非法内存访问) | 仅支持 MPU 的内核(M4/FPU、M7)有效,处理内存访问权限问题 | 若启用 MPU,任务访问非法内存会触发,FreeRTOS 需配合 MPU 配置任务内存权限 |
| BusFault(总线故障) | 内核总线接口模块 | 硬件触发(如外设访问超时、总线冲突) | 处理总线层面错误,如访问未初始化的外设寄存器、DMA 传输错误 | 外设中断配置错误(如地址错误)可能触发,需检查外设初始化顺序 |
| UsageFault(用法故障) | 内核指令执行模块 | 硬件触发(如未定义指令、除数为 0) | 处理指令执行错误,如使用 ARM 指令(STM32 仅支持 Thumb)、浮点指令未开启 FPU | FreeRTOS 中若启用 FPU 但未配置,任务执行浮点运算可能触发 |
| SVC(系统调用中断) | 内核系统调用接口 | 软件触发(svc指令) |
提供用户态到内核态的调用接口,用于特权操作(如任务创建、权限切换) | FreeRTOS 的vPortSVCHandler实现启动第一个任务,是 RTOS 启动的核心中断 |
| DebugMon(调试监控) | 内核调试模块 | 硬件触发(如调试器断点、单步执行) | 调试时使用,监控程序运行状态 | 调试 FreeRTOS 任务时触发,不影响 RTOS 正常运行,调试完成后自动恢复 |
| PendSV(任务切换中断) | 内核上下文切换模块 | 软件触发(写 NVIC 悬起寄存器) | 实现任务上下文切换,保存 / 恢复任务寄存器状态 | FreeRTOS 核心依赖,优先级设为最低(15),确保不打断外设中断和 SysTick |
| SysTick(系统滴答中断) | 内核内置定时器 | 硬件自动触发(按配置周期溢出) | 提供系统时基,触发任务调度、延时计时 | FreeRTOS 的xPortSysTickHandler实现时基更新和任务调度触发,周期由configTICK_RATE_HZ配置 |
内核中断关键说明:
- 优先级:NMI > HardFault > MemManage/BusFault/UsageFault > SVC > DebugMon > PendSV = SysTick(用户可配置部分优先级,但不建议修改);
- 除 PendSV 和 SysTick 外,其他内核中断均为 "故障处理类",触发后需排查硬件或代码错误,否则系统可能崩溃。
二、STM32 常用外设中断(覆盖 M3/M4/M7 核心系列)
外设中断是 STM32 片上外设(如 GPIO、USART、ADC)对应的中断,由外设硬件事件触发,优先级通过 NVIC 配置(用户代码中已配置 NVIC 组 4)。以下按 "功能分类" 列出常用外设中断,标注系列差异:
(一)GPIO 中断(按键、传感器输入常用)
| 中断名称 | 支持系列 | 触发方式 | 核心作用 |
|---|---|---|---|
| EXTI0~EXTI15(外部中断线) | 全系列 | 硬件触发(上升沿、下降沿、双边沿) | 对应 GPIO 引脚 0~15 的电平变化,如按键按下(下降沿)、传感器数据就绪(上升沿) |
| EXTI16(PVD 中断) | 全系列 | 硬件触发(电源电压阈值变化) | 监控电源电压,低于 / 高于阈值时触发,用于电源保护 |
| EXTI17(RTC 闹钟) | 全系列 | 硬件触发(RTC 闹钟时间到达) | RTC 定时触发,如定时采集数据、唤醒低功耗系统 |
| EXTI18(USB 唤醒) | F4/F7/H7 | 硬件触发(USB 设备连接 / 唤醒) | USB 相关唤醒功能,如 USB 插入时唤醒系统 |
(二)通信类外设中断(数据收发常用)
| 中断名称 | 支持系列 | 触发方式 | 核心作用 |
|---|---|---|---|
| USART1~USART8(串口中断) | 全系列(数量因型号而异) | 硬件触发(接收数据就绪、发送完成、错误) | 串口数据收发,如用户代码中 USART 中断接收传感器数据、发送调试信息 |
| UART4~UART5(通用串口) | F4/F7/H7 | 同上 | 额外的串口通道,用于多设备通信(如同时连接蓝牙、GPS) |
| SPI1~SPI6(SPI 中断) | 全系列(数量因型号而异) | 硬件触发(接收完成、发送完成、错误) | SPI 外设通信,如 OLED 屏显示、Flash 芯片读写、传感器数据采集 |
| I2C1~I2C4(I2C 中断) | 全系列(数量因型号而异) | 硬件触发(接收完成、发送完成、地址匹配) | I2C 外设通信,如温湿度传感器(DHT11/I2C 版)、EEPROM 存储 |
| CAN1~CAN2(CAN 中断) | F1/F4/F7/H7 | 硬件触发(接收完成、发送完成、错误) | CAN 总线通信,如汽车电子、工业控制设备通信 |
| ETH(以太网中断) | F4/F7/H7 | 硬件触发(接收数据、发送完成、链接状态变化) | 以太网数据收发,如网络通信、物联网数据上传 |
| USB OTG(USB 中断) | F4/F7/H7 | 硬件触发(USB 数据收发、设备枚举) | USB 设备 / 主机通信,如 USB 存储、USB 转串口 |
(三)定时器类中断(定时、PWM 常用)
| 中断名称 | 支持系列 | 触发方式 | 核心作用 |
|---|---|---|---|
| TIM1~TIM17(定时器中断) | 全系列(数量因型号而异) | 硬件触发(溢出、比较匹配、捕获) | 定时任务(如 10ms 采集一次数据)、PWM 输出(如电机控制)、脉冲捕获(如频率测量) |
| TIM1_TRG_COM(定时器触发 / 比较中断) | F1/F4/F7 | 硬件触发(触发事件、比较输出) | 定时器同步、互补 PWM 输出(如电机驱动) |
| RTC 中断(实时时钟) | 全系列 | 硬件触发(秒中断、闹钟、周期中断) | 低功耗定时、日期时间管理,如定时唤醒系统、日志时间戳 |
(四)模拟类外设中断(数据采集常用)
| 中断名称 | 支持系列 | 触发方式 | 核心作用 |
|---|---|---|---|
| ADC1~ADC3(ADC 中断) | 全系列(数量因型号而异) | 硬件触发(转换完成、注入转换完成、错误) | ADC 数据采集完成,如用户代码中 ADC 单通道中断读取传感器数据 |
| DAC 中断(数模转换) | F1/F4/F7/H7 | 硬件触发(转换完成) | DAC 输出同步,如波形生成、模拟信号输出 |
(五)DMA 类中断(高速数据传输常用)
| 中断名称 | 支持系列 | 触发方式 | 核心作用 |
|---|---|---|---|
| DMA1_Channel1~DMA1_Channel7 | 全系列(数量因型号而异) | 硬件触发(传输完成、半传输、错误) | 高速数据传输,如 ADC 采集数据直接存入内存、串口接收大数据块、SPI Flash 读写 |
| DMA2_Channel1~DMA2_Channel7 | F4/F7/H7 | 同上 | 额外的 DMA 通道,用于多设备同时高速传输 |
(六)其他常用外设中断
| 中断名称 | 支持系列 | 触发方式 | 核心作用 |
|---|---|---|---|
| SDIO(SD 卡中断) | F4/F7/H7 | 硬件触发(数据传输完成、错误) | SD 卡数据读写,如存储日志、读取配置文件 |
| CRC(CRC 校验中断) | F4/F7/H7 | 硬件触发(校验完成、错误) | 数据 CRC 校验,如通信数据完整性检查 |
| DMA2D(图形 DMA) | F4/F7/H7 | 硬件触发(图形传输完成) | 图形数据处理,如 LCD 屏显示刷新 |
外设中断关键说明:
- 系列差异:F1 系列外设较少(如无 DMA2D、ETH),F4/F7/H7 系列外设更丰富(支持更多串口、SPI、DMA 通道);
- 中断通道:同一外设可能对应多个中断(如 USART 有 "接收就绪""发送完成""错误" 中断),需通过
NVIC_InitStruct.NVIC_IRQChannel指定具体通道; - 优先级配置:用户代码中已配置 NVIC 组 4(4bit 抢占优先级),外设中断优先级建议设为 0~14(高于内核中断 15),实时性要求高的中断(如 ADC 采集)设为 0~5,普通中断(如串口调试)设为 6~14。
三、核心使用规则(结合用户代码与 FreeRTOS)
- 内核中断不可随意修改:除 SVC、PendSV、SysTick 外,其他内核中断为故障处理类,触发后需先排查硬件 / 代码错误;
- 外设中断配置流程:用户代码中需先初始化外设(如 ADC、USART),再配置 NVIC 中断通道、优先级,最后使能中断;
- FreeRTOS 协同要点:
- 外设中断服务函数中需用中断安全 API(如
xSemaphoreGiveFromISR),不可调用普通 API(如vTaskDelay); - 避免中断处理时间过长,核心逻辑(如数据处理)需交给 FreeRTOS 任务,中断仅做 "标记 / 通知";
- 外设中断服务函数中需用中断安全 API(如