首先是中断要比查询方式不耗费指令,主程序可以完成其它任务。
其次,如代码中所示。uwTick是个全局变量,任何功能都可以拿uwTick当作计数源。
比如HAL库里的延时函数是这么写的:
void HAL_Delay(uint32_t Delay)
{
uint32_t tickstart = HAL_GetTick(); //取得当前Tick计数值
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)//进入循环,等待当前Tick等于结束时的Tick
{
}
}
再看另一处代码,这里不是简单地延时,而是等待超时
static HAL_StatusTypeDef RTC_EnterInitMode(RTC_HandleTypeDef* hrtc)
{
uint32_t tickstart = 0U;
tickstart = HAL_GetTick(); //取出当前Tick
/* Wait till RTC is in INIT state and if Time out is reached exit */
while((hrtc->Instance->CRL & RTC_CRL_RTOFF) == (uint32_t)RESET) //进入循环
{
if((HAL_GetTick() - tickstart) > RTC_TIMEOUT_VALUE) //当前Tick和进入函数时记录的Tick相差大于预定值RTC_TIMEOUT_VALUE
{ //确定超时,函数返回一个超时
return HAL_TIMEOUT;
}
}
/* Disable the write protection for RTC registers */
__HAL_RTC_WRITEPROTECTION_DISABLE(hrtc);
return HAL_OK;
}
通过上面两段代码,可以看到,在中断函数里只是简单地做个累加,就可以实现不同的应用。