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修改操作。
参考文档:AN5347