常规的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);//=====================================需要执行的程序
}
}
(暂时不适长按)