0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線(xiàn)課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

分享兩個(gè)STM32應(yīng)用中的實(shí)戰(zhàn)案例

茶話(huà)MCU ? 來(lái)源:茶話(huà)MCU ? 2023-01-11 09:13 ? 次閱讀

前不久,幾乎舉國(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ā)生編程異常。

起初,客戶(hù)使用4字節(jié)編程模式,平常單獨(dú)就flash編程功能測(cè)試也正常,整體聯(lián)機(jī)運(yùn)行時(shí)才可能出問(wèn)題。后來(lái),無(wú)意中嘗試將FLASH單次編程寬度調(diào)整為1個(gè)字節(jié)后則異常消失。

那是為什么呢?

09eb3f0c-9135-11ed-bfe3-dac502259ad0.png

其實(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),但完全可能依舊能提供滿(mǎn)足單字節(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)象。可是定時(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接收中斷。

用戶(hù)代碼里的確使能了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)生接收中斷。

09fab90a-9135-11ed-bfe3-dac502259ad0.png

用戶(hù)雖然在UART接收中斷里有對(duì)RXNE標(biāo)志清零,但當(dāng)發(fā)生溢出事件而進(jìn)入中斷時(shí),他并沒(méi)有對(duì)ORE標(biāo)志做檢測(cè)及相應(yīng)的清零操作。

0a0b927a-9135-11ed-bfe3-dac502259ad0.png

實(shí)際上,用戶(hù)根本就沒(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ā)生溢出。這樣的話(huà),即使用戶(hù)的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ō)話(huà),尤其是高聲說(shuō)話(huà)。

待到山花爛漫、綠柳如煙時(shí),魑魅魍魎盡遁去。九州華夏重抖擻,東方旭日耀寰宇。~~~~~~一起加油!~~~~~

審核編輯:湯梓紅

聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • FlaSh
    +關(guān)注

    關(guān)注

    10

    文章

    1608

    瀏覽量

    147562
  • STM32
    +關(guān)注

    關(guān)注

    2262

    文章

    10846

    瀏覽量

    353650
  • 編程
    +關(guān)注

    關(guān)注

    88

    文章

    3541

    瀏覽量

    93462
  • 定時(shí)器
    +關(guān)注

    關(guān)注

    23

    文章

    3226

    瀏覽量

    114139

原文標(biāo)題:又能聞花香了

文章出處:【微信號(hào):stmcu832,微信公眾號(hào):茶話(huà)MCU】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    STM32移植而引發(fā)的兩個(gè)小疑問(wèn)

    STM32用戶(hù)將基于STM32F0芯片的代碼移植到STM32F4系列時(shí)遇到了些麻煩。其中有個(gè)問(wèn)題跟中斷處理有關(guān)。有個(gè)中斷服務(wù)程序代碼在STM32
    的頭像 發(fā)表于 11-18 14:12 ?994次閱讀
    因<b class='flag-5'>STM32</b>移植而引發(fā)的<b class='flag-5'>兩個(gè)</b>小疑問(wèn)

    如何在兩個(gè)程序交換變量值?

    的扇區(qū) 0 上運(yùn)行。)作為參考,我使用 STM32CubeIDE 1.3.0 作為編譯工具。以前用IAR的時(shí)候,程序兩個(gè)變量放在noinit區(qū)的同一個(gè)地址,把編譯工具改成
    發(fā)表于 02-08 08:38

    Obtain_Studio自帶兩個(gè)STM32_GUI實(shí)例使用說(shuō)明

    Obtain_Studio自帶兩個(gè)STM32_GUI實(shí)例使用說(shuō)明
    發(fā)表于 07-15 16:03 ?25次下載

    合并兩個(gè)排序的鏈表

    結(jié)點(diǎn); 2、依次比較兩個(gè)鏈表節(jié)點(diǎn)的大小,將一個(gè)鏈表合并到另一個(gè)鏈表; 3、合并完之后,剩余部分合并到新鏈表最后; 我的代碼 /*struct ListNode {int val;st
    發(fā)表于 01-16 22:02 ?554次閱讀

    新建STM32工程全局聲明兩個(gè)宏的原因

    在uVision中新建STM32工程后,需要從STM32標(biāo)準(zhǔn)庫(kù)拷貝標(biāo)準(zhǔn)外設(shè)驅(qū)動(dòng)到自己的工程目錄,此時(shí)需要在工程設(shè)置->C/C++選項(xiàng)卡下的Define文本框中鍵入這
    發(fā)表于 08-10 10:25 ?1921次閱讀

    基于KEIL MDK環(huán)境調(diào)試STM32兩個(gè)誤會(huì)

    曾有兩個(gè)不同的STM32用戶(hù)反饋了相似的問(wèn)題,他們?cè)趯?duì)STM32F7Cube庫(kù)里的工程例程進(jìn)行編譯時(shí),發(fā)現(xiàn)了一個(gè)令人很不解的事。編譯的結(jié)果提示芯片內(nèi)的RAM幾乎都耗光了。
    發(fā)表于 02-08 16:06 ?0次下載
    基于KEIL MDK環(huán)境調(diào)試<b class='flag-5'>STM32</b>的<b class='flag-5'>兩個(gè)</b>誤會(huì)

    Linux如何比較兩個(gè)文件的差異?

    Linux 如何比較兩個(gè)文件的差異?答案是使用 diff 命令。
    的頭像 發(fā)表于 01-17 17:30 ?5104次閱讀
    Linux<b class='flag-5'>中</b>如何比較<b class='flag-5'>兩個(gè)</b>文件的差異?

    冷鏈運(yùn)輸兩個(gè)重要環(huán)節(jié)

    冷鏈運(yùn)輸兩個(gè)重要環(huán)節(jié)
    的頭像 發(fā)表于 01-28 17:13 ?1078次閱讀
    冷鏈運(yùn)輸<b class='flag-5'>中</b>的<b class='flag-5'>兩個(gè)</b>重要環(huán)節(jié)

    兩個(gè)LED和兩個(gè)按鈕的使用

    電子發(fā)燒友網(wǎng)站提供《兩個(gè)LED和兩個(gè)按鈕的使用.zip》資料免費(fèi)下載
    發(fā)表于 01-30 16:04 ?1次下載
    <b class='flag-5'>兩個(gè)</b>LED和<b class='flag-5'>兩個(gè)</b>按鈕的使用

    Linux如何比較兩個(gè)文件的差異?

    Linux 如何比較兩個(gè)文件的差異?答案是使用 diff 命令。
    的頭像 發(fā)表于 01-30 16:04 ?1.2w次閱讀
    Linux<b class='flag-5'>中</b>如何比較<b class='flag-5'>兩個(gè)</b>文件的差異?

    STM32F1兩個(gè)USB中斷入口詳解

    STM32斷入口有兩個(gè),分別是USB_HP_CAN1_TX_IRQHandler和USB_LP_CAN1_RX0_IRQHandler。
    的頭像 發(fā)表于 07-24 11:12 ?4228次閱讀

    stm32單片機(jī)如何實(shí)現(xiàn)一個(gè)按鍵切換兩個(gè)程序?

    stm32單片機(jī)如何實(shí)現(xiàn)一個(gè)按鍵切換兩個(gè)程序? 作為一款功能強(qiáng)大的微控制器,STM32單片機(jī)可以支持多種應(yīng)用場(chǎng)景,其中一個(gè)實(shí)用的功能是按鍵切
    的頭像 發(fā)表于 09-14 14:22 ?5718次閱讀

    電子設(shè)計(jì)兩個(gè)不同概念:pcb與pcb封裝

    電子設(shè)計(jì)兩個(gè)不同概念:pcb與pcb封裝
    的頭像 發(fā)表于 12-11 15:49 ?705次閱讀

    stm32個(gè)定時(shí)器能同時(shí)控制兩個(gè)燈以不同頻率閃爍嗎?

    STM32的定時(shí)器功能強(qiáng)大,**STM32的定時(shí)器可以同時(shí)控制兩個(gè)燈以不同頻率閃爍** 。
    的頭像 發(fā)表于 12-13 10:43 ?1688次閱讀

    arcgis如何關(guān)聯(lián)兩個(gè)屬性表

    在ArcGIS,關(guān)聯(lián)兩個(gè)屬性表是一個(gè)重要的操作,可以通過(guò)此操作將兩個(gè)的數(shù)據(jù)關(guān)聯(lián)起來(lái),以便進(jìn)行分析和查詢(xún)。下面是詳細(xì)介紹如何在ArcGI
    的頭像 發(fā)表于 02-25 11:01 ?3601次閱讀