在stm32f1xx_ll_utils.c中提供的延时函数,以下标红语句为什么要多加1呢?延时1ms不就变成2ms了吗? void LL_mDelay(uint32_t Delay) { __IO uint32_t tmp = SysTick->CTRL; /* Clear the COUNTFLAG first */ /* Add this code to indicate that local variable is not used */ ((void)tmp); /* Add a period to guaranty minimum wait */ if (Delay < LL_MAX_DELAY) { Delay++; } while (Delay) { if ((SysTick->CTRL & SysTick_CTRL_COUNTFLAG_Msk) != 0U) { Delay--; } } } |
如果是延时1ms,不加1的话,刚好计数器到0,那么执行减1后,不就立刻结束延时了么,所以是为了保证最小的等待时间。
mark,签到+1
研究库代码如此仔细,值得学习! 首先,你说的情况是存在的,1ms延时可能变成2ms,准确地讲是可能变成接近2ms,永远到不了2ms这个极限。 ST库函数里一般将systick 计数器的分辨率设置为1ms,换言之,我们就得接受1ms内的误差。 具体到这里,代码在这个地方加1是为了确保至少1ms的延迟,结合上面的分析,误差也不会大过1ms. 当然,这里不考虑其它抢占、堵塞等问题。 最后,这个延时函数不是一成不变的,我们可以根据自己需求调整分辨率和自行组织实现代码,包括上面 提到的加1操作。