From 21bc3c906d31b96ad0f6c713a8b57a16ddca9d98 Mon Sep 17 00:00:00 2001 From: guozhanxin <1171407708@qq.com> Date: Wed, 31 Mar 2021 10:35:10 +0800 Subject: [PATCH] =?UTF-8?q?=E5=AE=8C=E5=96=84=20timer=20=E6=96=87=E6=A1=A3?= =?UTF-8?q?=E8=AF=B4=E6=98=8E?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../programming-manual/timer/timer.md | 37 +++++++++++++++---- 1 file changed, 30 insertions(+), 7 deletions(-) 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 4ce502c..8e933c7 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 制作者根据具体的芯片特性实现,以上代码仅供参考! -- Gitee