因?yàn)?u>STM32 HAL庫(kù)中僅有對(duì)HAl_Delay()毫秒級(jí)的延時(shí),為實(shí)現(xiàn)精確的微秒級(jí)延時(shí),就不得不修改Systick,但由于HAL庫(kù)內(nèi)部使用其作為超時(shí)判斷等操作,對(duì)其修改會(huì)發(fā)生不可預(yù)期的錯(cuò)誤,不建議修改。因此,使用通用定時(shí)器進(jìn)行定時(shí)操作。
參考網(wǎng)上例程,使用定時(shí)器中斷方式實(shí)現(xiàn)延時(shí),代碼如下:
TIM3溢出時(shí)間=72MHz/(71+1)/(0+1)=1Mhz=1us
計(jì)數(shù)模式:向上計(jì)數(shù)模式
使能TIM3中斷
*/
__IO staTIc uint32_t usDelay=0;
void Delayms(uint32_t ms)
{
Delayus(ms*1000);
}
void Delayus(uint32_t us)
{
usDelay=us;
HAL_TIM_Base_Start_IT(&htim3);
while(usDelay);
HAL_TIM_Base_Stop_IT(&htim3);
}
//重寫回調(diào)函數(shù)
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
if(htim-》Instance == TIM3)
{
if(usDelay!=0)
{
usDelay--;
}
}
}
雖然說(shuō)以上程序的并沒(méi)什么錯(cuò)誤,但在實(shí)際運(yùn)行中,卻無(wú)法得到正確的運(yùn)行。同時(shí),在進(jìn)行Debug調(diào)試時(shí),單步執(zhí)行又可以正常運(yùn)行。
主要原因在于:中斷間隔時(shí)間太短,導(dǎo)致中斷函數(shù)還沒(méi)有運(yùn)行完成,其中斷標(biāo)志位卻再次置位,導(dǎo)致在程序卡死。
因此,關(guān)閉定時(shí)器中斷,采用定時(shí)器輪詢的方式實(shí)現(xiàn)延時(shí),代碼如下:
/*
TIM3溢出時(shí)間=72MHz/(71+1)/(0+1)=1Mhz=1us
計(jì)數(shù)模式:向下計(jì)數(shù)模式
*/
void Delay_us(uint32_t us){
uint16_t counter=us&0xffff;
HAL_TIM_Base_Start(&htim3);
__HAL_TIM_SetCounter(&htim3,counter);
while(counter》1)
{
counter=__HAL_TIM_GetCounter(&htim3);
}
HAL_TIM_Base_Stop(&htim3);
}
void Delay_ms(uint32_t ms){
Delay_us(1000*ms);
}