關(guān)鍵字:MPU, SubRegion
目錄預(yù)覽
1 引言2 問題描述3 問題重現(xiàn)4 小結(jié)
1. 引言
STM32 G0 系列產(chǎn)品具有豐富的外設(shè)和強(qiáng)大的處理性能以及良好的低功耗特性,被廣泛用于各類工業(yè)產(chǎn)品中,包括一些需要低功耗需求的應(yīng)用。
2.問題描述
用戶使用STM32G0B1 作為汽車多媒體音響控制器的控制芯片,用來作為收音機(jī)頻道存貯和各種檢測控制。在實(shí)驗(yàn)室條件下模擬汽車頻繁打火的情形進(jìn)行測試,連續(xù)工作72 小時(shí)實(shí)驗(yàn)中,進(jìn)入STOP 模式后,會(huì)出現(xiàn)無法再繼續(xù)運(yùn)行的情況(屏幕沒有顯示輸出,外部中斷無反應(yīng))。
3. 問題重現(xiàn)
通常調(diào)查問題時(shí)采取調(diào)試監(jiān)控的方式。但是用戶產(chǎn)品是在檢測外部掉電時(shí),測外部電壓(汽車ACC 電源,轎車12V)下降后,立刻進(jìn)入低功耗模式,然后通過RTC 和外部中斷(PC13 下降沿觸發(fā)即汽車打火上電)喚醒MCU 繼續(xù)工作。
那么既然是已經(jīng)進(jìn)入低功耗模式,并且在幾十個(gè)小時(shí)內(nèi)才會(huì)出現(xiàn)故障,通常的用ST-LINK 在線調(diào)試方式顯然很困難重現(xiàn)問題,即使幸運(yùn)的遇到了故障,也很容易錯(cuò)過引起故障的代碼部分,看到了現(xiàn)象卻無法定位。
在此種情況下,正面分析出問題的可能性極小,況且用戶代碼量超過200k。這時(shí)候采用排除法不失為一種可行的辦法。通過增加測試樣本數(shù)量,進(jìn)行并行測試提高定位效率。
圖1 是為了方便說明問題,模擬用戶關(guān)鍵程序。主要是進(jìn)入STOP 前后外設(shè)的處理,來復(fù)現(xiàn)故障現(xiàn)象。

圖1 模擬ACC掉電喚醒程序
在經(jīng)過一段時(shí)間的實(shí)驗(yàn),并從增加和減少該段代碼的排除中,最后驗(yàn)證并定位到下面的代碼引起故障發(fā)生。

圖2 定位到引起的故障代碼
反復(fù)分析我們可以看到,在進(jìn)入STOP前,用戶需要停止ADC和DMA。但是在停止DMA時(shí),用戶程序直接停掉DMA的時(shí)鐘。從函數(shù)名稱上看,是從其他軟件直接搬過來,并且誤以為是DMA的默認(rèn)初始化動(dòng)作。

圖3 DMA正確的停止方式
查詢參考手冊,停止循環(huán)模式的DMA應(yīng)該從外設(shè)停止開始,而不是簡單粗暴的停止DMA時(shí)鐘。而且,在程序順序上客戶是先停止了DMA的時(shí)鐘然后才去停止ADC的DMA請求。顯然,當(dāng)DMA開始工作時(shí),突然停止時(shí)鐘會(huì)使DMA和總線處于一個(gè)不確定階段狀態(tài),因此才有極低概率發(fā)生喚醒故障。
到此已經(jīng)找到了發(fā)生的原因,按說應(yīng)該找到了前因后果。但奇怪的是無意中發(fā)現(xiàn)振蕩器的波形比較奇怪,并不符合低功耗模式。

圖 4 外部振蕩器HSE 波形
在發(fā)生故障狀態(tài)時(shí)發(fā)現(xiàn)外部震蕩器還在持續(xù)震蕩,因此判定此時(shí)并非進(jìn)入低功耗模式。利用IAR編譯器以HOT PLUG的方式連接調(diào)試與觀測。
通過調(diào)試界面可以看到,代碼會(huì)不停的進(jìn)入DMA中斷。

圖5 故障模式下的調(diào)試

