STM32多个外部中断可能共享同一个中断向量

在STM32F4系列微控制器中,多个外部中断可能共享同一个中断向量(例如,EXTI9_5_IRQn),因此需要在中断服务例程(ISR)中区分是哪个中断线触发了中断。对于PB6和PB7,它们都连接到EXTI9_5_IRQn中断向量。为了区分这两个中断,可以在ISR中检查相应的EXTI线标志位。

以下是如何为STM32F406配置PB6和PB7以分别响应外部中断的示例代码:

#include "stm32f4xx_hal.h"

// 使能GPIOB时钟
#define GPIOB_CLK_ENABLE() __HAL_RCC_GPIOB_CLK_ENABLE()

// 定义PB6和PB7对应的中断线
#define USER_BUTTON_PIN6 GPIO_PIN_6
#define USER_BUTTON_PIN7 GPIO_PIN_7
#define USER_BUTTON_GPIO_PORT GPIOB

// 中断优先级配置
void SystemClock_Config(void);
void MX_NVIC_Init(void) {
    // 优先级分组设置,抢占优先级和子优先级
    HAL_NVIC_SetPriorityGrouping(NVIC_PRIORITYGROUP_0);
    HAL_NVIC_SetPriority(EXTI9_5_IRQn, 0, 0);
}

// 初始化EXTI中断
void EXTI_Config(void) {
    GPIO_InitTypeDef GPIO_InitStructure;
    EXTI_HandleTypeDef EXTI_Config;

    // 使能GPIOB时钟
    GPIOB_CLK_ENABLE();

    // 配置PB6和PB7为中断源
    GPIO_InitStructure.Pin = USER_BUTTON_PIN6 | USER_BUTTON_PIN7;
    GPIO_InitStructure.Mode = GPIO_MODE_IT_FALLING; // 配置中断触发方式为下降沿触发
    GPIO_InitStructure.Pull = GPIO_NOPULL; // 不使用内部上拉或下拉
    GPIO_InitStructure.Speed = GPIO_SPEED_FREQ_HIGH;
    HAL_GPIO_Init(USER_BUTTON_GPIO_PORT, &GPIO_InitStructure);

    // 配置EXTI9_5_IRQn中断
    __HAL_RCC_SYSCFG_CLK_ENABLE();
    HAL_NVIC_EnableIRQ(EXTI9_5_IRQn);

    // 初始化EXTI9_5_IRQn中断
    EXTI_Config.Line = EXTI_LINE_6 | EXTI_LINE_7; // 同时配置PB6和PB7
    EXTI_Config.Mode = EXTI_MODE_INTERRUPT;
    EXTI_Config.Trigger = EXTI_TRIGGER_FALLING;
    EXTI_Config.GPIOSel = GPIOB; // 选择GPIOB作为EXTI的端口
    HAL_EXTI_Init(&EXTI_Config);
}

// EXTI9_5_IRQn中断服务例程
void EXTI9_5_IRQHandler(void) {
    if (__HAL_GPIO_EXTI_GET_IT(USER_BUTTON_PIN6) != RESET) { // 检查PB6是否触发中断
        __HAL_GPIO_EXTI_CLEAR_IT(USER_BUTTON_PIN6); // 清除中断标志位
        // PB6中断处理代码
    }

    if (__HAL_GPIO_EXTI_GET_IT(USER_BUTTON_PIN7) != RESET) { // 检查PB7是否触发中断
        __HAL_GPIO_EXTI_CLEAR_IT(USER_BUTTON_PIN7); // 清除中断标志位
        // PB7中断处理代码
    }
}

int main(void) {
    // 初始化系统
    HAL_Init();
    SystemClock_Config();
    MX_NVIC_Init();
    EXTI_Config();

    // 主循环
    while (1) {
        // 其他任务
    }
}

在上述代码中,我们首先配置了PB6和PB7作为下降沿触发的外部中断源。接着,我们初始化了EXTI9_5_IRQn中断,并在中断服务例程EXTI9_5_IRQHandler中通过检查__HAL_GPIO_EXTI_GET_IT()宏来判断是PB6还是PB7触发了中断。一旦确定了触发中断的引脚,我们便清除中断标志位并执行相应的中断处理代码。

请注意,代码中的SystemClock_Config函数需要根据你的系统时钟配置进行实现,而MX_NVIC_Init函数用于初始化NVIC(嵌套向量中断控制器),设置中断优先级分组和中断优先级。

在实际应用中,您可能需要根据实际硬件连接和项目需求调整中断触发方式、中断服务函数的具体实现以及中断优先级设置。

相关推荐

  1. STM32外部中断可能共享同一个中断向量

    2024-05-16 06:20:17       4 阅读
  2. STM32 外部中断的理解

    2024-05-16 06:20:17       3 阅读

最近更新

  1. .Net Core WebAPI参数的传递方式

    2024-05-16 06:20:17       0 阅读
  2. QT--气泡框的实现

    2024-05-16 06:20:17       1 阅读
  3. LeetCode 968.监控二叉树 (hard)

    2024-05-16 06:20:17       0 阅读
  4. leetcode热题100.完全平方数(动态规划进阶)

    2024-05-16 06:20:17       0 阅读
  5. leetcode328-Odd Even Linked List

    2024-05-16 06:20:17       0 阅读
  6. C 语言设计模式(结构型)

    2024-05-16 06:20:17       0 阅读
  7. v-if 与 v-show(vue3条件渲染)

    2024-05-16 06:20:17       0 阅读
  8. kafka防止消息丢失配置

    2024-05-16 06:20:17       0 阅读

热门阅读

  1. STM32 HAL TM1637使用

    2024-05-16 06:20:17       3 阅读
  2. Nginx-04-Docker Nginx

    2024-05-16 06:20:17       2 阅读
  3. socket介绍

    2024-05-16 06:20:17       4 阅读
  4. Linux系统安装MongoDB流程

    2024-05-16 06:20:17       3 阅读
  5. mysql入门与mongoDB入门

    2024-05-16 06:20:17       3 阅读
  6. Docker学习(10)搭建kubernetes集群

    2024-05-16 06:20:17       4 阅读
  7. 基于C++的OpenCV支持的KCF目标跟踪

    2024-05-16 06:20:17       2 阅读
  8. MongoDB聚合运算符:$zip

    2024-05-16 06:20:17       3 阅读
  9. Jetpack Compose 初探

    2024-05-16 06:20:17       3 阅读
  10. 在ubuntu安装Docker容器

    2024-05-16 06:20:17       3 阅读