STM32——EXTI外部中断(六)

一、中断系统

中断:在主程序运行过程中,出现了特定的中断触发条件(中断源),使得CPU暂停当前正在运行的程序,转而去处理中断程序,处理完成后又返回原来被暂停的位置继续运行

中断优先级:当有多个中断源同时申请中断时,CPU会根据中断源的轻重缓急进行裁决,优先响应更加紧急的中断源

中断嵌套:当一个中断程序正在运行时,又有新的更高优先级的中断源申请中断,CPU再次暂停当前中断程序,转而去处理新的中断程序,处理完成后依次进行返回

中断优先级有响应优先级和抢占优先级,响应优先级就是按照优先级来一个个的排队。抢占优先级的话就是按照优先级直接把正在执行的中断暂停,执行抢占优先级高的中断。另外中断不需要调用,当达到中断的条件时硬件会自动执行。

二、NVIC

STM32中断

STM32 的中断系统是其实时性与高可靠性的基石,它为开发者提供了 68 个可屏蔽中断通道,覆盖了 EXTI 外部中断、TIM 定时器、ADC 模数转换、USART 串口、SPI/I2C 通信、RTC 实时时钟等几乎所有常用外设,能满足各类场景下的中断触发需求。

为了高效管理这些中断,STM32 采用了 NVIC(嵌套向量中断控制器)统一调度机制。每个中断通道都支持 16 个可编程的优先等级,开发者还可以对优先级进行分组,进一步配置抢占优先级和响应优先级。这一设计确保了高优先级的任务能及时抢占低优先级任务执行,在复杂的多中断场景下也能保证系统的响应效率与执行秩序。

NVIC的基本结构

在图的左侧,是 EXTI、TIM、ADC、USART 等外设模块。当外设触发中断事件时(比如按键按下、定时器溢出),并不会直接请求 CPU,而是先把中断信号发送给 NVIC。

图里外设和 NVIC 之间的 "n" 形开关,代表的是外设中断使能位。只有当这个开关 "闭合" 时,中断信号才能进入 NVIC。

NVIC 内部划分了优先级 0 到 15共 16 个等级(数值越小,优先级越高)。当多个外设的中断信号同时到达时,NVIC 会根据中断的优先级配置,决定谁先被转发给 CPU。

NVIC 会把最终的中断请求转发给 CPU。当 CPU 响应中断时,NVIC 会自动提供中断服务程序的入口地址,让 CPU 能精准跳转到对应的函数执行。执行完成后,NVIC 会协助 CPU 恢复现场,回到被中断的主程序继续执行。

NVIC优先级分组

NVIC 用 4 位二进制(0~15)来表示中断优先级,这 4 位可以切分成 抢占优先级响应优先级 两部分。

分组号越大,抢占优先级的位数就越多,能支持的抢占嵌套层级也越多;反之,响应优先级的位数就越多,能支持的排队优先级就越细。

三、EXTI

EXTI简介

EXTI(Extern Interrupt)外部中断

EXTI可以监测指定GPIO口的电平信号,当其指定的GPIO口产生电平变化时,EXTI将立即向NVIC发出中断申请,经过NVIC裁决后即可中断CPU主程序,使CPU执行EXTI对应的中断程序

支持的触发方式:上升沿/下降沿/双边沿/软件触发

支持的GPIO口:所有GPIO口,但相同的Pin不能同时触发中断,如A0、B0不能同时触发中断,A0、B1能同时触发中断。

通道数:16个GPIO_Pin,外加PVD输出、RTC闹钟、USB唤醒、以太网唤醒

触发响应方式:中断响应/事件响应

EXTI的基本结构

输入层: GPIO 与外设信号

GPIOA、GPIOB、GPIOC 等端口的 16 个引脚信号,以及 PVD、RTC、USB、ETH 等片上外设的事件信号,是中断的源头。

