91欧美超碰AV自拍|国产成年人性爱视频免费看|亚洲 日韩 欧美一厂二区入|人人看人人爽人人操aV|丝袜美腿视频一区二区在线看|人人操人人爽人人爱|婷婷五月天超碰|97色色欧美亚州A√|另类A√无码精品一级av|欧美特级日韩特级

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

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

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

實(shí)戰(zhàn)經(jīng)驗(yàn) | 一個(gè) Flash 編程錯(cuò)誤標(biāo)志的探析

STM32單片機(jī) ? 來(lái)源:未知 ? 2023-11-10 17:45 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群


關(guān)鍵詞:Flash, 編程錯(cuò)誤


目錄預(yù)覽

1、問(wèn)題現(xiàn)象與分析

2、小結(jié)

3、后記


01

問(wèn)題現(xiàn)象與分析


客戶項(xiàng)目中使用的 MCU 型號(hào)是 STM32G0B1, 他們反饋在代碼中嘗試擦除并編程 FLASH時(shí), 發(fā)現(xiàn) FLASH 的狀態(tài)寄存器顯示編程錯(cuò)誤(如圖 1 所示). 問(wèn)題是當(dāng)前代碼還沒(méi)有開(kāi)始擦除和編程, 怎么就有了編程錯(cuò)誤標(biāo)志了呢 ? 如果不將此錯(cuò)誤標(biāo)志清除, 后續(xù)的編程操作無(wú)法繼續(xù).客戶對(duì)于每次想要操作 FLASH 之前這個(gè)清除動(dòng)作既感覺(jué)多余也感覺(jué)別扭, 且還不得不做, 且做了也不知對(duì)整個(gè)產(chǎn)品的穩(wěn)定性會(huì)有什么樣的影響 ?


圖1.Flash 編程錯(cuò)誤標(biāo)志


訪問(wèn)客戶時(shí), 客戶也曾私下里反饋, 經(jīng)常在網(wǎng)絡(luò)論壇上獲取類似這種問(wèn)題, 客戶懷疑是不是STM32 本身就存在某些未曾公開(kāi)的問(wèn)題 ? 其實(shí), STM32 的所有問(wèn)題都已公開(kāi)在勘誤手冊(cè)中, 如果客戶的問(wèn)題在勘誤手冊(cè)中沒(méi)找到, 那么極有可能是自己代碼哪里出了問(wèn)題。


問(wèn)題分析及測(cè)試


查看客戶的工程, 由于客戶的工程相當(dāng)龐大, 各個(gè)模塊和任務(wù)相互交叉, 一時(shí)半刻是很難從如此龐大的工程中找出問(wèn)題, 更麻煩地是, 客戶的電腦是有加密系統(tǒng)的, 導(dǎo)致在工程內(nèi)查找任何字符和函數(shù)都相當(dāng)痛苦. 好在是, 問(wèn)題能夠穩(wěn)定地復(fù)現(xiàn)。


于是盡量精簡(jiǎn)客戶的代碼, 將所有不相關(guān)的任務(wù),模塊統(tǒng)統(tǒng)移除掉, 并且保持問(wèn)題能夠重現(xiàn). 并使其能夠在 ST 官方的 NUCLEO 板上重現(xiàn). 這樣一來(lái), 就完全可以脫離客戶原來(lái)的硬件環(huán)境進(jìn)行測(cè)試. 由于客戶的環(huán)境非常不利于查找問(wèn)題, 效率事倍功半. 于是, 將客戶的最小化工程提取出來(lái)(與軟件泄密無(wú)關(guān)), 并拿到辦公室進(jìn)行測(cè)試. 很快就找到了問(wèn)題所在。


