目录
STM32中断
NVIC 中断控制器
NVIC优先级分组
EXTI 外部中断
AFIO 复用IO口
外部中断/事件控制器(EXTI)框图
STM32中断
在STM32微控制器中,共有68个可屏蔽中断通道,涵盖了多个外设,如外部中断(EXTI)、定时器(TIM)、模拟数字转换器(ADC)、串行外设接口(USART)、串行外设接口(SPI)、I²C总线、实时时钟(RTC)等。
这些中断通道的管理由嵌套向量中断控制器(NVIC)负责。NVIC提供了统一的中断管理机制,允许对每个中断通道设置16个可编程优先级。这些优先级可以通过分组进行配置,用户可以设定中断的抢占优先级和响应优先级,从而实现对中断的精细化控制。这种机制有助于在复杂系统中合理地调度中断,确保实时性和系统响应性。
NVIC 中断控制器
NVIC(Nested Vectored Interrupt Controller)嵌套向量中断控制器,是 Cortex-M 内核中的一部分,用于管理中断的触发、优先级排序和 CPU 响应。
简而言之:
NVIC 是 STM32 中用来 统一管理各个中断事件 的模块,决定了“谁能打断 CPU”、“什么时候打断”、“打断完谁先执行”。
NVIC 的核心功能
功能 | 说明 |
---|---|
中断使能/屏蔽 | 可以启用或关闭某个中断源 |
中断优先级管理 | 每个中断可以分配优先级(0~15) |
中断响应控制 | 控制 CPU 响应中断的方式 |
中断挂起清除 | 手动触发/清除挂起中断 |
中断源外设
包括:
EXTI:外部中断(如按键触发)
TIM:定时器(溢出中断、PWM更新中断)
ADC:模数转换完成中断
USART:串口接收/发送完成中断
这些外设都可以产生中断信号。
黑色 “n” 路线:中断请求线
每个外设可能有多个中断类型(如 TIM1 有更新中断、比较中断等),这些中断通过中断请求线发给 NVIC。
NVIC 模块
NVIC 收到多个中断请求后:
根据中断源设置的优先级
决定哪个中断先被 CPU 响应处理
若一个中断发生时有更高级的中断,也可以实现嵌套中断
NVIC 的优先级从 0(最高)~15(最低)。图中绿色框优先级0~优先级15 表示优先级调度队列。
橙色区域:STM32 内核(CPU核心 + NVIC)
NVIC 是属于 Cortex-M 内核的一部分,图中 NVIC 模块包裹在内核块中,最终中断是由 CPU 执行对应的中断服务函数(ISR)
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 外部中断
EXTI(External Interrupt)外部中断 是STM32微控制器中用于监测外部信号并触发中断的一种机制。EXTI模块能够监测指定GPIO引脚的电平信号变化,并在GPIO引脚发生电平变化时立即向NVIC发出中断请求。当NVIC接收到该请求后,会根据中断优先级的设置决定是否中断当前的CPU主程序,并执行与该中断关联的中断服务程序。
EXTI的主要特点:
支持的触发方式:
上升沿触发: 当GPIO引脚的电平从低电平变为高电平时触发中断。
下降沿触发: 当GPIO引脚的电平从高电平变为低电平时触发中断。
双边沿触发: 当GPIO引脚的电平发生变化,无论是从低到高,还是从高到低时都会触发中断。
软件触发: 可以通过软件命令触发中断,不依赖GPIO引脚的电平变化。
支持的GPIO口:
EXTI可以监测几乎所有的GPIO口,包括STM32的所有引脚。但是同一个GPIO引脚不能同时触发多个中断通道。一个引脚只能与一个中断通道绑定。
中断通道:
EXTI模块支持最多16个GPIO引脚触发的外部中断,另外还包括一些特殊的触发源,如PVD(电压检测输出)、RTC闹钟、USB唤醒和以太网唤醒等。
触发响应方式:
EXTI不仅支持传统的中断响应,还支持事件响应。在事件响应模式下,系统可以响应外部信号的变化,但并不一定中断当前的CPU任务。根据配置,可以选择不同的响应方式来满足不同的应用需求。
总之,EXTI外部中断功能能够监测GPIO引脚的电平变化,并通过不同的触发方式(上升沿、下降沿、双边沿或软件触发)来生成中断请求,经过NVIC的裁决后,CPU可被打断并执行相关的中断服务程序。EXTI模块支持多种GPIO口,并能够处理多种外部信号触发,灵活地支持不同的响应模式。
从 GPIO 到中断触发的完整路径:
GPIOx → AFIO(引脚选择)→ EXTI(边沿检测)→ NVIC(优先级管理)→ CPU 执行中断服务函数
GPIO 外设输入端口(GPIOA、GPIOB、GPIOC…)
每个 GPIO 端口有 16 个引脚(0~15)
这些引脚可以作为普通输入,也可以配置为中断触发输入
但多个端口(如 PA0、PB0、PC0)不能同时映射到同一个 EXTI0 线,需要选择谁占用
AFIO 模块(Alternate Function IO)
AFIO:中断引脚选择器
它的作用是告诉 EXTI 哪个 GPIO 引脚连接到哪一条 EXTI 线。
关键点:
STM32F1 的 EXTI 有 16 条(EXTI0 ~ EXTI15)
每条 EXTI 线最多只能挂接一个引脚
AFIO_EXTICRx 寄存器用来设置:
例如 EXTI0 ← PA0 或 PB0 或 PC0,由软件配置
EXTI 模块(边沿检测与中断控制器)
EXTI = External Interrupt/Event Controller
它负责:
监控外部信号的上升沿 / 下降沿
将触发事件发出中断请求
将中断信号传递给 NVIC
还可以控制:
是否屏蔽中断(IMR)
是否只作为事件触发(EMR)
AFIO 复用IO口
在 STM32 微控制器中,AFIO(Alternate Function I/O)模块是一个非常关键的外设控制单元,主要负责 引脚的复用功能选择与重定义。由于 STM32 的某些外设功能(如 USART、TIM、SPI 等)可以复用到多个不同的引脚上,因此需要通过 AFIO 模块来进行合理的映射和配置。
AFIO 主要完成以下两个核心任务:
复用功能引脚的重映射:当默认的外设引脚与实际设计冲突时,可以通过 AFIO 对这些引脚的映射关系进行重新定义,将某个功能分配到另一个引脚上。例如,可以将 USART1 的 Tx/Rx 引脚从默认的 PA9/PA10 重映射到其他可选引脚。
外部中断引脚的选择(EXTI 配置):STM32 的 EXTI(外部中断控制器)支持将 GPIOA、GPIOB、GPIOC 等多个端口的同一编号引脚(如 PA0、PB0、PC0)接到同一条 EXTI 线(如 EXTI0)。而 AFIO 则负责选择当前哪一个具体的引脚与某条 EXTI 中断线相连。
外部中断/事件控制器(EXTI)框图
这张图主要完成了两件事:
1. 检测外部输入信号是否发生边沿变化(上升/下降)
2. 如果检测到了,决定是否向 NVIC 发起中断或事件触发
整体流程:从输入引脚 → EXTI → 中断或事件
【1】边沿检测电路
来自 GPIO(或其他模块)的电平输入信号进入。
通过上升沿触发寄存器和下降沿触发寄存器设置:
是否对上升沿、下降沿敏感。
一旦检测到配置的边沿变化,输出一个触发信号。
【2】生成中断或事件请求
边沿检测信号经过两个分支:
A)进入中断控制通路(上面那条线)
请求挂起寄存器(PR):记录这次中A)进入中断控制通路(上面那条线)断事件发生了
中断屏蔽寄存器(IMR):决定这个中断能否被 NVIC 接收
如果没有被屏蔽 → 送到 NVIC,启动中断服务函数
B)进入事件控制通路(下面那条线)
事件屏蔽寄存器(EMR):决定是否产生“事件信号”
如果允许事件 → 送入 脉冲发生器(用于触发 DMA 或其他模块)
【3】软件触发支持
软件可直接写入 软件中断事件寄存器(SWIER),人为触发中断或事件,模拟一次外部信号触发。
【4】附加控制
所有寄存器都有 20 位(支持 EXTI0~EXTI19,F1 通常用前16个)
最终与门(AND)和或门(OR)控制是否允许请求生效