STM32 HAL庫學習 常使用的幾種延時方式

1   自帶的hal_delay 函數    毫秒級延遲

void HAL_Delay(__IO uint32_t Delay)
{
  uint32_t tickstart = HAL_GetTick(); //獲取tick值(毫秒)
  uint32_t wait = Delay;
 
  /* Add a period to guarantee minimum wait */
  if (wait < HAL_MAX_DELAY)
  {
     wait++;//傳參,延時的時間
  }
 
  while((HAL_GetTick() - tickstart) < wait)
  {
  }
}

也可以配置爲us延時,改變函數參數

配置方法:也可以配置爲1us

// HAL_RCC_GetHCLKFreq()/1000 1ms中斷一次,即HAL_Delay函數延時基準爲1ms
// HAL_RCC_GetHCLKFreq()/100000  10us中斷一次,即HAL_Delay函數延時基準爲10us
// HAL_RCC_GetHCLKFreq()/1000000 1us中斷一次,即HAL_Delay函數延時基準爲1us
HAL_SYSTICK_Config(HAL_RCC_GetHCLKFreq()/1000000);  // 配置並啓動系統滴答定時器

2 中斷延時----利用定時器計時

int main(void)
{
  HAL_Init();
  SystemClock_Config();
  LED_GPIO_Init();
  /* 基本定時器初始化:1ms中斷一次 */
  BASIC_TIMx_Init();
  /* 在中斷模式下啓動定時器 */
  HAL_TIM_Base_Start_IT(&htimx);
 
  while (1)
  {
    if(timer_count==1000)
    {
      timer_count=0;
      LED1_TOGGLE;
    }
  }
}
 
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
  timer_count++;  //回調函數
}

3 優選方式------獲取系統時鐘計時,非阻塞式延時

 void delay_ms(int32_t nms) 
 {
  int32_t temp; 
  SysTick->LOAD = 8000*nms; 
  SysTick->VAL=0X00;//清空計數器 
  SysTick->CTRL=0X01;//使能,減到零是無動作,採用外部時鐘源 
  do 
  { 
       temp=SysTick->CTRL;//讀取當前倒計數值 
  }
     while((temp&0x01)&&(!(temp&(1<<16))));//等待時間到達 
     
     SysTick->CTRL=0x00; //關閉計數器 
     SysTick->VAL =0X00; //清空計數器 
 } 

 

謝謝csdn大佬的博文,學習了!原作地址請點我

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章