基于定时器的按键计时操作
原理:基于STM32G431RBTX系列单片机,HAL库设置定时器定时时间为10ms,每10ms按键检测,当按键按下时变量加1 ,当变量为200时,按键按下时间为2S,触发其余操作。
HAL库配置
定时器
使能定时器1
配置预分频值和自动重装载寄存器
预分频(PCS)和自动重装载寄存器(ARR)的配置依照该公式
定时时间(秒)=(PSC+1)×(ARR+1)/定时器时钟频率(Hz)
使能定时器中断
对以上三种中断方式做解释:
TIM1 break interrupt and TIM15 global interrupt刹车中断 和 TIM15全局中断
TIM1 update interrupt and TIM16 global interrupt 计数器溢出
TIM1 trigger and commutation interrupts and TIM17 global interrupt 定时器作为从模式时,接收到外部触发信号时触发
TIM1 capture compare interrupt 输入捕获:检测外部信号
我们需要达到定时效果,所以选TIM1 update interrupt and TIM16 global interrupt选项
这里我们的定时器就配置好了
将其他设置配置好之后进入Keil点击tim.c文件可以看到我们在CubeMx中配置的TIM1
主函数中我们需要使能定时器指令为: HAL_TIM_Base_Start_IT(&htim1);
在Drivers/STM32G4xx_HAL_Dricer文件夹下点击 stm32g4xx_hal_tim.c文件在图片位置找到该弱定义的回调函数
使用方法:
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim){
if(htim->Instance == TIM1){
//填写你想在每一个10ms结束时想做的事情,例如我的
if(HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_1) == 0)//每10ms检测按键按下
{
startl++;//变量加1
}
if(startl>=200)//200*10ms后,也就是2秒,执行指令
{
lcd_middledisplay(Line1, "YES");
}
}
}
到现在就完成了定时器定时执行某项任务的操作,请继续加油学习
