前言
在一洗衣機MC項目中,客戶選擇使用STM32F030作為主控芯片。使用TIMER3(CH3)來捕獲電機的HALL Sensor的中斷,同時使用TIMER3(CH2)的OC功能,在OC match中斷中調整轉速。客戶在調試中發(fā)現,當捕獲中斷和OC中斷“同時發(fā)生(對齊)”時,會發(fā)生捕獲中斷丟失。
問題分析
客戶最初發(fā)現使用該配置控制電機時,在某一時刻會出現電機轉速異常。經過抓取波形發(fā)現,HALL Sensor和捕獲輸出波形(在中斷中翻轉IO)不匹配,在某個時刻,會出現“中斷丟失”現象,表現為捕獲輸出高電平或低電平周期被拉長,如圖1所示。黃色為HALL信號,綠色為捕獲中斷輸出,紫色為OC中斷輸出,可以明顯看到在第四個上升沿之后,高電平長度被拉長半個周期。客戶懷疑是硬件Bug導致中斷“同時發(fā)生”時,捕獲“中斷丟失”,從而導致該問題。
圖 一
查看Erratasheet, 沒有相關的描述。另外,硬件BUG導致中斷丟失的可能性較小,因為中斷同時發(fā)生的概率很低而該現象很容易復現。
構建測試環(huán)境
通過CubeMx構建對應的測試工程,分別在捕獲和OC中斷中翻轉IO來檢測中斷狀況。另外,通過其它開發(fā)板產生相應的PWM來模擬HALL信號。經過測試發(fā)現,使用Cube庫生成的代碼,并沒有“丟失中斷”的現象,波形見下圖。
代碼分析
客戶的代碼,包括中斷服務函數都是通過直接操作寄存器的方式編寫。分析客戶的代碼發(fā)現,客戶在中斷服務函數中清除相關中斷標志位時是通過常用的寄存器操作方式“讀-修改-寫”來完成,如下:
TIM3->SR&= ~TIM_SR_CC3IF; /* Clear the flags */
而在HAL Driver中是通過對應的位直接賦值的方式清除,如下:
#define__HAL_TIM_CLEAR_IT(__HANDLE__, __INTERRUPT__) ((__HANDLE__)->Instance->SR= ~(__INTERRUPT__))
結合客戶觀察到的現象,懷疑可能的原因是捕獲中斷標志在從讀狀態(tài)寄存器到寫入寄存器之間被置位,這樣的話,該標志就可能未被檢測處理到就被清除掉了,從而導致異常的發(fā)生。
將HAL Driver函數中的中斷服務函數修改成與客戶一樣的“讀-修改-寫”方式來清除對應標志位,該問題被復現。
小結
如果通過直接操作寄存器的方式來集成底層驅動,那么在通過“讀-修改-寫”方式操作此類會由硬件修改的寄存器時,一定要加倍小心。根據寄存器具體的描述,可以采用直接寫入或者聯(lián)合體(按位修改)的方式修改。
-
中斷
+關注
關注
5文章
904瀏覽量
42506 -
OC
+關注
關注
0文章
20瀏覽量
12632 -
STM32F030
+關注
關注
1文章
33瀏覽量
6959
原文標題:TIMER3 “中斷丟失 ”現象分析
文章出處:【微信號:STM32_STM8_MCU,微信公眾號:STM32單片機】歡迎添加關注!文章轉載請注明出處。
發(fā)布評論請先 登錄
TIMER3設置成外部捕獲模式,T3_EXT引腳每秒輸入10個脈沖,為什么得到的CNT寄存器和CAP寄存器的值這么大?
STM32入門篇之通用定時器徹底研究(新手教程,含11個例程,全面剖析TIMER,另外有個2.0庫的
請問CC2540 timer3 timer4 的PWM怎么用?有沒有例程參考?
輸入捕獲模塊中斷發(fā)生會重置Time3值嗎?
stm32F207 APB1輸出最大時鐘給TIMER3問題
使用TMRxH和TMRxL中相同內容的Timer1和Timer3的工作方式截然不同
STM32F0 Timer3作為定時器輸出
NXP LPC1768 timer3定時器問題
MSP432定時器異常進捕獲中斷并沒有發(fā)生捕獲事件怎么解決
在Timer3上設置定時器中斷無法生成PWM信號咋辦呢
BSP\\TIMER_Capture范例中,Timer0和Timer3的輸出頻率和手冊的不一致是為什么?
TIMER3設置成外部捕獲模式,得到的CNT寄存器和CAP寄存器的值怎么會這么大呢?
MSP432定時器異常進捕獲中斷的問題

評論