LPC55 如何避免 Flash ECC 校驗錯誤導致 Hardfault

關鍵字 :lpc55flashecc總線nxp

    不知道大家在使用 NXP LPC55 系列調試開發過程中,是否有遇到過操作晶片內 Flash 導致 Hardfault 的情況,檢查發現程序中也沒有出現越界訪問,那麼是什麼原因導致的呢?

    可能情況一:通過 AHB 總線對 Flash 中擦除後未重新編程的區域進行讀取,例如通過 memcpy 直接對 Flash 中的某段地址進行操作,而該區域被擦除後,並未重新寫入數據,由於讀取 LPC55 Flash 存在 ECC 校驗,而擦除過後的 Flash 並未設置正確的 ECC,此時直接讀取就會導致 ECC 校驗錯誤,進入 HardFault_Handler();

    可能情況二:通常對 Flash 的寫數據時的步驟是先擦除後寫入,當對 Flash 中已經寫入過的區域,未執行擦除操作,進行二次寫入,可能會導致奇偶校驗位不一致,此時通過 AHB 總線對 Flash 中該區域進行讀取會導致 ECC 校驗錯誤進入 HardFault_Handler();

    那麼為了防止在操作 Flash 時出現 HardFault 的情況,導致代碼無法繼續正常運行,首先,在編寫程序時,代碼邏輯上就需要注意,去避免以上兩種情況的出現,然後細心的讀者也可能會發現,上面所說的兩種情況,實際上都是因為 ECC 的校驗錯誤導致的 HardFault,如果在程序運行中,晶片正在進行 Flash 的寫入或者擦除,此時因為外部的一些影響(例如意外掉電等),導致 Flash 操作中斷,也可能會導致該區域的 ECC 設置錯誤,再次運行時對該區域訪問就會導致同樣的 HardFault 問題(雖然這種情況機率非常的低),那麼有沒有辦法避免呢?

    答案當然是有的,為了避免 ECC 導致 HardFault,在程序中需要對 Flash 進行讀取時,就不去使用 AHB 總線直接訪問的方式了,修改使用 LPC55 系列 SDK 中提供的操作 Flash 的 API 進行操作,這裡讀取 Flash 就使用 FLASH_Read() API 進行讀取;

        LPC55 如何避免 Flash ECC 校驗錯誤導致 Hardfault

    使用 FLASH_Read() API 進行 Flash 讀取的好處,FLASH_Read() 執行後會反饋該讀取操作的結果,所以即使在讀取過程中,遇到了 ECC 錯誤的問題,也不會進入 HardFault,並且還可以根據 FLASH_Read() 的返回值進行判斷,從而做出相應的處理;

    例如下面這段測試代碼,對 Flash 中,進行過未擦除重複寫入的區域進行讀取時,出現返回值 116,即 ECC 校驗錯誤,但此時程序並未進入 HardFault,且代碼中根據返回值,還可以進行相應的處理,例如代碼中對該區域進行重新的擦除寫入,清除了 ECC 錯誤,從而避免了讀取 Flash ECC 校驗錯誤就進入 HardFault 的問題;

        LPC55 如何避免 Flash ECC 校驗錯誤導致 Hardfault

    如果對於 FLASH_Read() 等相關操作 API 不熟悉,可以參考 SDK 中的  flashiap1 例程;

        LPC55 如何避免 Flash ECC 校驗錯誤導致 Hardfault

    以上就是本篇文章的全部內容,如果文章中有錯誤或有其他問題歡迎提出指正,感謝大家。

★博文內容均由個人提供,與平台無關,如有違法或侵權,請與網站管理員聯繫。

★文明上網,請理性發言。內容一周內被舉報5次,發文人進小黑屋喔~

評論