STM32 HAL 定時器代替HAL_Delay延時函式

quanshimutou發表於2024-07-25

因為不知道的原因SysTick_Handler不進入中斷,HAL_IncTick函式中的uwTick計數值不能自增,延時函式卡死。

用定時器代替系統時鐘計數,並重寫HAL_Delay延時函式。
不使用中斷。

需要找一個32位計數週期的定時器,才能和32位計數值匹配。
我選擇的TIM2,STM32H750的TIM2掛載在APB1上,時鐘樹設定為60MHz,

image

60000預分頻,週期剛好1ms,如果時鐘太快,可以考慮兩個定時器串聯。

不用開啟中斷,這是重寫的HAL_Delay函式。

void HAL_Delay(uint32_t Delay)
{
  uint32_t tickstart = __HAL_TIM_GET_COUNTER(&htim2);
  uint32_t wait = Delay;

  /* Add a freq to guarantee minimum wait */
  if (wait < HAL_MAX_DELAY)
  {
    wait += (uint32_t)(uwTickFreq);
  }
  uint32_t ticknow = __HAL_TIM_GET_COUNTER(&htim2);
  while ((ticknow - tickstart) < wait)
  {
	  ticknow = __HAL_TIM_GET_COUNTER(&htim2);
  }
}

相關文章