目录
一、EXTI 模块定义
1.参考手册说明
对于互联型产品,外部中断/事件控制器由20个产生事件/中断请求的边沿检测器组成,对于其它 产品,则有19个能产生事件/中断请求的边沿检测器。每个输入线可以独立地配置输入类型(脉冲 或挂起)和对应的触发事件(上升沿或下降沿或者双边沿都触发)。每个输入线都可以独立地被屏 蔽。挂起寄存器保持着状态线的中断请求。
2.EXTI模块作用
GPIO识别进入IO口的高低电平,高电平识别为1低电平识别为0,而EXTI 负责监测来自 GPIO 或其他外设的信号变化,当信号满足预设触发条件(如上升沿、下降沿或双边沿)时,可产生中断或事件。中断会打断当前程序执行,转至中断服务程序;事件则用于触发其他外设操作(如定时器捕获或比较),提升系统实时性与效率。
3.STM32 的系统架构
EXTI 挂接在 APB2 总线上,与 GPIO、TIM1、USART1 等外设并列。这表明 EXTI 可与其他高速外设协同工作,其信号处理速度能满足系统实时性要求。Cortex-M3 内核通过总线矩阵与各外设交互,EXTI 产生的中断请求可快速传递给 NVIC(嵌套向量中断控制器),由 NVIC 管理中断优先级和响应。
二、EXTI的优势
1.按键对比
方式1(图上):通过GPIO读取高低电平分别保存在previous和current中在while中不断循环比较,两个不相等时说明按键被按下。
方式2 (图下) :按键按下时会产生一个下降沿,松开时会产生一个上升沿通过EXTI来识别产生中断,在中断响应函数中执行相关任务。
2.例子
按键连接到某 GPIO 引脚(如 PA0),配置 PA0 为输入模式并连接到 EXTI 线 0。通过 EXTI_RTSR
/EXTI_FTSR
设置触发边沿(如下降沿触发),使能 EXTI_IMR
中断屏蔽。当按键按下,GPIO 电平变化经 EXTI 线 0 触发中断,NVIC 响应后执行中断服务程序(如处理按键动作),避免 CPU 轮询,节省资源。总之,EXTI 模块通过监测外部信号变化,按配置产生中断或事件,实现对外部事件的快速响应,是 STM32 高效处理异步事件的重要机制。
三、线的内部结构与工作流程
1.线的概念
- GPIO 引脚映射:GPIO有16条EXTI的线(EXTI线0-16)刚好对应PAPB的16个引脚,每个 GPIO 引脚(如 PA0、PB0、PC0 等)均可连接到一条 EXTI 线(如 EXTI 线 0)。同一 EXTI 线可对应多个引脚,但信号传输由 AFIO(复用功能输入输出)配置决定,同一时刻仅一路信号有效(如EXTI_Line0选择了PA0就不能选择PB0,PC0了)。
- 其他外设连接:除 GPIO 外,部分外设(如 PVD、RTC、USB 等)也连接到特定 EXTI 线(如 EXTI 线 16 - 19),实现对特殊事件的监测。
- EXTI 线 0 - 15:对应 GPIO 引脚(如 EXTI 线 0 对应 PA0、PB0、PC0 等)。
- EXTI 线 16 - 19:连接特殊外设(如 EXTI 线 16 对应 PVD 输出,EXTI 线 17 对应 RTC 闹钟事件)。
2.线的内部结构与工作流程
- 边沿检测电路:
输入信号先经过边沿检测电路,可配置为检测上升沿、下降沿或双边沿(月牙形为或门)。例如,按键按下(下降沿)或松开(上升沿)时,电路检测到电平变化。 - 中断与事件路径:
- 中断路径:检测到的信号经中断屏蔽寄存器(可配置使能 / 禁止中断),若允许中断,则向 NVIC 发送中断请求。NVIC 根据优先级决定是否响应,响应后执行中断服务程序。
- 事件路径:产生脉冲信号,用于触发其他外设(如定时器输入捕获),不涉及 NVIC,仅作硬件触发。
- 寄存器配置:
通过上升沿触发寄存器(EXTI_RTSR
)、下降沿触发寄存器(EXTI_FTSR
)、中断屏蔽寄存器(EXTI_IMR
)、事件屏蔽寄存器(EXTI_EMR
)等,可灵活设置触发方式及中断 / 事件使能状态。
4.软件触发:通过向寄存器写1就可以触发一次中断。
五、常见问题与解决方案
1. 中断不触发
- 检查项:
- GPIO模式是否正确(需配置为输入)
- AFIO时钟是否使能(
RCC_APB2Periph_AFIO
) - EXTI线是否绑定到正确的GPIO(
AFIO_EXTICRx
) - NVIC是否启用对应中断通道
2. 中断频繁误触发
- 可能原因:
- 未在ISR中清除挂起标志(必须写
EXTI->PR = EXTI_PR_PRx
) - 硬件干扰(添加RC滤波或磁珠)
- 触发方式配置错误(如悬空引脚配置为双边沿)
- 未在ISR中清除挂起标志(必须写
3. 多路复用冲突
- 现象:配置PA0和PB0到同一EXTI Line后,仅其中一个有效。
- 解决:同一时间只能有一个GPIO绑定到特定EXTI Line。
六、EXTI模块的时序
1. 使能相关时钟
GPIO 时钟使能:
若使用 GPIOA
、GPIOB
等端口,需通过 RCC_APB2PeriphClockCmd
使能对应时钟。例如,使用 PA
口时:
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
AFIO 时钟使能:
配置 EXTI 与 GPIO 引脚连接时,需使能 AFIO
(复用功能输入输出)时钟:
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);
2. 配置 GPIO 为输入模式
将目标引脚(如 PA0
)配置为输入模式(上拉、下拉或浮空输入)。以 PA0
上拉输入为例:
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; // 上拉输入,根据实际需求选择模式
GPIO_Init(GPIOA, &GPIO_InitStructure);
3. 配置 EXTI 线
选择 EXTI 线:
如 GPIO_Pin_0
对应 EXTI_Line0
,使用 GPIO_EXTILineConfig
关联引脚与 EXTI 线:
GPIO_EXTILineConfig(GPIO_PortSourceGPIOA, GPIO_PinSource0); // PA0 关联到 EXTI_Line0
设置触发方式:
上升沿触发:
EXTI_InitTypeDef EXTI_InitStructure;
EXTI_InitStructure.EXTI_Line = EXTI_Line0;
EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt; // 中断模式,非事件模式
EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising; // 上升沿触发,可改为 Falling(下降沿)或 Rising_Falling(双边沿)
EXTI_InitStructure.EXTI_LineCmd = ENABLE;
EXTI_Init(&EXTI_InitStructure);
4. 配置 NVIC(中断优先级)
设置中断优先级分组:
例如,选择分组 2(2 位抢占优先级,2 位子优先级):
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
配置具体中断通道:
以 EXTI0
中断为例:
NVIC_InitTypeDef NVIC_InitStructure;
NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQn; // EXTI0 中断通道
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1; // 抢占优先级
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1; // 子优先级
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
5. 编写中断服务程序
定义中断服务函数:
例如,EXTI0
的中断服务函数:
void EXTI0_IRQHandler(void) {
if (EXTI_GetITStatus(EXTI_Line0) != RESET) {
// 处理中断逻辑,如按键动作
// ...
EXTI_ClearITPendingBit(EXTI_Line0); // 清除中断标志位
}
}
时序总结
- 时钟使能:先使能
GPIO
和AFIO
时钟,为后续配置准备硬件基础。 - GPIO 配置:将引脚设为输入模式,确保能正确读取外部信号。
- EXTI 配置:关联引脚与 EXTI 线,设置触发方式,使能 EXTI 线。
- NVIC 配置:确定中断优先级,使能中断通道,让 CPU 能响应 EXTI 中断。
- 中断处理:在中断服务程序中处理具体逻辑,并清除标志位,避免重复触发。
通过以上步骤,可完整实现基于 STM32 EXTI 模块的外部信号中断响应时序,确保系统对外部事件(如按键按下、传感器信号变化)的及时处理。
七、基于STM32的EXTI模块核心总结
一、EXTI模块架构
-
EXTI Line分配
- Line0~Line15: EXTI 线 0 - 15:对应 GPIO 引脚(如 EXTI 线 0 对应 PA0、PB0、PC0 等)。 EXTI 线 16 - 19:连接特殊外设(如 EXTI 线 16 对应 PVD 输出,EXTI 线 17 对应 RTC 闹钟事件)。
-
- GPIO绑定:每条Line可配置到任意GPIO端口的同一Pin号(如Line0可绑定PA0、PB0等)。
- 中断独立:每条Line对应独立的中断服务函数(如EXTI0_IRQHandler、EXTI1_IRQHandler)。
- Line16~Line19:专用系统事件
- Line16:PVD(电源电压检测)
- Line17:RTC闹钟
- Line18:USB唤醒
- Line19:以太网唤醒(仅互联型芯片支持)
- 组合中断:
- EXTI9_5:Line5~Line9共享同一中断服务函数(需在代码中判断触发源)。
- EXTI15_10:Line10~Line15共享同一中断服务函数。
-
边沿检测电路
- 触发方式:
- 上升沿(↑)、下降沿(↓)、双边沿(↑↓)可选。
- 通过寄存器
EXTI_RTSR
(上升沿)和EXTI_FTSR
(下降沿)配置。
- 软件触发:
- 直接写寄存器
EXTI_SWIER
可模拟硬件触发,用于调试或强制中断。
- 直接写寄存器
- 触发方式:
二、中断与事件的区别
特性 | 中断(Interrupt) | 事件(Event) |
---|---|---|
触发对象 | CPU(需执行中断服务程序) | 外设(如DMA、ADC自动触发) |
响应方式 | 通过中断向量表跳转到ISR | 硬件直接联动(无需CPU干预) |
应用场景 | 按键处理、紧急状态响应 | 同步ADC采样、定时器自动触发 |
标志清除 | 需手动清除挂起标志(EXTI_PR ) | 自动清除 |
三、GPIO与EXTI的连接
- 多路复用机制:
- 每个GPIO的Pin号通过
AFIO_EXTICRx
寄存器动态绑定到对应EXTI Line。 - 冲突限制:同一EXTI Line同一时间只能绑定一个GPIO端口(如PA0和PB0不能同时绑定Line0)。
- 每个GPIO的Pin号通过
- 输入模式要求:
- GPIO需配置为浮空输入、上拉输入或下拉输入(根据硬件设计选择)。
四、按键触发时序示例
- 按键按下(下降沿触发):
- GPIO电平从高→低 → 边沿检测电路触发中断 → 挂起标志置位。
- 中断处理:
- CPU执行
EXTIx_IRQHandler
,处理逻辑后必须清除挂起标志(写EXTI_PR
)。
- CPU执行
- 按键释放(上升沿触发,若配置为双边沿):
- GPIO电平从低→高 → 再次触发中断。
五、关键配置步骤
- GPIO初始化:设为输入模式(上拉/下拉根据硬件设计)。
- EXTI Line绑定:通过
AFIO_EXTICRx
寄存器绑定GPIO到指定Line。 - 触发方式配置:选择边沿类型(上升沿/下降沿/双边沿)。
- 中断使能:开启NVIC中断通道,设置优先级。
六、常见问题与解决
- 中断不触发:检查AFIO时钟是否开启、GPIO模式是否正确、NVIC是否配置。
- 中断频繁误触发:添加硬件消抖(RC滤波)或软件消抖(延时检测)。
- 标志未清除:导致中断持续触发,需在ISR中写
EXTI_PR
清除标志。
七、总结
EXTI模块是STM32的“外部信号感知中枢”:
- 通过20条独立线路(互联型)实时检测GPIO或系统事件。
- 灵活配置触发条件,实现高效的事件驱动响应。
- 硬件级联动(事件)与软件级响应(中断)结合,满足复杂场景需求。