[信息] STM32H5在使能TrustZone下实现High-Cycle的数据存储

[复制链接]
204|10
STM新闻官 发表于 2025-11-2 09:27 | 显示全部楼层 |阅读模式
本帖最后由 STM新闻官 于 2025-11-2 09:33 编辑

1. 概述
STM32H5系列(H503除外)提供高达96 KBytes的EDATA内存区域,支持高达10万次的擦写周期,可用于存储数据和模拟EEPROM功能。该区域通过 AHB 系统总线访问,地址范围为0x09000000~0x09017FFF,映射于闪存 Bank1 和 Bank2 的最后 8 个(或 4 个)扇区。其核心特性包括: 1. 6位ECC纠错:保障数据可靠性,支持16 位读写粒度。

2. 扇区大小调整 : 由于增加的ECC位,数据区扇区大小缩减至6KB。

3. 双 Bank 独立配置:通过寄存器独立设置 Bank1/Bank2 的数据区起始位置,默认全空间用于代码存储。

2. 实验内容
在STM32CubeH5的固件包中,官方提供了一个例程(例程路径示例:STM32Cube_FW_H5_V1.4.0\Projects\NUCLEOH563ZI\Examples\FLASH\FLASH_EDATA_EraseProgram),该例程是基于TrustZone没有激活的场景。 本文将介绍如何在激活TrustZone的架构中,实现S侧操作Bank1的48KB的EDATA,NS侧操作Bank2的48KB的EDATA,以供大家参考使用。

2.1. 创建工程 首先我们通过STM32CubeMX创建基于STM32H5的激活TrustZone的基础工程,这里以NUCLEO-H563ZI实验板为硬件来验证结果。



805226906b2c61ed2c.png
626936906b2db96c24.png
804846906b2e4ab8f0.png
在STM32CubeMX中,我们不需要配置任何外设,创建完工程后可以直接生成代码,然后编译,正常的话,工程是可以编译通过的。 然后我们按照官方的例程,复制相关代码,这里主要是复制HAL_FLASH_Unlock、EDATA的擦除(HAL_FLASHEx_Erase)、EDATA的写入(HAL_FLASH_Program),还有结果的验证(Check_Flash_Content),这个过程中要处理对应的编译错误(主要是对应的变量的申明和宏定义也需要复制过来即可,在此不展开细说)。
此时,我们就可以得到复制了相关代码,且能够通过编译的工程,但是呢,此时还不能成功的操作EDATA,接下来我们还要完成TrustZone相关的配置。 2.2. TrustZone 相关配置 1. EDATA的操作地址 以下是RM0481中关于STM32H563ZI(2MByte-Flash)的EDATA的memory map。
963996906b313c22c1.png
从这张图中可以看出,当Bank1中的最后8个sector被定义为EDATA时,我们在S侧操作EDATA时,其对应的地址为0x0D0xxxxx,NS侧操作EDATA时,对应的地址为0x090xxxxx。

2. 因为CubeMX生成的默认工程中,将NSC区域定义在bank1的最后的8K空间中,但是现在bank1的最后48K被用于EDATA了,所以我们需要通过调整S侧工程的ld文件,将NSC区域的位置调整到Bank1的尾部48K之前去,修改代码如下高亮部分所示: { } RAM    (xrw)    : ORIGIN = 0x30000000,   LENGTH = 320K FLASH    (rx)    : ORIGIN = 0x0C000000,   LENGTH = 1016K FLASH_NSC    (rx)    : ORIGIN = 0x0C0EE000,   LENGTH = 8K

3. 在TrustZone结构中操作EDATA区域时,要遵循EDATA区域的保护规则,如下表所示,S侧操作EDATA时,需要开启SecBB的保护,NS侧操作EDATA时,则不能有SecBB的保护。

图5. Flash High-Cycle 的保护

265816906b34011465.png
以下是为Bank1的全部48KByte的EDATA区域使能SecBB保护的示例代码: FLASH_BBAttributesTypeDef FLASH_BBAttributesStruct; FLASH_BBAttributesStruct.BBAttributesType = FLASH_BB_SEC; FLASH_BBAttributesStruct.BBAttributes_array[3] = 0xFF000000; FLASH_BBAttributesStruct.Bank = FLASH_BANK_1; if(HAL_FLASHEx_ConfigBBAttributes(&FLASH_BBAttributesStruct) != HAL_OK) { } Error_Handler(); 特别要注意的是,SecBB的配置需要在安全侧完成,下图是SecBB寄存器的访问规 则,并且SecBB的范围不能和Flash Watermark有重叠。
480496906b37b4001b.png

