void 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)
{
}
}
发现实现本身是一个弱函数,支持我们重现实现,这里我们不用重新实现,因为他的实现依赖于系统嘀嗒定时器,供系统本身使用,默认1ms出发一次嘀嗒中断。
我们追进去看看HAL_GetTick() 的实现:
__weak uint32_t HAL_GetTick(void)
{
return uwTick;
}
我们全局搜索一下它
发现在标红文件中该数据又发生改变,追进去看看如下:
__weak void HAL_IncTick(void)
{
uwTick += uwTickFreq;
}
我呢再看一下uwTickFreq的定义:
HAL_TickFreqTypeDef uwTickFreq = HAL_TICK_FREQ_DEFAULT; /* 1KHz */
我们再看一下HAL_TICK_FREQ_DEFAULT的定义:
typedef enum
{
HAL_TICK_FREQ_10HZ = 100U,
HAL_TICK_FREQ_100HZ = 10U,
HAL_TICK_FREQ_1KHZ = 1U,
HAL_TICK_FREQ_DEFAULT = HAL_TICK_FREQ_1KHZ
} HAL_TickFreqTypeDef;
可以看到HAL_TICK_FREQ_DEFAULT的数值是1,也就是uwTick会加1,那么什么时候系统会自动调用void HAL_IncTick(void)呢?
是在嘀嗒中断处理程序中 会调用的。
void SysTick_Handler(void)
{
/* USER CODE BEGIN SysTick_IRQn 0 */
/* USER CODE END SysTick_IRQn 0 */
HAL_IncTick();
HAL_SYSTICK_IRQHandler();
/* USER CODE BEGIN SysTick_IRQn 1 */
/* USER CODE END SysTick_IRQn 1 */
}
而系统嘀嗒默认1ms触发一次中断,也就是1ms之后uwTick会加1,
所以HAL_DELAY的实现是毫秒级别的实现,且依赖于系统嘀嗒定时器。