关于使用freertos时,延迟微秒的解决方法

单片机:HD32L190FCUA

环境:keil5,使用了freertos,且嘀嗒定时器为1ms,即configTICK_RATE_HZ为1000

问题:使用vTaskDelay延迟的话,最少也只能延迟1ms,而有些传感器,通信的期间,只需要us的延迟,该怎么做

 

解决:

还是使用sysctick嘀嗒定时器

void delay_us(u32 nus)
{
    u32 ticks;
    u32 told,tnow,reload,tcnt=0;

    reload = SysTick->LOAD;                     //获取重装载寄存器值
    ticks = nus * (SystemCoreClock / 1000000);  //计数时间值   括号里的代表1us秒嘀嗒定时器的value会向下降多少值
    told=SysTick->VAL;                          //获取当前数值寄存器值(开始时数值)

    while(1)
    {
          tnow=SysTick->VAL;          //获取当前数值寄存器值
          if(tnow!=told)              //当前值不等于开始值说明已在计数
          {         

                 if(tnow<told)             //当前值小于开始数值,说明未计到0
                      tcnt+=told-tnow;     //计数值=开始值-当前值

                 else                  //当前值大于开始数值,说明已计到0并重新计数
                        tcnt+=reload-tnow+told;   //计数值=重装载值-当前值+开始值  (已
                                                  //从开始值计到0) 
                 told=tnow;                //更新开始值
                 if(tcnt>=ticks)break;     //时间超过/等于要延迟的时间,则退出.
          } 
    }     
}

 

posted @ 2022-07-30 11:50  kingzhan  阅读(2950)  评论(0编辑  收藏  举报