引用变量及函数:
__IO uint32_t uwTick;
__weak uint32_t HAL_GetTick(void)
{
return uwTick;
}
源代码:
__weak void HAL_Delay(__IO uint32_t Delay)
{
uint32_t tickstart = 0;
tickstart = HAL_GetTick();
while((HAL_GetTick() - tickstart) < Delay)
{
}
}
求证:
如下假设:
由题设可知: 当每个时间Tick(滴答时钟) 到来时uwTick加1;
需要延时Delay = 0x0D;
此时 获得 tickstart = 0xFFFF FFFF - 0x0A==》因此可知此时 uwTick = 0xFFFF FFFF - 0x0A;
经过0x0B次滴答时钟后,uwTick = 0xFFFF FFFF - 0x0A + 0x0B) = 0x1 0000 0000==》此时数据溢出uwTick = 0;
(uint32_t)uwTick - (uint32_t)(tickstart)= 0x00 - (0xFFFF FFFF - 0x0A) = 0x00 + (uint32_t) 0xA - 0xFFFF FFFF = (uint32_t) 0x FFFFFFFF00000001 = 0x01;
滴答时钟再加(+)1;
(uint32_t)uwTick - (uint32_t)(tickstart)= 0x01 - (0xFFFF FFFF - 0x0A) = 0x01 - (uint32_t) 0xA - 0xFFFF FFFF = (uint32_t) 0x FFFFFFFF00000002 = 0x02;
再(+)1;
(uint32_t)uwTick - (uint32_t)(tickstart)= 0x01 - (0xFFFF FFFF - 0x0A) = 0x02 - (uint32_t) 0xA - 0xFFFF FFFF = (uint32_t) 0x FFFFFFFF00000003 = 0x03;
…… 继续累加到0xD
(uint32_t)uwTick - (uint32_t)(tickstart)= 0x0D- (0xFFFF FFFF - 0x0A) = 0x0D - (uint32_t) 0xA - 0xFFFF FFFF = (uint32_t) 0x FFFFFFFF00000003 = 0x0D;
延时时间到
(HAL_GetTick() - tickstart) = uwTick - tickstart = 0x0D ==》等于要求的延时 Delay = 0x0D ,定时到退出while循环;
从而显然可知:
当Tick溢出为0后,变为:(0 - tickstart ) > Timeout,一个负数会大于一个正数么? 系统Tick频率设置为1毫秒中断一次,那么0xFFFFFFFF毫秒大约为49.71026961805556天,也就是49天以后会产生第一次溢出
不成立
后记
延时时间Delay不能超过溢出数据类型的最大长度,否则while将永远的循环;
参考内容:
1.、http://www.stmcu.org/module/forum/thread-605615-1-1.html
wiwa 2016.12.13