基于HAL_GetTick()函数实现非阻塞式延时
首先在使用HAL_GetTick()函数时一般会存在两个变量:
uint32_tLastTime;//用以存放上一次运行时间uint32_tnow;//用于存放当前系统时间,且该函数一般应放在while中不断刷新以双LED不同闪烁时间举例,具体写法如下
//为两个LED单独建立相应时间戳uint32_tled0_last_tick=HAL_GetTick();uint32_tled1_last_tick=led0_last_tick;while(1){uint32_tnow=HAL_GetTick();/* LED0 每 300 ms 翻转一次。 */if(now-led0_last_tick>=300){led0_last_tick=now;HAL_GPIO_TogglePin(LED0_GPIO_Port,LED0_Pin);}/* LED1 每 500 ms 翻转一次。 */if(now-led1_last_tick>=500){led1_last_tick=now;HAL_GPIO_TogglePin(LED1_GPIO_Port,LED1_Pin);}}写法注意:
1.在面对不同延时要求时,应当为每个延时任务单独建立时间戳。如果公用一个时间戳会造成第一个延时任务结束后导致计时清零,从而无法触发其他延时任务的判断条件
且在为多个延时任务建立时间戳时应当保证各个时间戳时间一致
//正确写法如下:uint32_tled0_last_tick=HAL_GetTick();uint32_tled1_last_tick=led0_last_tick;//错误法如下:uint32_tled0_last_tick=HAL_GetTick();uint32_tled1_last_tick=HAL_GetTick();;/* 在错误写法中为每个时间戳都进行了赋值,这就有可能造成由于编译器效率问题导致LED0与LED1时间戳时间不一致的问题产生 */2.在延时要求一致时,可以采用同一个LastTime作为到达计时时间的标志位