本文主要是介绍FreeRTOS中实现延时1us,1ms,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
1us
void Delay_us(int16_t nus)
{UINT ticks;UINT told,tnow,reload,tcnt=0;if((0x0001&(SysTick->CTRL)) ==0) //定时器未工作vPortSetupTimerInterrupt(); //初始化定时器reload = SysTick->LOAD; //获取重装载寄存器值ticks = nus * (SystemCoreClock / 1000000); //计数时间值vTaskSuspendAll();//阻止OS调度,防止打断us延时told=SysTick->VAL; //获取当前数值寄存器值(开始时数值)while(1){tnow=SysTick->VAL; //获取当前数值寄存器值if(tnow!=told) //当前值不等于开始值说明已在计数{ if(tnow<told) //当前值小于开始数值,说明未计到0tcnt+=told-tnow; //计数值=开始值-当前值else //当前值大于开始数值,说明已计到0并重新计数tcnt+=reload-tnow+told; //计数值=重装载值-当前值+开始值 (//已从开始值计到0) told=tnow; //更新开始值if(tcnt>=ticks)break; //时间超过/等于要延迟的时间,则退出.} } xTaskResumeAll(); //恢复OS调度
}
1ms
void delay_1ms(uint32_t count)
{uint32_t ticks;uint32_t told,tnow,reload,tcnt=0;reload = SysTick->LOAD; //获取重装载寄存器值ticks = count * (SystemCoreClock / 1000); //计数时间值 括号里的代表1us秒嘀嗒定时器的value会向下降多少值told=SysTick->VAL; //获取当前数值寄存器值(开始时数值)while(1){tnow=SysTick->VAL; //获取当前数值寄存器值if(tnow!=told) //当前值不等于开始值说明已在计数{ if(tnow<told) //当前值小于开始数值,说明未计到0tcnt+=told-tnow; //计数值=开始值-当前值else //当前值大于开始数值,说明已计到0并重新计数tcnt+=reload-tnow+told; //计数值=重装载值-当前值+开始值 (已 从开始值计到0) told=tnow; //更新开始值if(tcnt>=ticks)break; //时间超过/等于要延迟的时间,则退出.} }
}
void Delay_ms(int16_t t)
{vTaskDelay(1);
}
这篇关于FreeRTOS中实现延时1us,1ms的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!