原來(lái)客戶的工程中有用到兩個(gè)串口, 串口 2 和串口 3, 都是使用的 DMA 模式??蛻舨煌能浖藛T負(fù)責(zé)不同的模塊, 最終在整合代碼時(shí), 串口 2 并沒(méi)有使用, 所以串口 2 對(duì)應(yīng)的初始化代碼是刪除掉的, 但由于串口 2 和串口 3 的 DMA 中斷是共用一條中斷線, 是相同的中斷入口, 在中斷處理時(shí),串口 2 的 DMA 處理函數(shù)和串口 3 的處理函數(shù)都會(huì)一起處理. 問(wèn)題就出在串口 2 的 DMA 中斷處理并沒(méi)有移除 。如 stm32g0xx_it.c 文件 :



如上圖,DMA 的通道 4~7 以及 DAM2 的通道 1~5 都是共用一個(gè)中斷入口的。在這個(gè)中斷處理函數(shù)內(nèi), 串口 2 并沒(méi)有使用到, 但其對(duì)應(yīng)處理代碼由于疏忽仍然保留了下來(lái)。句柄hdma_usart2_rx, 和 hdma_usart2_tx 內(nèi)的數(shù)據(jù)成員很多都是不定內(nèi)容或?yàn)?0. 當(dāng)代碼運(yùn)行到函數(shù)內(nèi)部, 如下圖所示出問(wèn)題的代碼行:



如上面代碼所示, 代碼運(yùn)行到上圖 866 行代碼 hdma->DmaBaseAddress->IFCR = (DMA_ISR_GIF1 << (hdma->ChannelIndex & 0x1CU));時(shí), 實(shí)際上是給錯(cuò)誤地址 0x0800 4109 賦值了, 此地址是內(nèi)部 FLASH 地址, 這樣相當(dāng)于直接寫 FLASH, 肯定會(huì)出錯(cuò), 這也是為什么FLASH->SR.PGSERR 置位的原因. 我們都知道, 寫內(nèi)部 FLASH, 必須先擦除, 才可以寫入, 而且寫也是調(diào)用對(duì)應(yīng)的 HAL API 函數(shù), 且還需要先寫 key 解鎖 FLASH 等操作, 有一套寫操作流程. 并不是直接用賦值語(yǔ)句, 這樣操作出現(xiàn)問(wèn)題一點(diǎn)也不奇怪。


當(dāng)在中斷中將串口 2 的 DMA 對(duì)應(yīng)處理函數(shù)移除掉后功能就恢復(fù)正常, 這也佐證了結(jié)論的準(zhǔn)確性。


另外, 客戶反映, 這個(gè)最小化工程, 相同的代碼, 使用 IAR 時(shí)測(cè)試會(huì)出錯(cuò), 但使用 KEIL 時(shí)并沒(méi)有出錯(cuò). 這個(gè)很奇怪. 這就引出的另外一個(gè)問(wèn)題. 相同代碼, 不同編譯器運(yùn)行結(jié)果不一致的問(wèn)題。于是繼續(xù)找原因, 對(duì)比 IAR 和 KEIL 的調(diào)試情況, 發(fā)現(xiàn)當(dāng)代碼運(yùn)行到圖 2 中 857 行代碼 if 語(yǔ)句時(shí)其判斷結(jié)果不相同. IAR 調(diào)試環(huán)境會(huì)進(jìn)入到 if 語(yǔ)句內(nèi)容, 從而導(dǎo)致錯(cuò)誤的給內(nèi)部 FLASH 地址賦值, 進(jìn)行導(dǎo)致問(wèn)題. 而 KEIL 調(diào)試環(huán)境并沒(méi)有進(jìn)入到 if 語(yǔ)句內(nèi)部, 因此并沒(méi)有觸發(fā)問(wèn)題. 那么為什么if 語(yǔ)句的判斷結(jié)果不一樣呢?


為了方便并避免不同編譯器對(duì)長(zhǎng)語(yǔ)句的執(zhí)行順序的差異, 將這個(gè) if 長(zhǎng)語(yǔ)句拆開(kāi):



