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

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

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

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

774.04 KB

1、前言

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

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

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

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

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

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

3、問題分析與解決辦法

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

按照上面的思路,對代碼做如下改動(dòng) :

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

4、小結(jié)

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

資料預(yù)覽

相關(guān)推薦