HAL无阻塞延时

//实现间隔time_interval时间点亮红灯(此时间间隔并不是绝对的,是大于等于的关系)
//用于系统要求无延时且延时时间粗略的场合,比如间隔一段时间采样数据,间隔一段时间点亮状态灯等
//HAL_GetTick()是系统ms级别滴答时间
//轮询一遍此函数的时间显然要小于设置的时间间隔time_interval,否则每次都会触发也就起不到间隔的目的
uint32_t time_interval = 500;
void Light_SetStatus(void) {
  
if(time_interval != 0) { uint32_t tick; static uint32_t interval_cnt = 0; tick = HAL_GetTick() / time_interval; if(tick > interval_cnt) {
       //这里加入间隔时间到的功能
Light_Red(LIGHT_ON); } interval_cnt = tick; } }

 另一种方式:

void Light_SetStatus(void)
{
  if(time_interval != 0)
    {
 	  static uint32_t delay_start = 0;

	  if(delay_start == 0)
	  {
	    delay_start = HAL_GetTick();
	  }

	  if(HAL_GetTick() - delay_start > interval_cnt)
	  {
	    delay_start =0;
	    ret = Light_Red(LIGHT_ON);
	  }   
    }
}

  

第一种方式中interval_cnt会以自增的方式不断变大,所以可以利用这点做一些其它事情!

原文地址:https://www.cnblogs.com/yeshenmeng/p/10608416.html