简介
EXTI(External Interrupt/Event Controller,外部中断/事件控制器)是 STM32 单片机中用于管理外部中断和事件的外设,可检测外部信号的变化并触发中断或事件。STM32F407 系列芯片配备了 23 个外部中断/事件线,支持上升沿、下降沿、双边沿触发,可与 GPIO 引脚、外设事件等连接,广泛应用于按键检测、传感器触发、外部信号处理等场景。本文从 EXTI 的基本原理出发,详细讲解 STM32F407 EXTI 的配置方法、代码实现、中断处理以及实际应用案例,帮助你快速掌握 EXTI 的使用技巧。
一、EXTI核心概念与分类
1.1 基本概念
EXTI 是一个用于管理外部中断和事件的控制器,其主要特点包括:
- 多路中断源:支持多达 23 个外部中断/事件线
- 多种触发方式:上升沿、下降沿、双边沿触发
- 灵活配置:每个中断线可独立配置触发方式和优先级
- 中断和事件:支持中断和事件两种处理方式
- 软件触发:支持软件触发中断/事件
关键参数:
- 中断线:EXTI0-EXTI22,共 23 个中断线
- 触发方式:上升沿、下降沿、双边沿
- 中断优先级:可配置抢占优先级和子优先级
- 中断屏蔽:可单独屏蔽每个中断线
1.2 STM32F407 的 EXTI 资源
STM32F407 系列芯片配备了 23 个外部中断/事件线:
| 中断线 | 功能 | 触发源 |
|---|---|---|
| EXTI0 | 外部中断线0 | PA0-PG0 |
| EXTI1 | 外部中断线1 | PA1-PG1 |
| EXTI2 | 外部中断线2 | PA2-PG2 |
| EXTI3 | 外部中断线3 | PA3-PG3 |
| EXTI4 | 外部中断线4 | PA4-PG4 |
| EXTI5 | 外部中断线5 | PA5-PG5 |
| EXTI6 | 外部中断线6 | PA6-PG6 |
| EXTI7 | 外部中断线7 | PA7-PG7 |
| EXTI8 | 外部中断线8 | PA8-PG8 |
| EXTI9 | 外部中断线9 | PA9-PG9 |
| EXTI10 | 外部中断线10 | PA10-PG10 |
| EXTI11 | 外部中断线11 | PA11-PG11 |
| EXTI12 | 外部中断线12 | PA12-PG12 |
| EXTI13 | 外部中断线13 | PA13-PG13 |
| EXTI14 | 外部中断线14 | PA14-PG14 |
| EXTI15 | 外部中断线15 | PA15-PG15 |
| EXTI16 | 外部中断线16 | PVD输出 |
| EXTI17 | 外部中断线17 | RTC闹钟 |
| EXTI18 | 外部中断线18 | USB OTG FS唤醒 |
| EXTI19 | 外部中断线19 | 以太网唤醒 |
| EXTI20 | 外部中断线20 | USB OTG HS唤醒 |
| EXTI21 | 外部中断线21 | RTC入侵和时间戳 |
| EXTI22 | 外部中断线22 | RTC闹钟 |
关键特性:
- 支持上升沿、下降沿、双边沿触发
- 支持中断和事件两种处理方式
- 支持软件触发中断/事件
- 支持中断屏蔽和事件屏蔽
- 支持挂起寄存器,记录中断状态
二、EXTI工作原理
2.1 基本工作原理
EXTI 的基本工作原理是检测外部信号的变化,并根据配置触发中断或事件。
工作流程:
- 外部信号通过 GPIO 引脚或外设事件输入到 EXTI
- EXTI 检测信号的变化(上升沿、下降沿、双边沿)
- 如果检测到触发条件,EXTI 生成中断请求或事件
- 中断请求发送到 NVIC,由 NVIC 决定是否响应中断
- CPU 响应中断,执行中断服务函数
2.2 触发方式
EXTI 支持三种触发方式:
上升沿触发:
- 当信号从低电平变为高电平时触发中断
- 适用于检测按键释放、传感器上升沿等场景
下降沿触发:
- 当信号从高电平变为低电平时触发中断
- 适用于检测按键按下、传感器下降沿等场景
双边沿触发:
- 当信号从低电平变为高电平或从高电平变为低电平时都触发中断
- 适用于检测信号变化、编码器等场景
2.3 中断和事件
EXTI 支持两种处理方式:
中断:
- 中断请求发送到 NVIC,由 NVIC 决定是否响应中断
- CPU 响应中断后,执行中断服务函数
- 适用于需要 CPU 处理的场景
事件:
- 事件不发送到 NVIC,而是直接触发外设操作
- 可用于触发 DMA 传输、ADC 转换等
- 适用于需要快速响应的场景
三、EXTI配置与代码实现
3.1 标准库配置步骤
以 EXTI0(PA0)为例,使用标准库配置 EXTI 的基本步骤:
- 使能 SYSCFG 时钟和 GPIO 时钟
- 配置 GPIO 为输入模式
- 配置 EXTI 中断线
- 配置 NVIC 中断优先级
- 使能 EXTI 中断
3.2 代码实现(EXTI0,PA0,下降沿触发)
#include"stm32f4xx.h"/** * @brief 初始化EXTI0(PA0) * @param 无 * @retval 无 */voidEXTI0_Init(void){GPIO_InitTypeDef GPIO_InitStructure;EXTI_InitTypeDef EXTI_InitStructure;NVIC_InitTypeDef NVIC_InitStructure;// 1. 使能时钟RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA,ENABLE);RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG,ENABLE);// 2. 配置GPIOGPIO_InitStructure.GPIO_Pin=GPIO_Pin_0;GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IN;GPIO_InitStructure.GPIO_PuPd