5.1 EXTI外部中断
一、中断基本概念
1.1 中断系统
中断:在主程序运行过程中,出现了特定的中断触发条件(中断源),使得CPU暂停当前正在运行的程序,转而去处理中断程序,处理完成后又返回原来被暂停的位置继续运行。
中断源:例如,外部中断中引脚的电平跳变、定时器的定时时间到达、串口通信中的数据接收等。
中断优先级:当有多个中断源同时申请中断时,CPU会根据中断源的轻重缓急进行裁决,优先响应更加紧急的中断源。
中断嵌套:当一个中断程序正在运行时,又有新的更高优先级的中断源申请中断,CPU再次暂停当前中断程序,转而去处理新的中断程序,处理完成后依次进行返回。
1.2 中断执行流程图
中断程序执行流程:主程序执行过程中,一旦外设中断条件满足,主程序正在进行的工作都必须立即暂停,程序由硬件电路自动跳转至中断程序。中断程序执行完毕后,返回被暂停的位置(断点)继续运行。

中断嵌套执行流程:正常中断程序执行时,若有更高优先级的中断到来,程序会再次跳转执行新的中断,新中断结束后继续执行原中断,原中断结束后再继续主程序。

C 语言程序中中断执行流程:在带有中断的程序中,主函数的 while 死循环内为主程序,正常情况下程序在主程序中不断循环执行。当中断条件满足,主程序暂停,自动跳转至中断程序运行,运行结束后返回主程序继续执行。一般中断程序位于子函数中,无需手动调用,中断发生时由硬件自动调用。

二、STM32 的中断系统
2.1 STM32中断系统简介:
STM32 具备 68 个可屏蔽中断通道(不同型号数量可能有差异,具体以对应型号数据手册为准),包含EXTI、TIM、ADC、USART、SPI、I2C、RTC等多个外设。
采用 NVIC(Nested Vectored Interrupt Controller,嵌套向量中断控制器)统一管理中断,每个中断通道都拥有16个可编程的优先等级,可对优先级进行分组,进一步设置抢占优先级和响应优先级。
2.2 STM32中断资源表:
相关信息
下图中灰色部分为内核中断,其余为外设中断

中断向量表:程序中的中断函数地址由编译器分配,并不固定,但由于硬件限制,中断跳转只能跳至固定地址执行程序。为实现硬件跳转到不固定的中断函数,在内存中定义中断向量表。中断发生时,先跳转到该固定位置,再由编译器添加跳转到中断函数的代码,从而实现中断跳转。
2.3 NVIC基本结构

STM32 中断数量众多,若全部连接到 CPU,会导致 CPU 引脚设计复杂,且中断同时申请或拥堵时 CPU 处理困难。NVIC 作为内核外设,是 CPU 的辅助工具,负责统一分配中断优先级和管理中断。
NVIC 拥有多个输入口,可连接各种中断线路(如 EXTI、TIM、ADC、USART 等),一个外设可能占用多个中断通道。
NVIC 仅有一个输出口,根据每个中断的优先级分配中断顺序,通过输出口告知 CPU 应处理的中断,CPU 无需了解中断顺序分配任务。
2.4 NVIC中断分组
NVIC的中断优先级由优先级寄存器的4位(0~15)决定,这4位可以进行切分,分为高n位的抢占优先级和低4-n位的响应优先级。
抢占优先级高的可以中断嵌套,响应优先级高的可以优先排队,抢占优先级和响应优先级均相同的按中断号排队。
| 分组方式 | 抢占优先级 | 响应优先级 |
|---|---|---|
| 分组0 | 0位,取值为0 | 4位,取值为0~15 |
| 分组1 | 1位,取值为0~1 | 3位,取值为0~7 |
| 分组2 | 2位,取值为0~3 | 2位,取值为0~3 |
| 分组3 | 3位,取值为0~7 | 1位,取值为0~1 |
| 分组4 | 4位,取值为0~15 | 0位,取值为0 |
三、EXTI 外部中断
3.1 EXTI简介
EXTI:External Interrupt,即外部中断。
工作流程:EXTI可以监测指定GPIO口的电平信号,当其指定的GPIO口产生电平变化时,EXTI将立即向NVIC发出中断申请,经过NVIC裁决后即可中断CPU主程序,使CPU执行EXTI对应的中断程序。
触发方式:上升沿/下降沿/双边沿/软件触发。
支持的GPIO口:所有GPIO口,但相同的Pin不能同时触发中断。如 PA0 和 PB0 不能同时触发中断。
通道数:16个GPIO_Pin,外加PVD输出、RTC闹钟、USB唤醒、以太网唤醒。
触发响应方式:中断响应/事件响应。
相关信息
- 中断响应是申请中断并让 CPU 执行中断函数。
- 事件响应是申请中断触发事件,此时外部中断信号不通向 CPU,而是通向其他外设,触发其他外设操作,如触发 ADC 转换、触发 DMA 等,属于外设间的协同工作。
3.2 EXTI基本结构

