STM32 HAL庫學習系列第3篇 常使用的幾種延時方式
阿新 • • 發佈:2019-01-08
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 中斷延時----利用定時器計時3 優選方式------獲取系統時鐘計時,非阻塞式延時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++; //回撥函式 }
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; //清空計數器 }