前言
STM32L5是STM32家族中第一個基于Cortex-M33內核的系列,而TrustZone正是此內核最重要的特性,使能TrustZone的方法非常簡單,在RDP=0的情況下直接在option byte中將TZEN置1即可,但是一旦TrustZone使能后,與其相關的安全特性也將開啟,由于安全方面的特性,在TrustZone已經打開的情況下欲將其再次關閉卻不能像打開時那樣那么簡單操作了。本文將以用戶的視角描述一下關閉TrustZone的過程。
過程
為了講述這一過程,我們將以NUCLEO-L552ZE-Q這塊板子為例,工具使用STM32CubeProgrammer V2.4.0
首先通過CubeProgrammer這個工具將MCU的TrustZone打開, 在此之前讀保護RDP=0,是用戶面臨的選項字節最初始狀態:
按客戶的操作思路,接下來我們嘗試關閉TrustZone。
首先,直接在option byte中直將TZEN后那個勾去掉,然后Apply。
此時會出現錯誤,如上圖所示。
在TrustZone已經激活的情況下,是不能直接將其關掉的。
接下來查看參考手冊,在RM0438 4.4.2節有講述到如何將TrustZone關閉的內容:
顯然,原來TrustZone關閉必須是在讀保護從RDP1回退到RDP0的同時進行才可以。
首先,我們要將RDP設置為level1,然后再回退
如上圖所示,在設置RDP1的時候, 此時會出現警告,意思是說在TrustZone開啟的情況下嘗試使能RDP,如果當前FLASH內的代碼不能使得芯片上電后執行的程序最終跳轉到NS空間,將會導致關閉trustzone和回退RDP失敗,強烈建議將nSWBOOT0設置為1。這樣可以確保我們可以通過調整PH3/Boot0引腳電平來從系統bootloader啟動,這是一定可以跑到NS程序空間的。【NS:Non-Secure】
我們先選擇“取消”,然后檢查nSWBOOT0的設置:
如上圖所示,nSWBOOT0的值已經為1,是OK的,其值表示BOOT0的值將從PH3引腳的狀態來決定 。
既然關閉TrustZone必須是RDP從LEVEL 1回退到LEVEL 0的過程中操作才行,那么我們必須要先將RDP設置為LEVEL 1才行。使能RDP LEVEL 1:
如上圖所示,警告意思是: 你確定?你的MCU將可能永遠喪失!
點擊OK。如下圖所示:
表示FLASH內的數據已經不能讀取了,RDP LEVEL 1使能后,FLASH的內容自然不能再讀出,點擊OK。
此時再次嘗試連接,則出現如下界面所示 :
此時,ST-Link果然不能再連接。
那么接下來我們該如何做呢?-》拉高PH3, 讓MCU從RSS啟動。
以NUCLEO-L552-Q板為例,將PH3拉到VDD后,再次上電重啟,此時板上的藍色的LD2和紅色LD3亮起。按照這塊板子的用戶手冊UM2581,章節6.11.2說明:直接把CN11上的引腳5(VDD)和引腳7(PH3_BOOT0)短接即可。
使用Cubeprogrammer,以hotplug模式進行連接(Mode :Hot plug) :
嘗試連接:
如上圖所示,ST-Link已經連接上,只不過由于RDP LEVEL 1使能了而不能讀取FLASH內容,但此時option bytes是可以修改的。
打開Option byte界面,在User configuration下將TZEN對應的復選框內的勾去掉,然后再將Read Out Protection下的RDP改回LEVEL 0,然后點擊Apply
上圖表示已經修改成功,斷開連接,斷開電源,然后將PH3引腳的高電平恢復到低電平。上電后再次連接…
如上圖所示,再次連上時,FLASH的內容由于RDP LEVEL 1回退到LEVEL 0時被全部清空。此時再次查看RDP和TZEN的值 :
RDP恢復到LEVEL 0,TrustZone成功關閉。
后注 :
1》 關閉trustzone需要通過RDP級別回退完成。
2》 nSWBOOT0=1 && BOOT0/ PH3引腳為高,使得上電后系統從RSS啟動。
3》 在STM32CubeProgrammer中使用hot plug連接方式是為了讓MCU從RSS啟動后,在運行到NS空間的時候方便跟調試端口連接,以便進行后續的Option Bytes修改操作。
責任編輯:pj