-
准备工作
1.1 配置定时器
利用单片机外设配置定时器中断 — 1ms周期(该触发周期决定非阻塞延时精度)
1.2 定义全局变量以及编写中断服务函数
uint32_t delay_tick = 0;
void TIM2_IRQHandler(void){
if(TIM_GetITStatus(TIM2,TIM_IT_Update)==SET){
delay_tick++; //1ms自加一次
delay_tick&=0xFFFFFFFF; //防止溢出
TIM_ClearITPendingBit(TIM2,TIM_IT_Update); //清除中断标志位
}
}
uint32_t GetDelayTick(void)
{
return delay_tick;
}
1.3 定义全局变量以及编写ms精度延时函数
uint32_t tick = 0;
bool IsTimeOut(uint32_t *tick, uint32_t delay_time){
uint32_t temp = 0;
/* 获取上一次延时到时时刻到本次调用该函数时间间隔 */
if(*tick <= GetDelayTick()){
temp = GetDelayTick() - *tick;
}
//delay_tick已经产生溢出
else{
temp = 0xFFFFFFFF - *tick + GetDelayTick();
}
/* 判断是否已经超过延时时间 */
if(temp >= delay_time){
*tick = sysTick; //记录本次延时到时时刻
return true; //延时时间到,返回true
}
return false;
}
版权声明:本文为weixin_45660027原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。