2.3. 其他注意事项 1. 如果程序中开启了ICACHE,还需要为EDATA区域设置MPU的保护。 以下是设置MPU的示例代码:
  1. void MPU_Config(void)
  2. {
  3.   MPU_Attributes_InitTypeDef   attr;
  4.   MPU_Region_InitTypeDef       region;
  5.   /* Disable MPU before perloading and config update */
  6.   HAL_MPU_Disable();
  7.   /* Define cacheable memory via MPU */
  8.   attr.Number             = MPU_ATTRIBUTES_NUMBER0;
  9.   attr.Attributes         = 0 ;
  10.   HAL_MPU_ConfigMemoryAttributes(&attr);
  11.   /* BaseAddress-LimitAddress configuration */
  12.   region.Enable           = MPU_REGION_ENABLE;
  13.   region.Number           = MPU_REGION_NUMBER0;
  14.   region.AttributesIndex  = MPU_ATTRIBUTES_NUMBER0;
  15.   region.BaseAddress      = EDATA_USER_START_ADDR;
  16.   region.LimitAddress     = EDATA_USER_END_ADDR;
  17.   region.AccessPermission = MPU_REGION_ALL_RW;
  18.   region.DisableExec      = MPU_INSTRUCTION_ACCESS_ENABLE;
  19.   region.IsShareable      = MPU_ACCESS_NOT_SHAREABLE;
  20.   HAL_MPU_ConfigRegion(&region);
  21.   /* Enable the MPU */
  22.   HAL_MPU_Enable(MPU_PRIVILEGED_DEFAULT);
  23. }
2. 编译顺序:TrustZone架构中,需要先编译S工程,然后再编译NS工程;但下载不区分先后顺序。
2.4. 选项字节的配置 除了代码有安全的配置外,对于TrustZone架构中,芯片的选项字节同样也要有对应的配置。
1. 使能TrustZone

2. 配置Flash Watermark

3. 配置EDATA   

在完成上述配置之后,我们便可以将S和NS的程序分别下载到芯片中,然后按下开发板的复位按钮。 3. 验证 在代码中,我们分别向两个EDATA区域写入了0xAA55AA55的值,所以现在我们可以通过STM32CubeProgrammer来验证EDATA区域写入的结果。注意要使用“under reset”的模式连接芯片查看。


4. 小结 本文实验附有完整的实验工程供大家直接使用。 在TrustZone结构中,代码通常会多出一些安全的属性设置,本文仅针对常见场景设置,在实际操作中还可能涉及到privileged/unprivileged等访问规则以及DMA的配置,大家根据应用灵活配置即可,希望对大家有所帮助。

文档中所用到的工具及版本 STM32CubeMX V6.14.1 STM32CubeIDE V1.17.0  STM32CubeProgrammer V2.19.0 LAT中的附件  02-Apr-2024 LAT1585 STM32H5 在使能TrustZone下实现High-Cycle的数据存储_Code.zip

磨砂 发表于 2025-11-3 11:43 | 显示全部楼层
TrustZone是Arm开发的一项核心技术,作为Armv8-M架构的一部分,通过强制硬件隔离提供系统级安全措施
晓伍 发表于 2025-11-3 12:31 | 显示全部楼层
TrustZone技术与Cortex™-A处理器紧密集成,并通过AMBA® AXI总线和特定的TrustZone系统IP块在系统中进行扩展
八层楼 发表于 2025-11-3 14:43 | 显示全部楼层
TrustZone将内存区域划分为三个不同的分区,包括安全分区、非安全分区以及非安全可调用分区
观海 发表于 2025-11-3 17:19 | 显示全部楼层
在安全和非安全状态下都可以访问非安全环境中的函数和数据,而非安全环境中的例程只能通过调用位于非安全可调用环境的跳板来访问安全环境中的服务
guanjiaer 发表于 2025-11-3 19:37 | 显示全部楼层
移动设备已发展为能够从Internet下载各种大型应用程序的开放软件平台
heimaojingzhang 发表于 2025-11-3 21:57 | 显示全部楼层
通过应用基于ARM TrustZone技术的高级安全技术并整合SecurCore防篡改元素,可开发出能够提供功能丰富的开放式操作环境和强大安全解决方案的设备
keaibukelian 发表于 2025-11-4 08:19 | 显示全部楼层
TrustZone是ARM针对消费电子设备设计的一种硬件架构,其目的是为消费电子产品构建一个安全框架来抵御各种可能的攻击
paotangsan 发表于 2025-11-4 10:33 | 显示全部楼层
必选组件:包括AMBA3 AXI总线、虚拟化的ARM Core、TZPC、TZASC等
renzheshengui 发表于 2025-11-4 12:57 | 显示全部楼层
可选组件包括TZMA、AXI-to-APB bridge等
wowu 发表于 2025-11-4 15:23 | 显示全部楼层
TrustZone凭借其独特的技术特性和强大的安全性能,在多个领域得到了广泛的应用和发展
您需要登录后才可以回帖 登录 | 注册

本版积分规则

认证:意法半导体(中国)投资有限公司
简介:您的嵌入式应用将得益于意法半导体领先的产品架构、技术、多源产地和全方位支持。意法半导体微控制器和微处理器拥有广泛的产品线,包含低成本的8位单片机和基于ARM® Cortex®-M0、M0+、M3、M4、M33、M7及A7内核并具备丰富外设选择的32位微控制器及微处理器。

1428

主题

1758

帖子

25

粉丝
快速回复 在线客服 返回列表 返回顶部