如上紅色代碼, 用它替換原來(lái)的 if 判斷語(yǔ)句. 結(jié)果發(fā)現(xiàn) tmp1 在 IAR 和 KEIL 兩個(gè)編譯器環(huán)境中的值是一樣的, 但是 tmp2 的值卻不一樣, 正是由于 tmp2 值的不一樣, 導(dǎo)致 if 語(yǔ)句的最終判斷結(jié)果不同。進(jìn)一步發(fā)現(xiàn), tmp2 的值主要是由于 flag_it 的值在兩種編譯器環(huán)境不一樣所致。



如上 IAR 編譯器環(huán)境, flag_it 的值為 0x2000 10f8。



如上 KEIL 編譯器環(huán)境, flag_it 的值卻是 0x2000 14F0。


那么 flag_it 的值又是如何來(lái)的呢? 從如下代碼:



如上所示, flag_it 的值來(lái)自 hdma->DmaBaseAddress->ISR, 原來(lái)是 DMA 相關(guān) ISR 寄存器的值, 但實(shí)際調(diào)試如下:



如上 IAR 調(diào)試環(huán)境下, 出錯(cuò)時(shí), hdma->DmaBaseAddress 實(shí)際指向的是地址 0, 其成員 ISR為其第一個(gè)成員, 實(shí)際也就是地址 0 上的數(shù)據(jù). 我們都知道, 在默認(rèn)情況下, MCU 的地址 0 默認(rèn)是映射到內(nèi)部 FLASH 的首地址 0x0800 0000 上的, 而此地址一般保存的是棧頂.。也就是說(shuō), IAR 編譯環(huán)境下, 地址 0 指向棧頂?shù)刂?0x2000 10f8。


對(duì)應(yīng)地, 在 KEIL 調(diào)試環(huán)境下:



如上 KEIL 調(diào)試環(huán)境, hdma->DmaBaseAddress 同樣地實(shí)際指向的是地址 0, 而地址 0 的上對(duì)應(yīng)的數(shù)據(jù)為棧頂?shù)刂? 0x2000 14F0。


也就是說(shuō), 在不同的 編譯器 IAR 和 KEIL 環(huán)境下, 地址 0 指向棧頂?shù)刂肥俏幢叵嗤? 進(jìn)而導(dǎo)致兩種編譯環(huán)境下運(yùn)行相同的代碼結(jié)果不一樣。


我們知道, 通常棧地址是由編譯器來(lái)指定的, 在默認(rèn)情況下, IAR 和 KEIL 都會(huì)將棧放在內(nèi)存的所有靜態(tài)變量之后來(lái)分配. 其具體的分配地址這兩個(gè)編譯器都會(huì)默認(rèn)按自動(dòng)填充地方式來(lái). 實(shí)際分配的地址具有不確定性, 當(dāng)然, 我們也可以通過(guò)鏈接配置文件(IAR 的.icf 文件, KEIL 的.sct 文件)來(lái)將棧地址指定某一固定地址, 但我們通常不會(huì)這么做, 且完全沒(méi)有必要.


02

小結(jié)


至此,將問(wèn)題稍作小結(jié)。給變量 flag_it 實(shí)際賦值棧頂?shù)刂? 不同的編譯器環(huán)境下, 此棧頂?shù)刂返牟灰恢聦?dǎo)致變量 flag_it 的值不一致, 進(jìn)而導(dǎo)致 if 語(yǔ)句的判斷結(jié)果不同, 最終導(dǎo)致 IAR 和 KEIL 這兩個(gè)編譯器環(huán)境下運(yùn)行相同代碼而結(jié)果不一樣的情形。


03

后記


有時(shí)會(huì)聽(tīng)到某某客戶反饋說(shuō), 在網(wǎng)絡(luò)上看到 STM32 某款 MCU 存在某某問(wèn)題, 然后問(wèn)是不是 ST 故意隱瞞 ?


不存在故意隱瞞的說(shuō)法,芯片終究是要經(jīng)過(guò)終端驗(yàn)證的。


