精品国产人成在线_亚洲高清无码在线观看_国产在线视频国产永久2021_国产AV综合第一页一个的一区免费影院黑人_最近中文字幕MV高清在线视频

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

實戰經驗 | 一個 Flash 編程錯誤標志的探析

STM32單片機 ? 來源:未知 ? 2023-11-10 17:45 ? 次閱讀


關鍵詞:Flash, 編程錯誤


目錄預覽

1、問題現象與分析

2、小結

3、后記


01

問題現象與分析


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


圖1.Flash 編程錯誤標志


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


問題分析及測試


查看客戶的工程, 由于客戶的工程相當龐大, 各個模塊和任務相互交叉, 一時半刻是很難從如此龐大的工程中找出問題, 更麻煩地是, 客戶的電腦是有加密系統的, 導致在工程內查找任何字符和函數都相當痛苦. 好在是, 問題能夠穩定地復現。


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


原來客戶的工程中有用到兩個串口, 串口 2 和串口 3, 都是使用的 DMA 模式。客戶不同的軟件人員負責不同的模塊, 最終在整合代碼時, 串口 2 并沒有使用, 所以串口 2 對應的初始化代碼是刪除掉的, 但由于串口 2 和串口 3 的 DMA 中斷是共用一條中斷線, 是相同的中斷入口, 在中斷處理時,串口 2 的 DMA 處理函數和串口 3 的處理函數都會一起處理. 問題就出在串口 2 的 DMA 中斷處理并沒有移除 。如 stm32g0xx_it.c 文件 :



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



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


當在中斷中將串口 2 的 DMA 對應處理函數移除掉后功能就恢復正常, 這也佐證了結論的準確性。


另外, 客戶反映, 這個最小化工程, 相同的代碼, 使用 IAR 時測試會出錯, 但使用 KEIL 時并沒有出錯. 這個很奇怪. 這就引出的另外一個問題. 相同代碼, 不同編譯器運行結果不一致的問題。于是繼續找原因, 對比 IAR 和 KEIL 的調試情況, 發現當代碼運行到圖 2 中 857 行代碼 if 語句時其判斷結果不相同. IAR 調試環境會進入到 if 語句內容, 從而導致錯誤的給內部 FLASH 地址賦值, 進行導致問題. 而 KEIL 調試環境并沒有進入到 if 語句內部, 因此并沒有觸發問題. 那么為什么if 語句的判斷結果不一樣呢?


為了方便并避免不同編譯器對長語句的執行順序的差異, 將這個 if 長語句拆開:



如上紅色代碼, 用它替換原來的 if 判斷語句. 結果發現 tmp1 在 IAR 和 KEIL 兩個編譯器環境中的值是一樣的, 但是 tmp2 的值卻不一樣, 正是由于 tmp2 值的不一樣, 導致 if 語句的最終判斷結果不同。進一步發現, tmp2 的值主要是由于 flag_it 的值在兩種編譯器環境不一樣所致。



如上 IAR 編譯器環境, flag_it 的值為 0x2000 10f8。



如上 KEIL 編譯器環境, flag_it 的值卻是 0x2000 14F0。


那么 flag_it 的值又是如何來的呢? 從如下代碼:



如上所示, flag_it 的值來自 hdma->DmaBaseAddress->ISR, 原來是 DMA 相關 ISR 寄存器的值, 但實際調試如下:



如上 IAR 調試環境下, 出錯時, hdma->DmaBaseAddress 實際指向的是地址 0, 其成員 ISR為其第一個成員, 實際也就是地址 0 上的數據. 我們都知道, 在默認情況下, MCU 的地址 0 默認是映射到內部 FLASH 的首地址 0x0800 0000 上的, 而此地址一般保存的是棧頂.。也就是說, IAR 編譯環境下, 地址 0 指向棧頂地址 0x2000 10f8。


對應地, 在 KEIL 調試環境下:



如上 KEIL 調試環境, hdma->DmaBaseAddress 同樣地實際指向的是地址 0, 而地址 0 的上對應的數據為棧頂地址: 0x2000 14F0。


也就是說, 在不同的 編譯器 IAR 和 KEIL 環境下, 地址 0 指向棧頂地址是未必相同的, 進而導致兩種編譯環境下運行相同的代碼結果不一樣。


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


02

小結


至此,將問題稍作小結。給變量 flag_it 實際賦值棧頂地址, 不同的編譯器環境下, 此棧頂地址的不一致導致變量 flag_it 的值不一致, 進而導致 if 語句的判斷結果不同, 最終導致 IAR 和 KEIL 這兩個編譯器環境下運行相同代碼而結果不一樣的情形。


03

后記


有時會聽到某某客戶反饋說, 在網絡上看到 STM32 某款 MCU 存在某某問題, 然后問是不是 ST 故意隱瞞 ?


不存在故意隱瞞的說法,芯片終究是要經過終端驗證的。


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



完整內容請點擊“閱讀原文”下載原文檔。




原文標題:實戰經驗 | 一個 Flash 編程錯誤標志的探析

文章出處:【微信公眾號:STM32單片機】歡迎添加關注!文章轉載請注明出處。

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 單片機
    +關注

    關注

    6032

    文章

    44522

    瀏覽量

    633203
  • STM32
    +關注

    關注

    2266

    文章

    10875

    瀏覽量

    354899

原文標題:實戰經驗 | 一個 Flash 編程錯誤標志的探析

