Skip to content

2.3 外部中断 EXTI

单片机代码执行原理

中断

  • 抢占优先级
  • 子优先级

虚函数

前缀 __weak

若实函数存在则用实函数,否则使用虚函数

工程配置

  • 按键
    • 查找引脚
    • 设置外部中断通道
    • 检测模式选择
    • 输入模式选择
    • 使能
c
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin) {
    switch (GPIO_Pin) {
        // 3号外部中断通道
    case GPIO_PIN_3: {
        HAL_GPIO_TogglePin(GPIOE, GPIO_PIN_5);
        // 亮灯灭灯
    } break;
    default:
        break;
    }
}

中断代码分析

c
void HAL_GPIO_EXTI_IRQHandler(uint16_t GPIO_Pin) {
    /* EXTI line interrupt detected */
    if (__HAL_GPIO_EXTI_GET_IT(GPIO_Pin) != 0x00u) {
        __HAL_GPIO_EXTI_CLEAR_IT(GPIO_Pin); // 重置
        HAL_GPIO_EXTI_Callback(GPIO_Pin); // 调用中断函数 若无则运行虚函数
    }
}

按键消抖

在中断函数中延时检测

C
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin) {
    switch (GPIO_Pin) {
        // 3号外部中断通道
    case GPIO_PIN_3: {
        HAL_Delay(50); // 消抖
        if (HAL_GPIO_ReadPin(GPIOE, GPIO_PIN_3) == RESET) {
            HAL_GPIO_TogglePin(GPIOE, GPIO_PIN_5);
        }
        // 亮灯灭灯
    } break;
    default:
        break;
    }
}

略过了不稳定时间

很不优雅,而且会影响其他线程执行

硬件消抖

外部并联电容器,消除高频杂波

TIM 定时器

定时检测按键状态,在下一课进行讲解