在嵌入式系统中,中断是非常重要的机制之一。它允许我们对外部事件做出快速响应,比如按键按下、传感器状态变化等。在 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 ~ EXTI3
  • EXTICR[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 线共享不同的中断向量,比如 EXTI0EXTI4 各自拥有单独的中断向量,而 EXTI5EXTI9 共享一个中断向量 EXTI9_5_IRQn,EXTI10~EXTI15 共享 EXTI15_10_IRQn
  • 在中断处理函数中一定要清除中断标志位,否则会不断进入中断。

五、总结

通过以上步骤,我们可以在 STM32F429 上成功配置一个基于 GPIO 的外部中断。EXTI 是实现异步事件响应的重要工具,在按键检测、传感器中断、通信协议中都非常常见。

掌握 EXTI 的配置流程,有助于你更高效地进行嵌入式项目开发。


参考资料


如果你喜欢这篇博文,欢迎分享给你的朋友或同事!如果你有任何问题,也可以在评论区留言讨论 😊

最后修改:2025 年 05 月 03 日
如果觉得我的文章对你有用,请随意赞赏