news 2026/5/1 6:05:51

STM32 EXTI(外部中断)详解

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
STM32 EXTI(外部中断)详解

一、EXTI是什么?

EXTI = External Interrupt/Event Controller(外部中断/事件控制器)

简单说:EXTI是STM32的“门卫”,专门管引脚上的电平变化。当引脚电平变化时,EXTI会通知CPU:“有情况!”

二、EXTI能干什么?

两种工作模式:

  1. 中断模式:电平变化 → EXTI → CPU → 执行中断函数

  2. 事件模式:电平变化 → EXTI → 直接触发其他外设(不打扰CPU)

常见用途:

  • 按键检测(按一下触发一次)

  • 限位开关(碰到就停)

  • 外部信号计数(来一个脉冲记一次)

三、EXTI的硬件连接(重要!)

外部引脚 → GPIO端口 → EXTI线路 → NVIC → CPU ↑ ↑ ↑ ↑ ↑ 电平变化 端口选择 线路选择 优先级 执行中断

关键规则:

  1. 每个EXTI线路对应多个GPIO引脚(但有规矩!)

  2. 同一时间,一个EXTI线路只能连一个GPIO引脚

四、EXTI线路分配表(必须记住!)

EXTI线路可以连接的GPIO引脚
EXTI0PA0, PB0, PC0, PD0, PE0, ... PI0
EXTI1PA1, PB1, PC1, PD1, PE1, ... PI1
EXTI2PA2, PB2, PC2, PD2, PE2, ... PI2
......(按数字对应)
EXTI15PA15, PB15, PC15, PD15, ... PI15

重要规律:EXTI0可以连所有端口的引脚0,EXTI1连所有引脚1,以此类推。

五、完整配置步骤(按键为例)

第1步:初始化按键引脚(PA0为例)

