STM32 异步事件处理:中断、NVIC 与 EXTI 深度全书
引言为什么我们需要中断在进入技术细节前让我们先思考一个生活场景如果你正在厨房煮粥需要 20 分钟才能熟。为了不让粥糊掉你会一直站在锅边盯着看轮询还是回客厅看书等锅里的定时器响了中断再去关火我当然会去客厅看书否则那 20 分钟我什么也干不了。没错。那么对于主频几十兆赫兹的 CPU 来说如果它每一秒钟都要花 90% 的时间去检测一个按键是否按下这难道不是一种巨大的计算资源浪费吗这就是**中断Interrupt**存在的意义让 CPU 从无意义的等待中解脱出来实现“平行的效率”。第一部分核心灵魂——中断系统基础理论1.1 中断的本质上下文切换当中断发生时CPU 必须立即停止当前的流水线。但这里有一个关键问题如果你书读到一半去关火回来时如何精准地找到刚才读到的那一页、那一行我会用书签标记一下。在 STM32 中这个“书签”就是现场保护。CPU 会自动将当前的程序计数器PC、状态寄存器等压入堆栈。处理完中断后再通过“现场恢复”回到断点。图 1中断触发、嵌套与返回的逻辑路径。注意断点是程序恢复运行的唯一凭证。1.2 中断向量表指令的“导航图”CPU 怎么知道中断发生后该去哪里执行代码在内存的固定位置有一张表格记录了所有中断服务程序ISR的入口地址这就是中断向量表。第二部分中央司令部——NVIC 嵌套向量中断控制器如果说外设按键、定时器、串口是士兵那么NVIC就是负责调度的将军。2.1 为什么必须经过 NVIC如果厨房的锅响了同时门口有人按门铃你该先处理哪一个如果这时候你的电话也响了呢我需要根据事情的紧急程度排个序。这就是 NVIC 的核心职能优先级裁决。图 2NVIC 架构。它位于内核内部是所有外设中断通往 CPU 的必经之路。2.2 优先级的双重奏抢占与响应STM32 将优先级分成了两个维度这是初学者最容易混淆的地方抢占优先级Preemption Priority核心能力“打断权”。如果 A 的抢占优先级高于 BA 可以直接掐断正在运行的 B这就是中断嵌套。响应优先级Subpriority核心能力“排队权”。如果 A 和 B 的抢占优先级相同且同时发生谁的响应优先级高谁先执行。但它不能打断正在运行的同级抢占中断。想象你在排队。抢占优先级高的人可以直接冲到柜台前把正在办事的人推开而响应优先级高的人只能在大家都排队时站在更靠前的位置。你能理解这两者的区别吗第三部分核心重难点——EXTI 外部中断EXTIExternal Interrupt是初学者最先接触的硬件中断它负责将 GPIO 的电平变化转变为中断信号。3.1 硬件架构与映射逻辑STM32 有上百个引脚但 NVIC 的通道是有限的。为了解决这个矛盾工程师设计了引脚映射。图 3EXTI 结构图。展示了从 GPIO 到 AFIO 选择器再到 EXTI 通道最后进入 NVIC 的全过程。关键点解构16 条线EXTI0 到 EXTI15 对应引脚的编号。映射机制PA0, PB0, PC0... 全部连接在 EXTI0 上。苏格拉底式提问“如果 PA0 和 PB0 同时想当外部中断源可以吗”答案不可以。通过 AFIO 选通器每一条 EXTI 线在同一时刻只能选择一个端口的引脚。3.2 触发方式的科学选择上升沿Rising低电平变高。适合检测“开启”动作。下降沿Falling高电平变低。常用于按键按下通常为低。双边沿Both只要变了就触发。适合检测信号的翻转。第四部分次重点——定时器中断TIM如果说 EXTI 是“被动响应”那么定时器中断就是“主动出击”。4.1 更新中断Update Interrupt这是最常用的定时器功能。基于时钟源的计数器溢出时产生中断。如果你需要每秒钟精确地测量一次温度是用 EXTI 还是 TIMTIM。因为 EXTI 取决于外部信号而 TIM 取决于内部稳定的晶振。4.2 核心参数计算初学者必须掌握的公式以72MHz主频为例Prescaler预分频把频率降下来。Period计数值数多少个数触发一次。第五部分其他常用中断巡礼串口中断UART/USARTRXNE接收非空对方发来消息了快去读。IDLE空闲中断一帧数据发完了适合配合 DMA 使用。ADC 中断EOC转换结束模拟量转数字量完成了可以取值了。SysTick系统滴答内核自带的定时器专门用于给操作系统如 FreeRTOS提供时基或实现精准的Delay。第六部分实战进阶——如何写出高质量的中断代码6.1 标志位的“生死时速”在中断服务程序ISR中你必须做的第一件事或最后一件事通常是清除中断标志位Pending Bit。如果闹钟响了你不去按下“停止”键它会发生什么它会一直响或者等一会儿又响。硬件也是如此。如果你不清除标志位CPU 刚退出中断就会发现标志位还在于是立刻又跳回中断导致主程序永远无法执行。所以遇到中断卡死先检查标志位清了没6.2 ISR 编写的三大禁令禁耗时操作不要放printf或大循环。禁长延时绝对不要在中断里用Delay()。禁复杂运算尽量只做状态转换或标志位修改。结语思维导图式总结中断管理交给NVIC分清抢占与响应优先级。外部信号交给EXTI记住 16 条线的映射互斥原则。时间任务交给TIM计算好频率与周期。执行原则保护现场 - 处理逻辑 -清除标志- 恢复现场。现在你已经理解了中断。如果一个系统中所有任务都放在中断里执行而主程序只有一个while(1)空循环这和轮询又有什么本质区别呢笔记说明本文素材来源于b站up江协科技希望这份笔记能帮你攻克 STM32 开发中最关键的一环。