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


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

 

 1 void HAL_Delay(__IO uint32_t Delay)
 2 {
 3   uint32_t tickstart = HAL_GetTick(); //獲取tick值(毫秒)
 4   uint32_t wait = Delay;
 5  
 6   /* Add a period to guarantee minimum wait */
 7   if (wait < HAL_MAX_DELAY)
 8   {
 9      wait++;//傳參,延時的時間
10   }
11  
12   while((HAL_GetTick() - tickstart) < wait)
13   {
14   }
15 }

 

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

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

1 // HAL_RCC_GetHCLKFreq()/1000 1ms中斷一次,即HAL_Delay函數延時基准為1ms
2 // HAL_RCC_GetHCLKFreq()/100000  10us中斷一次,即HAL_Delay函數延時基准為10us
3 // HAL_RCC_GetHCLKFreq()/1000000 1us中斷一次,即HAL_Delay函數延時基准為1us
4 HAL_SYSTICK_Config(HAL_RCC_GetHCLKFreq()/1000000);  // 配置並啟動系統滴答定時器

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

 1 int main(void)
 2 {
 3   HAL_Init();
 4   SystemClock_Config();
 5   LED_GPIO_Init();
 6   /* 基本定時器初始化:1ms中斷一次 */
 7   BASIC_TIMx_Init();
 8   /* 在中斷模式下啟動定時器 */
 9   HAL_TIM_Base_Start_IT(&htimx);
10  
11   while (1)
12   {
13     if(timer_count==1000)
14     {
15       timer_count=0;
16       LED1_TOGGLE;
17     }
18   }
19 }
20  
21 void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
22 {
23   timer_count++;  //回調函數
24 }

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

 1  void delay_ms(int32_t nms) 
 2  {
 3   int32_t temp; 
 4   SysTick->LOAD = 8000*nms; 
 5   SysTick->VAL=0X00;//清空計數器 
 6   SysTick->CTRL=0X01;//使能,減到零是無動作,采用外部時鍾源 
 7   do 
 8   { 
 9        temp=SysTick->CTRL;//讀取當前倒計數值 
10   }
11      while((temp&0x01)&&(!(temp&(1<<16))));//等待時間到達 
12      
13      SysTick->CTRL=0x00; //關閉計數器 
14      SysTick->VAL =0X00; //清空計數器 
15  } 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM