前不久,幾乎舉國上下在同一時(shí)間段內(nèi)整齊劃一地被感染了新冠。
很多人感染后都不同程度地出現(xiàn)味覺、嗅覺失靈的情形。本人也有相同經(jīng)歷。這幾天,味覺恢復(fù),嗅覺也在慢慢恢復(fù)中。既能聞到誘人的煎餅香,也能聞到清新的花香了。
今天在此分享兩個(gè)STM32應(yīng)用中的實(shí)戰(zhàn)案例,權(quán)作提醒,以免重蹈覆轍。
案例1:
系統(tǒng)聯(lián)機(jī)工作時(shí),F(xiàn)lash編程偶發(fā)性失敗
有人使用STM32F4系列芯片做開發(fā),代碼里涉及到FLASH編程。他發(fā)現(xiàn)FLASH編程過程中時(shí)不時(shí)地出現(xiàn)編程錯(cuò)誤,即提示HAL_FLASH_ERROR_PGP錯(cuò)誤。
他的產(chǎn)品系統(tǒng)有用到CAN通信。當(dāng)他不將芯片做系統(tǒng)聯(lián)機(jī)工作時(shí)不會發(fā)生該錯(cuò)誤,只有在做整體聯(lián)機(jī)測試時(shí)才可能發(fā)生編程異常。
起初,客戶使用4字節(jié)編程模式,平常單獨(dú)就flash編程功能測試也正常,整體聯(lián)機(jī)運(yùn)行時(shí)才可能出問題。后來,無意中嘗試將FLASH單次編程寬度調(diào)整為1個(gè)字節(jié)后則異常消失。
那是為什么呢?
其實(shí),在做FLASH編程時(shí),選擇不同的編程寬度所需的芯片供電電壓是不一樣的。上面截圖來自STM32F4系列參考手冊。從圖中不難看出,選擇的編程寬度越寬,芯片所需供電電壓越高。
若不運(yùn)行其它功能,只是單獨(dú)就芯片做flash編程,功耗需求相對較小、電源波動也小。當(dāng)聯(lián)機(jī)工作時(shí),系統(tǒng)功耗、串?dāng)_都有所增大,電源波動也可能加劇,這時(shí)很可能出現(xiàn)電源難以保證支持4字節(jié)編程方式的穩(wěn)定需求。由于單字節(jié)編程模式所需電源電壓相對較低,在系統(tǒng)聯(lián)機(jī)工作時(shí),相同的電源條件下,即使電源有所波動,但完全可能依舊能提供滿足單字節(jié)編程的穩(wěn)定電壓需求,因而不會出現(xiàn)因供電問題導(dǎo)致的編程異常。
案例 2:
芯片工作時(shí)偶發(fā)性出現(xiàn)死機(jī)現(xiàn)象
有人在做STM32芯片做產(chǎn)品開發(fā),會偶發(fā)性地出現(xiàn)芯片進(jìn)入死機(jī)狀態(tài)的現(xiàn)象。
代碼里有做FLASH編程操作,有UART的收發(fā)動作及相關(guān)中斷,另外還開啟了某定時(shí)器更新中斷。經(jīng)過測試發(fā)現(xiàn),如果關(guān)閉定時(shí)器中斷,F(xiàn)LASH編程、UART收發(fā)動作保持的情況下,則不會出現(xiàn)死機(jī)的現(xiàn)象??墒嵌〞r(shí)器中斷怎么會導(dǎo)致芯片死機(jī)呢?感覺沒有找到根本原因。后來,進(jìn)一步跟蹤調(diào)試發(fā)現(xiàn),芯片出現(xiàn)死機(jī),實(shí)際上是程序不停地進(jìn)入U(xiǎn)ART接收中斷。
用戶代碼里的確使能了UART收發(fā)中斷,但在中斷代碼里程序?qū)崒?shí)在在有對接收非空標(biāo)志【RXNE】做清零處理,不應(yīng)該沒完沒了地進(jìn)接收中斷啊!經(jīng)進(jìn)一步確認(rèn),發(fā)生死機(jī)現(xiàn)象時(shí)總是對應(yīng)著UART接收溢出事件【ORE】。哦,如果這樣,當(dāng)UART接收發(fā)生溢出時(shí)的確也會產(chǎn)生接收非空中斷。下圖為STM32USART的各個(gè)中斷請求事件及中斷使能控制位。從下圖可以看出,當(dāng)使能RXNEIE時(shí),RXNE和ORE事件都可產(chǎn)生接收中斷。
用戶雖然在UART接收中斷里有對RXNE標(biāo)志清零,但當(dāng)發(fā)生溢出事件而進(jìn)入中斷時(shí),他并沒有對ORE標(biāo)志做檢測及相應(yīng)的清零操作。
實(shí)際上,用戶根本就沒有意識到發(fā)生ORE事件時(shí)也可以產(chǎn)生接收中斷,在其代碼里根本沒有對ORE標(biāo)志進(jìn)行檢測,更沒有對ORE標(biāo)志做清零,導(dǎo)致UART接收中斷沒完沒了的進(jìn)入,感覺芯片猶如死機(jī)一般。
為什么關(guān)閉定時(shí)器中斷能防止死機(jī)現(xiàn)象發(fā)生呢? 我們知道,UART接收產(chǎn)生溢出是因?yàn)閿?shù)據(jù)接收到后不能及時(shí)取走才產(chǎn)生的,而定時(shí)器中斷的存在,因?yàn)橹袛喔偁幍脑驅(qū)е铝薝ART接收中斷的及時(shí)性受到影響,進(jìn)而容易發(fā)生溢出。如果關(guān)閉定時(shí)器中斷或或?qū)ART接收中斷的優(yōu)先級配置成可以搶占定時(shí)器中斷就可以避免UART接收不及時(shí)的問題,也就不會發(fā)生溢出。這樣的話,即使用戶的UART接收中斷里沒有對ORE事件的處理也無所謂。
當(dāng)然,我們做UART的中斷接收時(shí),中斷代碼里最好加上對ORE事件的檢測處理,當(dāng)發(fā)生溢出事件時(shí),及時(shí)對ORE事件標(biāo)志清零。否則,萬一發(fā)生溢出,就可能因ORE事件而發(fā)生沒完沒了進(jìn)中斷的問題,進(jìn)而導(dǎo)致功能異常。
具體到本案例,再順便提醒一點(diǎn),除非片內(nèi)FLASH采用雙BANK結(jié)構(gòu),F(xiàn)LASH編程也是會影響中斷響應(yīng)的。即該操作也可能讓UART的接收中斷的響應(yīng)因臨時(shí)堵塞而發(fā)生接收溢出。
好,今天的分享到此打住。也愿這里的分享能給有需要的人帶來一些幫助。
目前尚是冬季,大家注意防寒保暖并保證休息,以利新冠康復(fù)。如有咳嗽,除了使用適當(dāng)藥劑外,盡量避免說話,尤其是高聲說話。
待到山花爛漫、綠柳如煙時(shí),魑魅魍魎盡遁去。九州華夏重抖擻,東方旭日耀寰宇。~~~~~~一起加油!~~~~~
審核編輯:湯梓紅
-
FlaSh
+關(guān)注
關(guān)注
10文章
1614瀏覽量
147652 -
STM32
+關(guān)注
關(guān)注
2264文章
10854瀏覽量
354291 -
編程
+關(guān)注
關(guān)注
88文章
3565瀏覽量
93536 -
定時(shí)器
+關(guān)注
關(guān)注
23文章
3231瀏覽量
114326
原文標(biāo)題:又能聞花香了
文章出處:【微信號:stmcu832,微信公眾號:茶話MCU】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
相關(guān)推薦
評論