注意
需注意,因 ST 公司认为 20 个输出过多占用 NVIC 通道资源,将外部中断的 9 - 5 和 15 - 10 分配到一个通道,即外部中断的 9 - 5 和 15 - 10 分别触发同一个中断函数,编程时需在中断函数中依据标志位区分具体中断。
3.3 AFIO复用IO口

AFIO主要用于引脚复用功能的选择和重定义。
在STM32中,AFIO主要完成两个任务:复用功能引脚重映射、中断引脚选择。
3.4 EXTI框图

EXTI 右侧为 20 根输入线,首先进入边缘检测电路和软件中断事件寄存器构成的或门,可选择上升沿/下降沿/双边沿/软件触发。
触发信号通过或门后分为两路:
- 上一路触发中断,首先设置挂起寄存器(相当于中断标志位,可读取判断是哪个通道触发的中断),若中断挂起寄存器置 1,通过和中断屏蔽寄存器构成的与门,最后到达 NVIC 中断控制器。
- 下一路触发事件,首先通过事件屏蔽寄存器进行开关控制,最后通过脉冲发生器连接到其他外设,脉冲发生器产生电平脉冲触发其他外设动作。
四、旋转编码器
4.1 旋转编码器简介
旋转编码器:用来测量位置、速度或旋转方向的装置,当其旋转轴旋转时,其输出端可以输出与旋转速度和方向对应的方波信号,读取方波信号的频率和相位信息即可得知旋转轴的速度和方向。
类型:机械触点式/霍尔传感器式/光栅式。
机械触点式编码器:其内部通过金属触点通断工作。中间圆金属片为按键。编码盘是一系列金属触点,旋转时依次接通和断开两边触点,且金属盘位置经过设计,使两侧触点通断产生 90 度相位差,最终配合外部电路,编码器的两个输出会输出正交波形。正转时,A 相引脚输出方波信号,B 相引脚输出滞后 90 度的波形;反转时,B 相引脚输出提前 90 度的波形,以此区分正转和反转。

霍尔传感器式编码器:直接附在电机后面的编码器为霍尔传感器形式,中间是圆形磁铁,边上有两个位置错开的霍尔传感器,磁铁旋转时,通过霍尔传感器输出正交的方波信号,可用于测速和测方向。

- 光栅式编码器:采用对射式红外传感器和光栅编码盘,编码盘转动时,红外传感器的红外光出现遮挡和透过现象,对应模块输出高低电平交替的方波,方波个数代表转过角度,频率代表转速,可用外部中断捕获方波边缘判断位置和速度,但该模块只有一路输出,无法区分正转和反转的输出波形,不能测量旋转方向。

4.2 旋转编码器硬件电路
模块电路图:

上方按键两根线悬空未用,下方是编码器内部两个触点,旋转轴旋转时,两个触点以 90 度相位差交替导通。电路图左右对称,以左侧电路为例,首先连接一个 10k 的上拉电阻,默认未旋转时,输出到 A 端口为高电平,旋转时触点导通,端口被拉低到地,输出到 A 端口为低电平,其中 R3 为限流电阻防止模块引脚电流过大,C1 为滤波电容防止输出信号抖动。
接线方法:

VCC 连接电源,A 相输出和 B 相输出连接到 STM32 的两个引脚(注意引脚的Pin不能相同),C 引脚暂不使用。
