初级会员

- 积分
- 76
- 金钱
- 76
- 注册时间
- 2021-4-7
- 在线时间
- 15 小时
|
发表于 2024-3-15 15:12:40
|
显示全部楼层
void delay_us_freertos(u32 nus)
{
u32 ticks;
u32 told,tnow,reload,tcnt=0;
if((0x0001&(SysTick->CTRL)) ==0) //定时器未工作
vPortSetupTimerInterrupt(); //初始化定时器
reload = SysTick->LOAD; //获取重装载寄存器值
ticks = nus * (SystemCoreClock / 1000000); //计数时间值
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; //时间超过/等于要延迟的时间,则退出.
}
}
}
可以试试这个 |
|