在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

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ī) ? 來源:未知 ? 2023-11-10 17:45 ? 次閱讀


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


目錄預(yù)覽

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

2、小結(jié)

3、后記


01

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


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


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


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


問題分析及測(cè)試


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


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


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



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



如上面代碼所示, 代碼運(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 等操作, 有一套寫操作流程. 并不是直接用賦值語句, 這樣操作出現(xiàn)問題一點(diǎn)也不奇怪。


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


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


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



如上紅色代碼, 用它替換原來的 if 判斷語句. 結(jié)果發(fā)現(xiàn) tmp1 在 IAR 和 KEIL 兩個(gè)編譯器環(huán)境中的值是一樣的, 但是 tmp2 的值卻不一樣, 正是由于 tmp2 值的不一樣, 導(dǎo)致 if 語句的最終判斷結(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 的值又是如何來的呢? 從如下代碼:



如上所示, flag_it 的值來自 hdma->DmaBaseAddress->ISR, 原來是 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 上的, 而此地址一般保存的是棧頂.。也就是說, 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。


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


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


02

小結(jié)


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


03

后記


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


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


正常來講, 任何芯片存在應(yīng)用局限是正常的。對(duì)于 ST,一方面會(huì)正式地將所有已知 bug或應(yīng)用局限放入到勘誤手冊(cè)中公示, 大家需要注意使用最新版勘誤手冊(cè);另一方面,對(duì)于 ST 量產(chǎn)芯片,因本身缺陷導(dǎo)致的問題的概率非常低。事實(shí)上,絕大多數(shù)問題都來自我們自身的應(yīng)用,遇到問題若簡單的基于芯片品質(zhì)來回猜疑非常不利于開發(fā)者靜下心來查找問題原因。其實(shí),面對(duì)問題時(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ī)問題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 單片機(jī)
    +關(guān)注

    關(guān)注

    6039

    文章

    44583

    瀏覽量

    636507
  • STM32
    +關(guān)注

    關(guān)注

    2270

    文章

    10910

    瀏覽量

    356605

原文標(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)推薦

    提升開關(guān)電源效率的理論分析與實(shí)戰(zhàn)經(jīng)驗(yàn)

    在這里有電源技術(shù)干貨、電源行業(yè)發(fā)展趨勢(shì)分析、最新電源產(chǎn)品介紹、眾多電源達(dá)人與您分享電源技術(shù)經(jīng)驗(yàn),關(guān)注我們,與中國電源行業(yè)共成長! 提升開關(guān)電源效率的理論分析與實(shí)戰(zhàn)經(jīng)驗(yàn) 引言 開關(guān)電源設(shè)計(jì)中,為獲得
    的頭像 發(fā)表于 01-09 10:04 ?163次閱讀
    提升開關(guān)電源效率的理論分析與<b class='flag-5'>實(shí)戰(zhàn)經(jīng)驗(yàn)</b>

    使用MCUXpresso for VS Code插件開發(fā)Zephyr的hello world

    本期來到Zephyr實(shí)戰(zhàn)經(jīng)驗(yàn)演練,小編帶著大家起使用MCUXpresso for VS Code插件來開發(fā)個(gè)屬于Zephyr的hello world。
    的頭像 發(fā)表于 01-03 09:21 ?464次閱讀
    使用MCUXpresso for VS Code插件開發(fā)Zephyr的hello world

    EEPROM編程常見錯(cuò)誤及解決方案

    EEPROM(電可擦可編程只讀存儲(chǔ)器)在編程過程中可能會(huì)遇到多種錯(cuò)誤。以下是些常見的EEPROM編程錯(cuò)
    的頭像 發(fā)表于 12-16 17:08 ?934次閱讀

    C++新手容易犯的十個(gè)編程錯(cuò)誤

    簡單的總結(jié)下?C++ 新手容易犯的編程錯(cuò)誤,給新人們提供個(gè)參考。 1 有些關(guān)鍵字在 cp
    的頭像 發(fā)表于 11-15 12:42 ?415次閱讀

    socket編程中的錯(cuò)誤處理技巧

    Socket編程是網(wǎng)絡(luò)編程的基礎(chǔ),它允許程序之間通過TCP/IP協(xié)議進(jìn)行通信。然而,網(wǎng)絡(luò)通信是不穩(wěn)定的,可能會(huì)遇到各種問題,如網(wǎng)絡(luò)延遲、連接中斷、數(shù)據(jù)丟失等。 錯(cuò)誤處理的重要性 提高程序的健壯性
    的頭像 發(fā)表于 11-01 17:47 ?889次閱讀

    【全新課程資料】正點(diǎn)原子《基于GD32 ARM32單片機(jī)項(xiàng)目實(shí)戰(zhàn)入門》培訓(xùn)課程資料上線!

    ,提高編程能力和實(shí)戰(zhàn)經(jīng)驗(yàn) 四、適合人群 (1)單片機(jī)編程初學(xué)者 (2)電子工程師 (3)對(duì)ARM32單片機(jī)有興趣的技術(shù)愛好者 五、課程詳細(xì)介紹 1、培訓(xùn)課程包含: (1)全套培訓(xùn)課程視頻(已全部錄制
    發(fā)表于 09-24 18:06

    文讀懂CAN通訊錯(cuò)誤

    CAN總線通信技術(shù)廣泛應(yīng)用于多個(gè)行業(yè),是每個(gè)總線設(shè)計(jì)工程師必學(xué)的個(gè)通訊網(wǎng)絡(luò)。然而,對(duì)于CAN通信中的錯(cuò)誤幀,許多人僅停留在表面了解,缺乏深入理解,這導(dǎo)致許多工程師在面對(duì)總線通信故障時(shí)感到無從下手
    的頭像 發(fā)表于 06-12 08:24 ?2784次閱讀
    <b class='flag-5'>一</b>文讀懂CAN通訊<b class='flag-5'>錯(cuò)誤</b>幀

    jlink可以讀出flash里的內(nèi)容嗎?

    我的IAP順序是這樣的: 1.程序啟動(dòng)檢查標(biāo)志 2.更具標(biāo)志進(jìn)入IAP 3.擦除用到的頁 4.編程數(shù)據(jù)進(jìn)FLASH(我的
    發(fā)表于 05-17 06:32

    文讀懂CAN控制器錯(cuò)誤處理的原理

    “被動(dòng)錯(cuò)誤標(biāo)志”。站檢測(cè)到無論是位錯(cuò)誤、填充錯(cuò)誤、形式錯(cuò)誤,還是應(yīng)答錯(cuò)誤,這個(gè)站會(huì)在下
    的頭像 發(fā)表于 04-26 08:25 ?1652次閱讀
    <b class='flag-5'>一</b>文讀懂CAN控制器<b class='flag-5'>錯(cuò)誤</b>處理的原理

    STM32L475VE內(nèi)部Flash編程出現(xiàn)ECCD錯(cuò)誤的原因?

    使用的芯片型號(hào) STM32L475VE,使用 HAL 庫 `HAL_FLASH_Program` API 對(duì) 內(nèi)部 Flash 進(jìn)行編程,出現(xiàn) ECCD 錯(cuò)誤。 返回
    發(fā)表于 04-26 07:21

    STM32L476先用仿真器擦除FLASH后在程序中寫不成功怎么解決?

    STM32L476寫FLASH必須是64位(8字節(jié))寫,也就是double WORD,而且要先把要寫的字節(jié)部分擦除掉。 問題來了,先把整片用仿真器擦除掉,程序中先定義個(gè)64位的靜態(tài)變量常數(shù)
    發(fā)表于 03-28 08:44

    stm32g473 flash擦除失敗的原因?

    flash在擦除的時(shí)候有需要注意的點(diǎn)沒有注意到。 單步調(diào)試有時(shí)進(jìn)入HAL_FLASHEx_Erase( EraseInitStruct,PAGEError),就會(huì)引起SR寄存器報(bào)下面的錯(cuò)誤
    發(fā)表于 03-26 08:11

    STM32關(guān)于FLASH編程對(duì)齊錯(cuò)誤標(biāo)志位(PGAERR)的疑問求解

    大神們,我現(xiàn)在正在做一個(gè)應(yīng)用,需要熟悉STM32F4的FLASH的任何錯(cuò)誤標(biāo)識(shí),以用于特殊情況下的錯(cuò)誤標(biāo)識(shí)判斷做相應(yīng)處理,但是針對(duì)FLASH
    發(fā)表于 03-22 07:59

    STM32H5 DA證書鏈實(shí)戰(zhàn)經(jīng)驗(yàn)

    之前我們已經(jīng)講過了如何通過 DA 認(rèn)證來回退芯片產(chǎn)品狀態(tài),或者重新打開調(diào)試口,這樣開發(fā)人員在芯片為 Closed 狀態(tài)下時(shí)仍可以調(diào)試芯片。
    的頭像 發(fā)表于 03-12 14:08 ?1137次閱讀
    STM32H5 DA證書鏈<b class='flag-5'>實(shí)戰(zhàn)經(jīng)驗(yàn)</b>

    介紹個(gè)IC設(shè)計(jì)錯(cuò)誤案例:可讀debug寄存器錯(cuò)誤跨時(shí)鐘

    本文將介紹個(gè)跨時(shí)鐘錯(cuò)誤的案例如圖所示,phy_status作為個(gè)多bit的phy_clk時(shí)鐘域的信號(hào),需要輸入csr模塊作為
    的頭像 發(fā)表于 03-11 15:56 ?574次閱讀
    介紹<b class='flag-5'>一</b><b class='flag-5'>個(gè)</b>IC設(shè)計(jì)<b class='flag-5'>錯(cuò)誤</b>案例:可讀debug寄存器<b class='flag-5'>錯(cuò)誤</b>跨時(shí)鐘
    主站蜘蛛池模板: 亚州人成网在线播放| 手机看片国产免费永久| 国产2021成人精品| 日本亚洲高清乱码中文在线观看| 加勒比日本在线| 天天摸夜夜添夜夜添国产| 国产色丁香久久综合| 黄网站色成年片大免费软件| 国产在线五月综合婷婷| 免费一级欧美片在线观免看 | 天天操天天插天天射| 天堂网www中文天堂在线| 久久9966精品国产免费| 欧美69xx性欧美| 国产女乱淫真高清免费视频| 韩国精品视频| 在线观看视频高清视频| 色橹橹| 成人精品福利| 久久黄视频| 五月激情啪啪网| 色综合久久网女同蕾丝边| 亚洲综合精品一区二区三区中文| 日本不卡免费高清视频| 亚洲一区区| 曰韩高清一级毛片| 被男同桌摸内裤好爽视频| 亚洲 欧美 丝袜 制服 在线| 日本天堂影院在线播放| 日本黄色高清视频| 国产亚洲综合色就色| 婷婷在线观看香蕉五月天| 国产精品福利久久2020| 亚洲 丝袜 制服 欧美 另类| 亚洲精品456人成在线| 欧美日本一区二区三区| 国产成人av在线| 日本巨黄视频| 中文字幕在线二区| 免费播放一区二区三区| 婷婷激情小说网|