void KEY_Init(void) { GPIO_InitTypeDef GPIO_InitStructure; // 1. 开启GPIOA时钟 RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE); // 2. 配置PA0为上拉输入(按键按下接地) GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN; // 输入模式 GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; // 上拉电阻 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz; GPIO_Init(GPIOA, &GPIO_InitStructure); }

第2步:配置EXTI中断(核心!)

void EXTI0_Init(void) { EXTI_InitTypeDef EXTI_InitStructure; NVIC_InitTypeDef NVIC_InitStructure; // 1. 开启SYSCFG时钟(必须!很多人忘记) RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE); // 2. 将PA0连接到EXTI0线路 SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOA, EXTI_PinSource0); // 3. 配置EXTI0线路 EXTI_InitStructure.EXTI_Line = EXTI_Line0; // 线路0 EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt; // 中断模式 EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling; // 下降沿触发 EXTI_InitStructure.EXTI_LineCmd = ENABLE; // 使能 EXTI_Init(&EXTI_InitStructure); // 4. 配置NVIC中断优先级 NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQn; // 中断源 NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure); }

第3步:编写中断服务函数

// EXTI0中断服务函数(函数名固定,不能改!) void EXTI0_IRQHandler(void) { // 1. 检查是否是EXTI0触发的中断 if(EXTI_GetITStatus(EXTI_Line0) != RESET) { // 2. 你的处理代码 if(GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_0) == 0) { // 按键按下的处理 LED_Toggle(); // 切换LED状态 } // 3. 清除中断标志(必须!不然会一直进中断) EXTI_ClearITPendingBit(EXTI_Line0); } }

六、触发方式详解

触发方式说明适用场景
上升沿触发低电平→高电平时触发按键释放检测
下降沿触发高电平→低电平时触发按键按下检测
双边沿触发上升和下降都触发电平变化检测
// 选择触发方式 EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising; // 上升沿 EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling; // 下降沿 EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising_Falling; // 双边沿

七、多按键配置示例(多个EXTI线路)

// 配置PA0(EXTI0)和PC13(EXTI13)两个按键 void EXTI_Multi_Init(void) { // ... 开启时钟、GPIO初始化 ... // PA0 -> EXTI0(按键1) SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOA, EXTI_PinSource0); EXTI_InitStructure.EXTI_Line = EXTI_Line0; EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling; EXTI_Init(&EXTI_InitStructure); // PC13 -> EXTI13(按键2) SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOC, EXTI_PinSource13); EXTI_InitStructure.EXTI_Line = EXTI_Line13; EXTI_Init(&EXTI_InitStructure); // 配置两个中断通道 NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQn; NVIC_Init(&NVIC_InitStructure); NVIC_InitStructure.NVIC_IRQChannel = EXTI15_10_IRQn; // 注意!10-15共用 NVIC_Init(&NVIC_InitStructure); } // 中断服务函数 void EXTI0_IRQHandler(void) // 处理EXTI0 { if(EXTI_GetITStatus(EXTI_Line0) != RESET) { // 处理按键1 EXTI_ClearITPendingBit(EXTI_Line0); } } void EXTI15_10_IRQHandler(void) // 处理EXTI10-15 { if(EXTI_GetITStatus(EXTI_Line13) != RESET) { // 处理按键2(PC13) EXTI_ClearITPendingBit(EXTI_Line13); } }

八、注意事项(避坑指南)

常见错误1:忘记开SYSCFG时钟

// 必须加! RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE); 常见错误2:中断函数名写错
  • EXTI0-4:EXTI0_IRQHandlerEXTI1_IRQHandler...

  • EXTI5-9:共用EXTI9_5_IRQHandler

  • EXTI10-15:共用EXTI15_10_IRQHandler

常见错误3:没清除中断标志

会导致重复进入中断,程序卡死!

常见错误4:GPIO模式设错

必须设置为输入模式:GPIO_Mode_IN

九、事件模式 vs 中断模式

// 中断模式:需要CPU参与 EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt; // 事件模式:直接触发其他外设(如DMA、ADC) EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Event; // 事件模式不触发中断,不需要NVIC配置

十、软件触发中断(特殊用途)

// 有时候需要软件模拟一个中断 EXTI_GenerateSWInterrupt(EXTI_Line0); // 软件触发EXTI0中断

十一、消抖处理(实际应用)

void EXTI0_IRQHandler(void) { if(EXTI_GetITStatus(EXTI_Line0) != RESET) { // 简单延时消抖 delay_ms(20); // 延时20ms // 再次检测 if(GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_0) == 0) { // 确实按下了 LED_Toggle(); } EXTI_ClearITPendingBit(EXTI_Line0); } }

十二、EXTI配置速查表

步骤做什么关键函数/配置
1开SYSCFG时钟RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG)
2GPIO初始化模式=输入,上下拉按需
3引脚连EXTISYSCFG_EXTILineConfig(端口源, 引脚源)
4配置EXTI选线路、模式、触发方式
5配置NVIC设优先级
6写中断函数函数名固定,记得清标志

总结口诀

EXTI是门卫,管脚电平变。 先开时钟后连线,SYSCFG别忘记。 引脚线路要对齐,0对0来1对1。 触发方式有三种,上升下降和双边。 中断函数名固定,清除标志要牢记。 按键记得要消抖,实际应用才稳定。
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/26 4:54:48

无锡黑锋 HF73XXH 30V高压、1.5μA超低静态电流、300mA LDO稳压器技术解析

一、芯片核心定位HF73XXH 是一款面向高压供电系统的 超低静态电流、低压差线性稳压器 其核心优势在于 高达30V的宽输入电压范围、仅为1.5μA的典型静态电流 以及 300mA的输出驱动能力 专为由多节电池、适配器或工业电源供电,且对功耗有严格要求的常开型设备设计&…

作者头像 李华
网站建设 2026/4/10 0:44:32

无锡黑锋 HF6209 24V高压、2.5μA超低静态电流、300mA高PSRR LDO稳压器技术解析

一、芯片核心定位HF6209 是一款集高压输入、超低功耗、高电源抑制比和快速瞬态响应于一体的 CMOS 线性低压差稳压器 其核心价值在于 24V的宽输入电压范围、仅2.5μA的典型静态电流、65dB1kHz的高PSRR 以及 300mA的输出驱动能力 专为需要长续航、高压电源供电且对电源噪声敏感的…

作者头像 李华
网站建设 2026/4/18 6:35:58

14. UGUI屏幕适配

1.基础适配 2.异形屏适配1.基础适配 public class SmartCanvasAdapter : MonoBehaviour {[SerializeField] private CanvasScaler canvasScaler;[SerializeField] private Vector2 designResolution new Vector2(1080, 2340);private float lastScreenWidth;private float las…

作者头像 李华
网站建设 2026/4/25 7:14:23

江协科技10-4 I2C硬件通信

第一点很好去理解,下面的不必在乎,目前用不到,直接看最后一点,可以根据引脚的图去看具体是哪个接口是这两条线这个功能框图还是很好理解的吧,首先看上面的SDA,可知的是,比较器和帧错误校验这一块…

作者头像 李华
网站建设 2026/4/23 23:34:40

永磁同步电机三矢量模型预测电流控制探索

永磁同步电机三矢量模型预测电流控制(有参考文献) [1]参考文献:《永磁同步电机三矢量模型预测电流控制_徐艳平》 (1)采用id0 ,速度环 PI 控制器的输出作为q轴电流的给定。 在核心模块 TV-MPCC 中,首先根据电流给定值和反馈值计算三…

作者头像 李华
网站建设 2026/4/30 13:05:13

wazero嵌入式部署实战:5个关键步骤解决物联网设备计算瓶颈

wazero嵌入式部署实战:5个关键步骤解决物联网设备计算瓶颈 【免费下载链接】AI_NovelGenerator 使用ai生成多章节的长篇小说,自动衔接上下文、伏笔 项目地址: https://gitcode.com/GitHub_Trending/ai/AI_NovelGenerator 面对物联网设备日益复杂的…

作者头像 李华