• 資料介紹
    • 1、前言
    • 2、問題調(diào)研與復現(xiàn)
    • 3、問題分析與解決辦法
    • 4、小結(jié)
  • 資料預覽
  • 相關(guān)推薦
申請入駐 產(chǎn)業(yè)圖譜

LAT1450 不斷電情況下修改RDP選項并生效的解決方案

03/11 16:41
363
加入交流群
掃碼加入
獲取工程師必備禮包
參與熱點資訊討論

LAT1450 不斷電情況下修改RDP選項并生效的解決方案

774.04 KB

1、前言

某客戶使用 STM32L4 開發(fā)一款產(chǎn)品,組裝外殼后通過脫機燒錄器進行燒寫,燒好后放置到庫房,存放期間由電池進行供電,出庫發(fā)貨時通過 UART_IR 紅外接口接收指令將 Option ByteRDP 設置為 RDP2 讀保護。但是,發(fā)現(xiàn)一旦執(zhí)行 RDP=2 指令后 STM32 立即出現(xiàn)死機變磚,即使進行 NRST 引腳硬件復位也無效,必須拔下電池(斷電)后 MCU 才能恢復工作。

2、問題調(diào)研與復現(xiàn)

接到客戶反饋后立即與客戶進行了溝通,并告知客戶修改 RDP 后需要斷開 SWD/JTAG 調(diào)試口與 MCU 之間的物理連接,并且需要復位一次后 RDP 才會生效??蛻粼偃_認他們使能RDP 是通過遠程指令操作的,且外殼組裝后也沒辦法做斷電復位,即使 NRST 硬件也無效,該生產(chǎn)線流程是 STM32L151 一直沿用下來的,更改產(chǎn)線將增加生產(chǎn)成本。根據(jù)客戶描述及生產(chǎn)流程,在 NUCLEO-L476RG 上進行了測試和驗證。

(一)復現(xiàn)問題編寫測試程序,下載后將 NUCLEO-L476 ST-LINK 跳線帽斷開,在 Tera 串口終端輸入指令將 RDP 修改為 Lvel1(0xBB),當執(zhí)行 OB_Launch 指令后程序卡死,NRST 按鍵復位無效。

(二) 使用 STM32Cubeprogrammer 將選項字恢復到 Level0(RDP=0xAA),斷開 ST-LINK 跳線帽斷電一次,可以看到在執(zhí)行完 HAL_FLASH_OB_Launch()后,MCU 立即復位并成功運行。

也就證實了 STM32L4 在修改選項字后,必須對系統(tǒng)實施一次斷電操作,系統(tǒng)才能正常運行。

3、問題分析與解決辦法

既然問題是由于 MCU 沒有斷電的情況下,執(zhí)行 HAL_FLASH_OB_Launch()后無法正常復位引起,那么我們能否通過軟件方式,讓 MCU 產(chǎn)生掉電從而實現(xiàn)與斷電同等的效果呢?STM32L4 在 Shutdown 模式下 CPU、SRAM、LPR 均處于掉電狀態(tài)。因此,能否在修改選項字 RDP 后使 MCU 進入 Shutdown 模式,然后再喚醒從而使 RDP 生效呢?

按照上面的思路,對代碼做如下改動 :

  1. 修改 RDP 后不再執(zhí)行 HAL_FLASH_OB_Launch(),不立即生效(不卡死).
  2. MCU 進入 shutdown 模式
  3. 使用一個按鍵作為喚醒原觸發(fā) shutdown 喚醒,并產(chǎn)生復位。

4、小結(jié)

對于早期的 STM32F0xx/ STM32F1xx/ STM32F2xx/ STM32F4xx 在修改讀保護(RDP)后,只需要執(zhí)行 HAL_FLASH_OB_Launch()后 MCU 會自動復位 RDP 生效。但是,對于STM32F4 以后量產(chǎn)的型號,修改選項字后必須重新斷電一次,MCU 才能正常運行。對于此方法,筆者使用的是 GPIO 作為喚醒源來使 MCU 從 shutdown 模式喚醒。其實,若使用 RTC 作為喚醒源稍作配置,就可以無需手動操作實現(xiàn) RDP 不斷電的修改生效。

資料預覽

相關(guān)推薦