簡介
客戶在使用 STM32G474RE 進行產品開發(fā)的時候,操作系統(tǒng)軟件使用了 RT-Thread5.0,同時由于要做 ClassB 認證,所以在 RT-Thread 系統(tǒng)上,移植了 ClassB 2-3-0 版本安全庫。用戶程序另外一個功能是固件升級,在調試固件升級程序的過程中,發(fā)現(xiàn)一旦執(zhí)行了ClassB 的啟動自檢,就會出現(xiàn)固件升級失敗。調試發(fā)現(xiàn),固件升級失敗的原因是寫 Flash 的時候發(fā)現(xiàn) Flash 狀態(tài)寄存器的錯誤標志被置位,導致 Flash 寫操作失敗??蛻舾鶕F(xiàn)此象反饋 ClassB 的自檢代碼有隱患,導致 Flash 出錯。本文分析了出現(xiàn)該錯誤的原因以及解決辦法。
問題描述
根據客戶的問題反饋,我在 NUCLEO-G474RE 開發(fā)板上單獨移植 ClassB,通過調試,沒有發(fā)現(xiàn)類似問題。為了復現(xiàn)該問題,從 RT-Thread 官方網站上下載了 5.0 版本的 RTThread 代碼。RT-Thread 對 STM32 的支持是相當友好的,代碼中包含了對多數 STM32開發(fā)板的支持,所以對于 NUCLEO-G474RE 開發(fā)板,只需要找到對應的目錄,打開工程即可。
問題分析與解決
結合參考手冊對 PGAERR 以及 PGSERR 的描述,只能從寫 Flash 的角度去分析問題產生的原因,最終通過單步調試,發(fā)現(xiàn)其中一句代碼導致了該錯誤標志位的置起。
小結
在 STM32 軟件開發(fā)中,不當的指針操作,尤其使用未經初始化的指針可能會引起莫名奇妙的問題,所以在使用指針變量的時候,需要注意指針地址的正確性。