天天看點

HAL庫中同時實作微秒級us以及毫秒級ms延時

HAL庫要實作毫秒延時很簡單,直接調用HAL_Delay();延時函數就可以了。(這個函數每隔1ms就會産生一次中斷)

但是,要實作微秒的話。。。貌似就沒有現成的方法了。

是以我這邊通過基礎定時器Timer6,通過輪詢的方式實作微秒級延時。(對于微秒級延時,如果通過中斷方式實作會導緻過于頻繁的進入中斷,幹擾其他中斷的及時響應)

首先在STM32CubeMx中打開Timer6并按如下方式配置:(timer6時鐘是72M)

HAL庫中同時實作微秒級us以及毫秒級ms延時

注意,在NVIC Settings中的中斷是不需要使能的:

HAL庫中同時實作微秒級us以及毫秒級ms延時

然後生成代碼,并在tim.c中添加如下代碼:(當然還得在tim.h中添加函數聲明)

/* USER CODE BEGIN 1 */
void Delay_us(uint16_t us)
{
//	uint16_t counter= us & 0xffff;

  HAL_TIM_Base_Start(&htim6);
  __HAL_TIM_SetCounter(&htim6,0);       // 對上次延時産生的計數清零

  us = (us > 4)?(us-2):1;    // 對counter的改變是為了讓短時長的延時更精确(通過示波器校正過,timer的時鐘是72M)

  while( us > __HAL_TIM_GetCounter(&htim6) ) {};		

  HAL_TIM_Base_Stop(&htim6);
}
/* USER CODE END 1 */
           

這樣就可以直接調用Delay_us();函數進行微秒級延時啦。

繼續閱讀