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大佬的博文,學習了!原作地址請點我