圖6 代碼進(jìn)入循環(huán)過程
奇怪的是每次并沒有看到DMA的寄存器內(nèi)容,原因是已經(jīng)關(guān)閉了DMA外設(shè)的時(shí)鐘。所以無法看到任何狀態(tài)標(biāo)志。退出中斷時(shí)在C語言下就無法單步調(diào)試了。切換到匯編界面下,可以看到代碼可以繼續(xù)運(yùn)行到系統(tǒng)時(shí)鐘配置函數(shù),但是在配置函數(shù)中的除法部分進(jìn)入了循環(huán),然后又發(fā)生了DMA中斷,并且循環(huán)沒有出來。
顯然,正常的調(diào)試手段已顯示出邏輯的不正常。
4.小結(jié)
至此,情況已經(jīng)明了。由于軟件在進(jìn)入低功耗前試圖關(guān)閉ADC加DMA工作,沒有按照手冊的規(guī)范,通過外設(shè)停止的方式關(guān)閉,而是簡單粗暴的關(guān)閉DMA時(shí)鐘,導(dǎo)致總線和運(yùn)行邏輯出錯(cuò),無法繼續(xù)執(zhí)行。
外部看起來像是進(jìn)入低功耗模式后,外部中斷觸發(fā)沒有執(zhí)行,芯片沒有喚醒,實(shí)際上是DMA進(jìn)入了不正常的循環(huán)中斷方式導(dǎo)致了系統(tǒng)卡在循環(huán)代碼下。
芯片的外設(shè)功能強(qiáng)大,每種外設(shè)運(yùn)行的方式也不相同,因此停止外設(shè)時(shí)需根據(jù)外設(shè)特點(diǎn)以及參考手冊的建議來實(shí)施,切不可按自己想象的方式執(zhí)行,這樣引起隱蔽的偶發(fā)故障就很難去定位解決了。
此外ST已經(jīng)建立好完整強(qiáng)大的生態(tài)系統(tǒng),按照cube 軟件庫的規(guī)范編寫調(diào)用驅(qū)動(dòng)函數(shù)可以避免少走類似的彎路。
完整內(nèi)容請點(diǎn)擊“閱讀原文”下載原文檔。

長按掃碼關(guān)注公眾號
更多資訊,盡在STM32
▽點(diǎn)擊“閱讀原文”,可下載原文檔
原文標(biāo)題:應(yīng)用筆記 | 看似無法喚醒的一種異常現(xiàn)象分析
文章出處:【微信公眾號:STM32單片機(jī)】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
-
單片機(jī)
+關(guān)注
關(guān)注
6076文章
45498瀏覽量
670606 -
STM32
+關(guān)注
關(guān)注
2310文章
11162瀏覽量
373521
原文標(biāo)題:應(yīng)用筆記 | 看似無法喚醒的一種異?,F(xiàn)象分析
文章出處:【微信號:STM32_STM8_MCU,微信公眾號:STM32單片機(jī)】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
LAT1185+一個(gè)地址未對齊引起的 HardFault 異常應(yīng)用筆記
信道活躍檢測(CAD)是一種無線喚醒技術(shù),這個(gè)功能一般是定時(shí)檢測么?還是一直檢測?
MCU典型的睡眠喚醒時(shí)間delay的概念
AT32F系列 PWC待機(jī)喚醒腳喚醒Standby
AT32F系列 PWC USART接收喚醒SLEEP
UPS電源市電供電異常全解析:從現(xiàn)象到解決方案的實(shí)用指南
設(shè)備運(yùn)行狀態(tài)出現(xiàn)異常,如何確定是電源紋波超標(biāo)導(dǎo)致的
光模塊安裝使用異常全解析:從現(xiàn)象到解決方案的完整指南
判斷伺服行星減速機(jī)出現(xiàn)噪音的異常
CAN總線傳播延遲過大導(dǎo)致通信異?,F(xiàn)象解析
某車聯(lián)網(wǎng)終端有時(shí)無法短信喚醒的故障分析
【案例3.9】電路板無法啟動(dòng)的故障分析
應(yīng)用筆記 | 看似無法喚醒的一種異常現(xiàn)象分析
評論