wenbo2005.online

学习记录 / STM32

外部中断+定时器消抖

STM322023-12-26

常规的HAL_Delay消抖占用CPU时间,所以采用定时器定时检测

程序思路:

当下降沿产生,程序进入外部中断回调函数,可以在里面开启定时器,往后数10ms再检测IO口电平,若为低电平,则实现电平翻转点亮LED灯等程序。

1,开启一个外部中断引脚,选择External Interrupt Mode with Falling edge trigger detection(下降沿触发检测),并上拉电阻;(注意开启中断!!)

2,开启计时器,先计算好定时检测的时间,这里是按键按下后10ms,再检测按键是否还是处于按下状态;

        Tout=(arr+1)*(psc+1)/Tclk

这里arr = 72-1,psc = 10000-1,Tclk是1/72000000,Tout是已知的10ms;

3,程序实现:

    void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)//=======================外部中断回调函数
    {
             if(GPIO_Pin == KEY_GPIO_PIN)//==========================判断引脚
                {
                         HAL_TIM_Base_Start_IT(&htim1);//======================开启定时器,数10ms
              }

    }

    void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)//================定时器溢出回调函数
    {
          if(htim==(&htim1))
          {
                HAL_TIM_Base_Stop_IT(&htim1);//==============关闭定时器,为下次做准备
                   if(HAL_GPIO_ReadPin(KEY_GPIO_Port,KEY_Pin)==0)//===================确定为低电平
                        HAL_GPIO_TogglePin(LED_GPIO_PORT,LED_PIN);//=====================================需要执行的程序
          }
    }

(暂时不适长按)