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