正常來(lái)講, 任何芯片存在應(yīng)用局限是正常的。對(duì)于 ST,一方面會(huì)正式地將所有已知 bug或應(yīng)用局限放入到勘誤手冊(cè)中公示, 大家需要注意使用最新版勘誤手冊(cè);另一方面,對(duì)于 ST 量產(chǎn)芯片,因本身缺陷導(dǎo)致的問(wèn)題的概率非常低。事實(shí)上,絕大多數(shù)問(wèn)題都來(lái)自我們自身的應(yīng)用,遇到問(wèn)題若簡(jiǎn)單的基于芯片品質(zhì)來(lái)回猜疑非常不利于開(kāi)發(fā)者靜下心來(lái)查找問(wèn)題原因。其實(shí),面對(duì)問(wèn)題時(shí),我們很多人欠缺的并不是多么高深的水平,而是一顆冷靜、自信并富有條理的心。



完整內(nèi)容請(qǐng)點(diǎn)擊“閱讀原文”下載原文檔。




原文標(biāo)題:實(shí)戰(zhàn)經(jīng)驗(yàn) | 一個(gè) Flash 編程錯(cuò)誤標(biāo)志的探析

文章出處:【微信公眾號(hào):STM32單片機(jī)】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(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)投訴
  • 單片機(jī)
    +關(guān)注

    關(guān)注

    6076

    文章

    45506

    瀏覽量

    670903
  • STM32
    +關(guān)注

    關(guān)注

    2310

    文章

    11167

    瀏覽量

    373619

原文標(biāo)題:實(shí)戰(zhàn)經(jīng)驗(yàn) | 一個(gè) Flash 編程錯(cuò)誤標(biāo)志的探析

