1. 程式人生 > >STM32 HAL庫學習系列第3篇 常使用的幾種延時方式

STM32 HAL庫學習系列第3篇 常使用的幾種延時方式

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; //清空計數器 
 }