diff --git a/rt-thread-version/rt-thread-standard/programming-manual/timer/timer.md b/rt-thread-version/rt-thread-standard/programming-manual/timer/timer.md index 4ce502c938e0254b29001de578b50f650e522588..8e933c73e2801ffc248c76f67fadecdd1e8d7785 100644 --- a/rt-thread-version/rt-thread-standard/programming-manual/timer/timer.md +++ b/rt-thread-version/rt-thread-standard/programming-manual/timer/timer.md @@ -512,15 +512,38 @@ RT-Thread 定时器的最小精度是由系统时钟节拍所决定的(1 OS Ti #include void rt_hw_us_delay(rt_uint32_t us) { - rt_uint32_t delta; + rt_uint32_t ticks; + rt_uint32_t told, tnow, tcnt = 0; + rt_uint32_t reload = SysTick->LOAD; + /* 获得延时经过的 tick 数 */ - us = us * (SysTick->LOAD/(1000000/RT_TICK_PER_SECOND)); + ticks = us * reload / (1000000 / RT_TICK_PER_SECOND); /* 获得当前时间 */ - delta = SysTick->VAL; - /* 循环获得当前时间,直到达到指定的时间后退出循环 */ - while (delta - SysTick->VAL< us); + told = SysTick->VAL; + while (1) + { + /* 循环获得当前时间,直到达到指定的时间后退出循环 */ + tnow = SysTick->VAL; + if (tnow != told) + { + if (tnow < told) + { + tcnt += told - tnow; + } + else + { + tcnt += reload - tnow + told; + } + told = tnow; + if (tcnt >= ticks) + { + break; + } + } + } } - ``` -其中入口参数 us 指示出需要延时的微秒数目,这个函数只能支持低于 1 OS Tick 的延时,否则 SysTick 会出现溢出而不能够获得指定的延时时间。 +其中入口参数 us 指示出需要延时的微秒数目,这个函数只能支持低于 1 OS Tick 的延时。 + +> 注意: 此接口应该由 BSP 制作者根据具体的芯片特性实现,以上代码仅供参考!