文章出處:【微信號(hào):STM32_STM8_MCU,微信公眾號(hào):STM32單片機(jī)】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    工業(yè) AI Agent 為什么能真正落地工廠?研華六大場(chǎng)景實(shí)戰(zhàn)經(jīng)驗(yàn)分享

    經(jīng)驗(yàn)傳承到?jīng)Q策優(yōu)化,從設(shè)備維護(hù)到供應(yīng)鏈協(xié)同,研華iFactory.AI Agent的六大落地案例充分證明,工業(yè)AI Agent并非懸浮的技術(shù)概念,而是能深度適配制造業(yè)生產(chǎn)經(jīng)營(yíng)全鏈路、精準(zhǔn)破解核心痛點(diǎn)的實(shí)用工具。
    的頭像 發(fā)表于 03-12 16:58 ?175次閱讀

    GPS時(shí)鐘授時(shí)裝置常見(jiàn)問(wèn)題與實(shí)戰(zhàn)經(jīng)驗(yàn)分享

    作為名長(zhǎng)期關(guān)注時(shí)間同步技術(shù)的網(wǎng)絡(luò)宣傳人員,我經(jīng)常收到用戶關(guān)于GPS時(shí)鐘授時(shí)裝置的各種咨詢。從電力變電站到5G網(wǎng)絡(luò)機(jī)房,從自動(dòng)駕駛測(cè)試場(chǎng)到金融數(shù)據(jù)中心,這些設(shè)備默默守護(hù)著現(xiàn)代社會(huì)的精密運(yùn)轉(zhuǎn)。今天,我想結(jié)合行業(yè)內(nèi)的技術(shù)發(fā)展和實(shí)際應(yīng)用中的經(jīng)驗(yàn),和大家聊聊GPS時(shí)鐘授時(shí)裝置那些
    的頭像 發(fā)表于 03-06 11:03 ?87次閱讀
    GPS時(shí)鐘授時(shí)裝置常見(jiàn)問(wèn)題與<b class='flag-5'>實(shí)戰(zhàn)經(jīng)驗(yàn)</b>分享

    智能破局焊接痛點(diǎn)!連接器 PIN 腳零缺陷檢測(cè)方案,3C &amp; 汽車電子質(zhì)控利器

    本期我們將聚焦 連接器 PIN 腳焊接環(huán)節(jié)的質(zhì)量管控難點(diǎn),結(jié)合近期成功交付的實(shí)戰(zhàn)經(jīng)驗(yàn),詳細(xì)解讀智能視覺(jué)檢測(cè)方案的落地實(shí)踐經(jīng)驗(yàn),為您提供視覺(jué)智能化升級(jí)的參考范例。
    的頭像 發(fā)表于 12-08 15:14 ?431次閱讀

    車載音頻功放芯片實(shí)戰(zhàn)經(jīng)驗(yàn)與深度疑問(wèn)

    100mV),需在芯片電源輸入端增加二級(jí)濾波電路(如并聯(lián) 2200μF 電解電容與 1μF 陶瓷電容組合),同時(shí)串聯(lián)個(gè)小型共模電感,減少紋波對(duì)音頻信號(hào)的干擾;而新車型電源紋波較?。ㄍǔ5陀?50mV
    發(fā)表于 12-05 09:53

    使用J-Flash來(lái)編程CW32 MCU

    閃存內(nèi)容。J-Flash提供了擦除整個(gè)閃存或特定扇區(qū)的選項(xiàng)。 7.編程閃存: 在J-Flash中,選擇“編程”選項(xiàng)開(kāi)始將固件編程到CW32
    發(fā)表于 11-25 07:00

    UART、SPI、I2C 實(shí)戰(zhàn)對(duì)比:哪個(gè)更適合你的項(xiàng)目?

    在嵌入式開(kāi)發(fā)中,設(shè)備之間的通信是繞不開(kāi)的話題。常見(jiàn)的三種總線接口——UART、SPI、I2C——各有優(yōu)缺點(diǎn)。不同項(xiàng)目需求決定了選擇哪種協(xié)議最合適。本文結(jié)合實(shí)戰(zhàn)經(jīng)驗(yàn),逐項(xiàng)對(duì)比三者,并附帶實(shí)戰(zhàn)代碼
    的頭像 發(fā)表于 11-24 19:04 ?1228次閱讀
    UART、SPI、I2C <b class='flag-5'>實(shí)戰(zhàn)</b>對(duì)比:哪個(gè)更適合你的項(xiàng)目?

    解鎖物聯(lián)網(wǎng)攝像頭潛力:低成本低功耗硬件設(shè)計(jì)實(shí)戰(zhàn)技巧!

    攝像頭是物聯(lián)網(wǎng)視覺(jué)感知的關(guān)鍵,但高成本與高功耗常成落地阻礙。本文基于實(shí)戰(zhàn)經(jīng)驗(yàn),提煉硬件設(shè)計(jì)實(shí)用技巧——從簡(jiǎn)化外圍電路到動(dòng)態(tài)功耗管理,助您以更低成本、更低功耗打造物聯(lián)網(wǎng)攝像頭,適配智能家居、安防監(jiān)控等場(chǎng)景。
    的頭像 發(fā)表于 09-20 15:22 ?1269次閱讀
    解鎖物聯(lián)網(wǎng)攝像頭潛力:低成本低功耗硬件設(shè)計(jì)<b class='flag-5'>實(shí)戰(zhàn)</b>技巧!

    淘寶商品詳情 API 實(shí)戰(zhàn):5 大策略提升店鋪轉(zhuǎn)化率(附簽名優(yōu)化代碼 + 避坑指南)

    ”“差評(píng)失控” 等轉(zhuǎn)化率殺手。本文結(jié)合我對(duì)接 300 + 淘寶店鋪的實(shí)戰(zhàn)經(jīng)驗(yàn),拆解 API 如何落地到動(dòng)態(tài)定價(jià)、庫(kù)存預(yù)警等 5 大場(chǎng)景,代碼做了簽名優(yōu)化和錯(cuò)誤處理,新手也能直接復(fù)用,避開(kāi) 90% 的調(diào)用坑。 、淘寶商品詳情 A
    的頭像 發(fā)表于 09-15 10:53 ?1014次閱讀

    數(shù)據(jù)庫(kù)慢查詢分析與SQL優(yōu)化實(shí)戰(zhàn)技巧

    今天,我將分享我在處理數(shù)千次數(shù)據(jù)庫(kù)性能問(wèn)題中積累的實(shí)戰(zhàn)經(jīng)驗(yàn),幫助你系統(tǒng)掌握慢查詢分析與SQL優(yōu)化的核心技巧。無(wú)論你是剛?cè)腴T的運(yùn)維新手,還是有經(jīng)驗(yàn)的工程師,這篇文章都將為你提供實(shí)用的解決方案。
    的頭像 發(fā)表于 09-08 09:34 ?1025次閱讀

    Linux服務(wù)器性能調(diào)優(yōu)的核心技巧和實(shí)戰(zhàn)經(jīng)驗(yàn)

    如果你正在為這些問(wèn)題頭疼,那么這篇文章就是為你準(zhǔn)備的!作為名擁有10年經(jīng)驗(yàn)的運(yùn)維工程師,我將毫無(wú)保留地分享Linux服務(wù)器性能調(diào)優(yōu)的核心技巧和實(shí)戰(zhàn)經(jīng)驗(yàn)
    的頭像 發(fā)表于 08-27 14:36 ?1083次閱讀

    SFUD驅(qū)動(dòng)庫(kù)實(shí)戰(zhàn)手冊(cè):串行SPI Flash開(kāi)發(fā)全流程解析

    工作原理與實(shí)戰(zhàn)技巧。 SFUD( Serial Flash Universal Driver)是開(kāi)源的串行SPI Flash通用驅(qū)動(dòng)庫(kù)。 ? 旨在解決不同品牌及規(guī)格串行Flash的命令
    的頭像 發(fā)表于 07-29 13:19 ?744次閱讀
    SFUD驅(qū)動(dòng)庫(kù)<b class='flag-5'>實(shí)戰(zhàn)</b>手冊(cè):串行SPI <b class='flag-5'>Flash</b>開(kāi)發(fā)全流程解析

    FLASH燒寫/編程白皮書

    白皮書:如何燒寫Flash——不同場(chǎng)景不同需求下的選擇認(rèn)識(shí)Flash?NAND vs. NOR如何燒寫/編程不同方案比較
    發(fā)表于 07-28 16:05 ?0次下載

    移動(dòng)電源EMC整改:認(rèn)證失敗到次通過(guò)的實(shí)戰(zhàn)經(jīng)驗(yàn)

    深圳南柯電子|移動(dòng)電源EMC整改:認(rèn)證失敗到次通過(guò)的實(shí)戰(zhàn)經(jīng)驗(yàn)
    的頭像 發(fā)表于 05-26 11:25 ?880次閱讀
    移動(dòng)電源EMC整改:認(rèn)證失敗到<b class='flag-5'>一</b>次通過(guò)的<b class='flag-5'>實(shí)戰(zhàn)經(jīng)驗(yàn)</b>

    如何通過(guò)SFL為設(shè)備添加Flash編程支持

    SEGGER Flash Loader(SFL)是J-Link設(shè)備支持套件(DSK)的部分,通過(guò)SFL,用戶可以為自己的新設(shè)備添加Flash編程支持。
    的頭像 發(fā)表于 05-19 16:35 ?1497次閱讀
    如何通過(guò)SFL為設(shè)備添加<b class='flag-5'>Flash</b><b class='flag-5'>編程</b>支持

    錫膏使用避坑指南:50 個(gè)實(shí)戰(zhàn)問(wèn)答幫你解決 99% 的焊接難題(全流程解析)

    問(wèn)題包含“原因分析 + 解決措施”,結(jié)合行業(yè)標(biāo)準(zhǔn)與實(shí)戰(zhàn)經(jīng)驗(yàn),為電子工程師、產(chǎn)線技術(shù)人員、營(yíng)銷工程師提供 “站式” 缺陷解決方案,助力提升焊接良率與產(chǎn)品可靠性。了解完5
    的頭像 發(fā)表于 04-14 09:45 ?1510次閱讀
    錫膏使用避坑指南:50 <b class='flag-5'>個(gè)</b><b class='flag-5'>實(shí)戰(zhàn)</b>問(wèn)答幫你解決 99% 的焊接難題(全流程解析)