选择层: AFIO (复用功能 IO

它的核心作用是中断引脚选择,通过内部的多路选择器,从所有 GPIO 端口的同号引脚中,选出一个连接到 EXTI 线上。

重映射部分外设的引脚

例如,要让 GPIOB Pin 5 触发中断,就需要通过 AFIO 配置,将它映射到 EXTI5 线上。

检测层: EXTI (外部中断 / 事件控制器)

负责对输入信号做边沿检测及控制,可以配置为上升沿、下降沿或双边沿触发。

检测到有效边沿后,会生成中断请求,发送给 NVIC;也可以生成事件信号,直接触发其他外设的操作(无需 CPU 干预)。

最终输出 20 条中断线,包括独立的 EXTI0~EXTI4、共享的****EXTI9_5/EXTI15_10 ,以及外设专属中断线。

仲裁层: NVIC (嵌套向量中断控制器)

接收 EXTI 等外设的中断请求,根据你配置的抢占优先级响应优先级进行仲裁,决定哪个中断先被 CPU 响应。

EXTI的框架
1、信号入口:输入线

框图最右侧的 "输入线",就是来自 AFIO 的 20 条信号(GPIO 或外设信号)。

每条输入线对应独立的处理通道,支持并行处理。

2、边沿检测与触发选择

这是 EXTI 感知外部信号变化的核心环节:

上升沿 / 下降沿触发选择寄存器

你可以通过配置这两个寄存器,为每条输入线设置触发方式(上升沿、下降沿、双边沿)。

边沿检测电路

负责检测输入信号是否符合你设定的边沿条件,检测到有效边沿后,会输出一个触发信号。

3、中断与事件的分支处理

EXTI 最巧妙的设计,就是把同一个触发信号分成了 中断事件 两条独立的处理路径。

中断路径(需要 CPU 响应)

请求挂起寄存器 :检测到有效触发后,对应位置 1,记录中断请求。

中断屏蔽寄存器 :如果对应位为 1(允许中断),则中断请求会通过 "或门" 发送给 NVIC。

NVIC 中断控制器 :这就是最终的中断请求信号,CPU 会根据优先级响应并执行中断服务函数。

事件路径(无需 CPU 干预)

事件屏蔽寄存器 :如果对应位为 1(允许事件),触发信号会进入 "脉冲发生器"。

脉冲发生器 :生成一个短脉冲,直接触发其他外设(如定时器、DMA)的操作,全程不需要 CPU 参与,效率极高。

4、软件触发与寄存器接口

软件中断 / 事件寄存器:可以通过软件直接置位,来触发中断或事件,常用于调试和测试。

外设接口:通过 AMBA APB 总线与 CPU 相连,让你可以通过读写寄存器来配置和控制 EXTI。

5、关键理解

中断是 "通知 CPU 干活":需要 CPU 响应并执行中断服务函数,有软件开销。

事件是 "硬件自动联动":不需要 CPU 介入,直接触发外设操作,是实现低功耗、高实时性的关键。

20 条线并行处理:每条输入线的触发检测、挂起、屏蔽都是独立的,互不影响。

相关推荐
A9better2 小时前
嵌入式开发学习日志50——任务调度与状态
stm32·嵌入式硬件·学习
草丛中的蝈蝈4 小时前
STM32向FLASH写入数据后,重新读出的数据和原写入数据不一致
stm32
LEEE@FPGA5 小时前
zynq 是不是有了设备树,再linux中不需要编写驱动也能控制
linux·运维·单片机
CQ_YM5 小时前
ARM之I2C与ADC
arm开发·嵌入式硬件·嵌入式·arm
同志啊为人民服务!5 小时前
RS485通信,无法进入中断处理程序,问题分析过程
单片机·编译器·rs485·中断处理程序
LCG米7 小时前
开发环境搭建:告别Keil,用CLion+STM32CubeMX打造智能嵌入式IDE
ide·stm32·嵌入式硬件
Hello_Embed7 小时前
Modbus 协议报文解析
笔记·stm32·单片机·学习·modbus
麒qiqi7 小时前
ADC 的原理与实战
c语言·开发语言·单片机·嵌入式硬件
嵌入式郑工9 小时前
如何用CLAUDECODE重塑嵌入式开发
嵌入式硬件·ai·ai编程