在嵌入式系统中,中断是非常重要的机制之一。它允许我们对外部事件做出快速响应,比如按键按下、传感器状态变化等。在 STM32F429 系列芯片中,外部中断(EXTI)功能非常强大,支持多个引脚触发中断,并且可以灵活配置边沿触发方式。
本文将带你一步步了解如何在 STM32F429 上配置 EXTI 外部中断。
一、什么是 EXTI?
EXTI(External Interrupt/Event Controller)是 STM32 提供的一个外部中断控制器模块。它可以监控多达 23 条外部信号线(EXTI0 ~ EXTI22),每条线都可以独立配置为:
- 输入捕获源
- 中断或事件模式
- 上升沿/下降沿/双边沿触发
其中,EXTI0~EXTI15 对应的是 GPIO 引脚输入中断,每个 EXTI 线可连接到任意一个 GPIO 引脚(但同一时刻只能有一个引脚连接到某一线)。
二、EXTI 的基本结构图(简要)
虽然不能贴图,但你可以想象如下结构关系:
GPIO Pin ——[重映射]——> EXTI Line ——> NVIC中断控制器
也就是说,某个 GPIO 引脚可以通过 SYSCFG 配置连接到某一条 EXTI 线,然后该线可以配置为中断或事件,并最终连接到 NVIC 触发中断服务函数。
三、EXTI 中断配置步骤
步骤 1:启用相关时钟
你需要开启以下几个模块的时钟:
- GPIO 端口时钟
- SYSCFG 时钟(用于设置 EXTI 映射)
- NVIC 中断控制器(如果使用中断)
// 假设使用的是 GPIOE 的第 3 引脚(PE3)
RCC->AHB1ENR |= RCC_AHB1ENR_GPIOEEN; // 启用 GPIOE 时钟
RCC->APB2ENR |= RCC_APB2ENR_SYSCFGEN; // 启用 SYSCFG 时钟
步骤 2:配置 GPIO 为输入模式
确保你要使用的引脚已经配置为输入模式(如浮空输入、上拉或下拉)。
GPIOE->MODER &= ~(3 << (3 * 2)); // 清除 PE3 模式位
GPIOE->MODER |= (0 << (3 * 2)); // 设置为输入模式
GPIOE->PUPDR &= ~(3 << (3 * 2));
GPIOE->PUPDR |= (1 << (3 * 2)); // 上拉电阻
步骤 3:配置 SYSCFG 将 GPIO 映射到 EXTI 线
以 PE3 为例,它对应 EXTI3。
SYSCFG->EXTICR[0] &= ~SYSCFG_EXTICR1_EXTI3; // 清除原有配置
SYSCFG->EXTICR[1] |= SYSCFG_EXTICR1_EXTI3_PE; // 设置为 PE3
注:
EXTICR
是一个数组,每项控制 4 个 EXTI 线。例如:
EXTICR[0]
控制 EXTI0 ~ EXTI3EXTICR[1]
控制 EXTI4 ~ EXTI7- 以此类推
步骤 4:配置 EXTI 线触发方式
选择上升沿、下降沿或双边沿触发。
EXTI->RTSR |= (1 << 3); // 允许上升沿触发
EXTI->FTSR |= (1 << 3); // 允许下降沿触发
步骤 5:使能 EXTI 线中断
EXTI->IMR |= (1 << 3); // 使能 EXTI3 中断
步骤 6:配置 NVIC 并编写中断处理函数
在 stm32f4xx_it.c
文件中找到对应的中断向量并添加处理逻辑。
NVIC_EnableIRQ(EXTI3_IRQn); // 启用 EXTI3 中断
NVIC_SetPriority(EXTI3_IRQn, 1); // 设置优先级
然后编写中断服务函数:
void EXTI3_IRQHandler(void) {
if (EXTI->PR & (1 << 3)) {
// 处理中断逻辑
HAL_GPIO_TogglePin(GPIOA, GPIO_PIN_5); // 举例:翻转 LED
EXTI->PR |= (1 << 3); // 清除中断标志
}
}
四、注意事项
- 同一 EXTI 线一次只能被一个 GPIO 引脚使用。
- 不同的 EXTI 线共享不同的中断向量,比如 EXTI0
EXTI4 各自拥有单独的中断向量,而 EXTI5EXTI9 共享一个中断向量EXTI9_5_IRQn
,EXTI10~EXTI15 共享EXTI15_10_IRQn
。 - 在中断处理函数中一定要清除中断标志位,否则会不断进入中断。
五、总结
通过以上步骤,我们可以在 STM32F429 上成功配置一个基于 GPIO 的外部中断。EXTI 是实现异步事件响应的重要工具,在按键检测、传感器中断、通信协议中都非常常见。
掌握 EXTI 的配置流程,有助于你更高效地进行嵌入式项目开发。
参考资料
如果你喜欢这篇博文,欢迎分享给你的朋友或同事!如果你有任何问题,也可以在评论区留言讨论 😊