前言
在准备蓝桥杯嵌入式的时候,注意到了它——uwTick,以前没有深入了解过它,今天明白了它的含义和用法后感到它真是太棒了!在此记录以下其用法。
源代码
先引出我们最熟悉的延迟函数:
HAL_Delay(uint32_t Delay)
我们找到其源码:
__weak void HAL_Delay(uint32_t Delay)
{
uint32_t tickstart = HAL_GetTick();
uint32_t wait = Delay;
/* Add a freq to guarantee minimum wait */
if (wait < HAL_MAX_DELAY)
{
wait += (uint32_t)(uwTickFreq);
}
while ((HAL_GetTick() - tickstart) < wait)
{
}
}
HAL_Delay()的源码里出现了一个调用函数:
HAL_GetTick()
我们找到其源码:
__weak uint32_t HAL_GetTick(void)
{
return uwTick;
}
好了,现在找到我们今天学习的uwTick了,HAL_Delay()的延迟原理就是首先获取一次uwTick的值,赋给一个uint32_t类型的变量,然后在while循环里不停地获取新的uwTick值用来减去第一次的uwTick的值,从而实现延迟的效果。
uwTick——就是当单片机上电后一直进行累加计算的一个变量,数据类型为uint32_t,有兴趣的同学可以算一下单片机上电多长时间后其才会溢出归零。
那么多久uwTick才会加一呢?
我们回到HAL_Delay()的源码:
__weak void HAL_Delay(uint32_t Delay)
{
uint32_t tickstart = HAL_GetTick();
uint32_t wait = Delay;
/* Add a freq to guarantee minimum wait */
if (wait < HAL_MAX_DELAY)
{
wait += (uint32_t)(uwTickFreq);
}
while ((HAL_GetTick() - tickstart) < wait)
{
}
}
注意此处:
/* Add a freq to guarantee minimum wait */
if (wait < HAL_MAX_DELAY)
{
wait += (uint32_t)(uwTickFreq);
}
关键解释: /* Add a freq to guarantee minimum wait */——添加一个频率以保证最小等待时间
找到uwTickFreq的定义:
__IO uint32_t uwTick;
uint32_t uwTickPrio = (1UL << __NVIC_PRIO_BITS); /* Invalid PRIO */
HAL_TickFreqTypeDef uwTickFreq = HAL_TICK_FREQ_DEFAULT; /* 1KHz */
好了,这下找到了,频率为1KHz。也就是1ms计数一次…完结…