rt_hw_us_delay的实现有问题,针对这一问题进行了修改

This commit is contained in:
cyz 2021-06-09 12:35:52 +08:00
parent 2961b37104
commit 796c8affdd

View File

@ -113,16 +113,32 @@ void _Error_Handler(char *s, int num)
*/ */
void rt_hw_us_delay(rt_uint32_t us) void rt_hw_us_delay(rt_uint32_t us)
{ {
rt_uint32_t start, now, delta, reload, us_tick; rt_uint32_t ticks;
start = SysTick->VAL; rt_uint32_t told, tnow, tcnt = 0;
reload = SysTick->LOAD; rt_uint32_t reload = SysTick->LOAD;
us_tick = SystemCoreClock / 1000000UL;
do ticks = us * reload / (1000000 / RT_TICK_PER_SECOND);
told = SysTick->VAL;
while (1)
{ {
now = SysTick->VAL; tnow = SysTick->VAL;
delta = start >= now ? start - now : reload + start - now; if (tnow != told)
{
if (tnow < told)
{
tcnt += told - tnow;
}
else
{
tcnt += reload - tnow + told;
}
told = tnow;
if (tcnt >= ticks)
{
break;
}
}
} }
while (delta < us_tick * us);
} }
/** /**