引言
某客戶設(shè)計(jì)需要啟動定時(shí)器在 3ms 后產(chǎn)生中斷,其后定時(shí)器不再運(yùn)行,直至下一次軟件要求再次啟動定時(shí)器產(chǎn)生中斷,實(shí)測代碼后發(fā)現(xiàn)定時(shí)器啟動后立即產(chǎn)生了超時(shí)中斷。
調(diào)研
客戶通過 STM32CubeMX 配置 TIM7 并生成工程,在主循環(huán)中添加定時(shí)器啟動代碼;在定時(shí)器中斷處理函數(shù)處理 update event 回調(diào)時(shí)停止定時(shí)器,并翻轉(zhuǎn)一個(gè) I/O 腳指示定時(shí)器啟停。
分析
應(yīng)用代碼在初始化定時(shí)器時(shí)會調(diào)用 HAL_TIM_Base_Init( )接口,此接口會調(diào)用TIM_Base_SetConfig( ) 配置定時(shí)器,并產(chǎn)生更新事件(TIMx->EGR = TIM_EGR_UG)加載寄存器,此事件標(biāo)志 UIF 會被置位,在調(diào)用 HAL_TIM_Base_Start_IT( ) 啟動定時(shí)器,在此使能定時(shí)器中斷時(shí),由于 UIF 已經(jīng)置位,所以會立即觸發(fā)并進(jìn)入中斷處理函數(shù),中斷回調(diào)函數(shù)會停止定時(shí)器計(jì)數(shù),并禁止定時(shí)器中斷;但當(dāng)從中斷處理函數(shù)返回繼續(xù)執(zhí)行HAL_TIM_Base_Start_IT( )時(shí),此接口會使能定時(shí)器開始計(jì)數(shù),進(jìn)而在下一次調(diào)用HAL_TIM_Base_Start_IT( )時(shí)又會立即產(chǎn)生中斷,循環(huán)往復(fù)。
處理
修改代碼,在啟動定時(shí)器前強(qiáng)制停止定時(shí)器計(jì)數(shù)、清除中斷位、清除 NVIC 掛起的中斷后,再啟動定時(shí)器。
小結(jié)
在碰到這類定時(shí)器異常問題時(shí),可以利用 I/O 口指示運(yùn)行狀態(tài),結(jié)合代碼分析找到原因并加以解決。