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 定时器
定时检测按键状态,在下一课进行讲解