文章出處:【微信號:STM32_STM8_MCU,微信公眾號:STM32單片機】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    socket編程中的錯誤處理技巧

    Socket編程是網絡編程的基礎,它允許程序之間通過TCP/IP協議進行通信。然而,網絡通信是不穩定的,可能會遇到各種問題,如網絡延遲、連接中斷、數據丟失等。 錯誤處理的重要性 提高程序的健壯性
    的頭像 發表于 11-01 17:47 ?801次閱讀

    【全新課程資料】正點原子《基于GD32 ARM32單片機項目實戰入門》培訓課程資料上線!

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

    文讀懂CAN通訊錯誤

    CAN總線通信技術廣泛應用于多個行業,是每個總線設計工程師必學的通訊網絡。然而,對于CAN通信中的錯誤幀,許多人僅停留在表面了解,缺乏深入理解,這導致許多工程師在面對總線通信故障時感到無從下手
    的頭像 發表于 06-12 08:24 ?2563次閱讀
    <b class='flag-5'>一</b>文讀懂CAN通訊<b class='flag-5'>錯誤</b>幀

    文讀懂CAN控制器錯誤處理的原理

    “被動錯誤標志”。站檢測到無論是位錯誤、填充錯誤、形式錯誤,還是應答錯誤,這個站會在下
    的頭像 發表于 04-26 08:25 ?1545次閱讀
    <b class='flag-5'>一</b>文讀懂CAN控制器<b class='flag-5'>錯誤</b>處理的原理

    STM32L475VE內部Flash編程出現ECCD錯誤的原因?

    使用的芯片型號 STM32L475VE,使用 HAL 庫 `HAL_FLASH_Program` API 對 內部 Flash 進行編程,出現 ECCD 錯誤。 返回
    發表于 04-26 07:21

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

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

    stm32g473 flash擦除失敗的原因?

    flash在擦除的時候有需要注意的點沒有注意到。 單步調試有時進入HAL_FLASHEx_Erase( EraseInitStruct,PAGEError),就會引起SR寄存器報下面的錯誤
    發表于 03-26 08:11

    STM32關于FLASH編程對齊錯誤標志位(PGAERR)的疑問求解

    大神們,我現在正在做一個應用,需要熟悉STM32F4的FLASH的任何錯誤標識,以用于特殊情況下的錯誤標識判斷做相應處理,但是針對FLASH
    發表于 03-22 07:59

    STM32H5 DA證書鏈實戰經驗

    之前我們已經講過了如何通過 DA 認證來回退芯片產品狀態,或者重新打開調試口,這樣開發人員在芯片為 Closed 狀態下時仍可以調試芯片。
    的頭像 發表于 03-12 14:08 ?1016次閱讀
    STM32H5 DA證書鏈<b class='flag-5'>實戰經驗</b>

    介紹IC設計錯誤案例:可讀debug寄存器錯誤跨時鐘

    本文將介紹跨時鐘錯誤的案例如圖所示,phy_status作為多bit的phy_clk時鐘域的信號,需要輸入csr模塊作為
    的頭像 發表于 03-11 15:56 ?476次閱讀
    介紹<b class='flag-5'>一</b><b class='flag-5'>個</b>IC設計<b class='flag-5'>錯誤</b>案例:可讀debug寄存器<b class='flag-5'>錯誤</b>跨時鐘

    BlueNRG系列協處理器實戰經驗簡介

    BlueNRG 系列芯片從最早的代 BlueNRG-MS 開始就支持協處理器模式。
    的頭像 發表于 01-05 18:16 ?1796次閱讀
    BlueNRG系列協處理器<b class='flag-5'>實戰經驗</b>簡介

    實戰經驗 | 如何在用戶應用中開啟 LoRa CAD

    STM32WL LoRa 發送數據,或做相應的操作。為了降低功耗,STM32WL不能直處于接收狀態,這樣功耗會很高。我們可以開啟 LoRa CAD(信道活動檢測)功能,STM32WL 通過開啟 CAD 功能,檢測前導碼的前 1/
    的頭像 發表于 12-26 17:45 ?1448次閱讀
    <b class='flag-5'>實戰經驗</b> | 如何在用戶應用中開啟 LoRa CAD

    PCB制板實戰經驗分享:PCB制板的22規則

    不要以為PCB制板很簡單,那只能說明你水平還有待提高。在現代集成器件密度越來越大的情況下,PCB布線布局的優劣直接影響產品的性能,甚至是關及設計成敗之關鍵。正如日本電子所說:十種器件,也可能有無數種排列的可能。
    發表于 12-12 16:35 ?410次閱讀

    Nor Flash編程和擦除操作實踐與指南

    閃存編程也不涉及將數據寫入存儲單元,為確保準確編程,Nor Flash 支持字節級編程,允許寫入或修改單個字節,而無需擦除整個塊。
    的頭像 發表于 12-05 14:03 ?2185次閱讀

    javaweb從入門到實戰

    的學習和實踐。本文將為大家詳述JavaWeb的入門以及實戰經驗,希望能幫助到正在追求JavaWeb技術的開發者。 入門 1.1 Java基礎知識 在學習JavaWeb之前,首先要掌握Java語言的基礎知識,包括面向對象的概念、類與對象、繼承與多態、異常處理等。理解這些基礎概念對于
    的頭像 發表于 12-03 11:44 ?1481次閱讀