外部中断EXTI

单片机代码执行原理#

中断#

  • 抢占优先级
  • 子优先级

虚函数#

前缀 __weak

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

工程配置#

  • 按键
    • 查找引脚
    • 设置外部中断通道
    • 检测模式选择
    • 输入模式选择
    • 使能
1
2
3
4
5
6
7
8
9
10
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;
}
}

中断代码分析#

1
2
3
4
5
6
7
8
9
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);//调用中断函数 若无则运行虚函数
}
}

按键消抖#

在中断函数中延时检测#

1
2
3
4
5
6
7
8
9
10
11
12
13
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定时器#

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