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 }