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

[复制链接]
110|11
STM新闻官 发表于 2026-4-3 23:37 | 显示全部楼层 |阅读模式
01概述
STM32H5系列(H503除外)提供高达96KBytes的EDATA内存区域,支持高达10万次的擦写周期,可用于存储数据和模拟EEPROM功能。该区域通过AHB系统总线访问,地址范围为0x09000000~0x09017FFF,映射于闪存Bank1和Bank2的最后8个(或4个)扇区。其核心特性包括:1. 6位ECC纠错:保障数据可靠性,支持16位读写粒度。2. 扇区大小调整:由于增加的ECC位,数据区扇区大小缩减至6KB。3. 双Bank独立配置:通过寄存器独立设置Bank1/Bank2的数据区起始位置,默认全空间用于代码存储。02实验内容
在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实验板为硬件来验证结果。 3777869cfde1709152.png ▲ 图1. 选择目标芯片 1502269cfde23115b6.png ▲ 图2. 创建TrustZone工程 663569cfde2e38df6.png ▲ 图3. 选择STM32CubeIDE在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。 2454069cfde3b70f39.png ▲ 图4. Flash High-Cycle的内存分布从这张图中可以看出,当Bank1中的最后8个sector被定义为EDATA时,我们在S侧操作EDATA时,其对应的地址为0x0D0xxxxx,NS侧操作EDATA时,对应的地址为0x090xxxxx。2. 因为CubeMX生成的默认工程中,将NSC区域定义在bank1的最后的8K空间中,但是现在bank1的最后48K被用于EDATA了,所以我们需要通过调整S侧工程的ld文件,将NSC区域的位置调整到Bank1的尾部48K之前去,修改代码如下高亮部分所示: 3345569cfde4a758be.png 3. 在TrustZone结构中操作EDATA区域时,要遵循EDATA区域的保护规则,如下表所示,S侧操作EDATA时,需要开启SecBB的保护,NS侧操作EDATA时,则不能有SecBB的保护。 5529669cfde590f8d4.png ▲ 图5. Flash High-Cycle的保护以下是为Bank1的全部48KByte的EDATA区域使能SecBB保护的示例代码:
  1. 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有重叠。 6939469cfde7ba96c1.png ▲ 图6. SecBB寄存器的访问条件2.3. 其他注意事项

1. 如果程序中开启了ICACHE,还需要为EDATA区域设置MPU的保护。以下是设置MPU的示例代码:
  1. void MPU_Config(void){ MPU_Attributes_InitTypeDef attr; MPU_Region_InitTypeDef region; /* Disable MPU before perloading and config update */HAL_MPU_Disable(); /* Define cacheable memory via MPU */ attr.Number = MPU_ATTRIBUTES_NUMBER0; attr.Attributes = 0 ; HAL_MPU_ConfigMemoryAttributes(&attr); /* BaseAddress-LimitAddress configuration */ region.Enable = MPU_REGION_ENABLE; region.Number = MPU_REGION_NUMBER0; region.AttributesIndex = MPU_ATTRIBUTES_NUMBER0; region.BaseAddress = EDATA_USER_START_ADDR;region.LimitAddress = EDATA_USER_END_ADDR;region.AccessPermission = MPU_REGION_ALL_RW;region.DisableExec = MPU_INSTRUCTION_ACCESS_ENABLE; region.IsShareable = MPU_ACCESS_NOT_SHAREABLE;HAL_MPU_ConfigRegion(®ion); /* Enable the MPU */ HAL_MPU_Enable(MPU_PRIVILEGED_DEFAULT);}
2. 编译顺序:TrustZone架构中,需要先编译S工程,然后再编译NS工程;但下载不区分先后顺序。2.4. 选项字节的配置

除了代码有安全的配置外,对于TrustZone架构中,芯片的选项字节同样也要有对应的配置。1. 使能TrustZone 4214469cfdeb11b2d6.png ▲ 图7. 使能TrustZone2. 配置Flash Watermark 68869cfdeb89ef10.png ▲ 图8. 配置Flash Watermark3. 配置EDATA 8830269cfdebea0355.png ▲ 图9. 配置EDATA在完成上述配置之后,我们便可以将S和NS的程序分别下载到芯片中,然后按下开发板的复位按钮。03验证
在代码中,我们分别向两个EDATA区域写入了0xAA55AA55的值,所以现在我们可以通过STM32CubeProgrammer来验证EDATA区域写入的结果。注意要使用“under reset”的模式连接芯片查看。 5592369cfdec4e402d.png ▲ 图10. NS侧EDATA数据 8961369cfdeca7f025.png ▲ 图11. S侧EDATA数据04小结
本文实验附有完整的实验工程供大家直接使用。在TrustZone结构中,代码通常会多出一些安全的属性设置,本文仅针对常见场景设置,在实际操作中还可能涉及到privileged/unprivileged等访问规则以及DMA的配置,大家根据应用灵活配置即可,希望对大家有所帮助。

2101069cfdeaa557cf.png
 楼主| STM新闻官 发表于 2026-4-3 23:38 | 显示全部楼层
xiaoqizi 发表于 2026-4-5 22:01 | 显示全部楼层
STM32H5提供高达96KBytes的EDATA内存区域,地址范围为0x09000000~0x09017FFF,映射于闪存Bank1和Bank2的最后8个扇区,支持高达10万次擦写周期,可模拟EEPROM功能
木木guainv 发表于 2026-4-6 08:08 | 显示全部楼层
具备6位ECC纠错能力,支持16位读写粒度,数据区扇区因ECC位增加缩减至6KB,确保高频擦写下的数据完整性
Jiangxiaopi 发表于 2026-4-6 09:57 | 显示全部楼层
Bank1和Bank2的EDATA起始位置可通过寄存器独立设置,默认全空间用于代码存储,需手动划分以实现数据存储功能
荣陶陶 发表于 2026-4-6 12:49 | 显示全部楼层
EDATA区域通过AHB系统总线访问,支持高效读写操作
Zhiniaocun 发表于 2026-4-6 15:05 | 显示全部楼层
若程序启用ICACHE,需为EDATA区域设置MPU保护,避免缓存与存储一致性问题
Zuocidian 发表于 2026-4-6 17:26 | 显示全部楼层
TrustZone架构中,需先编译S侧工程,再编译NS侧工程,下载顺序无限制
Puchou 发表于 2026-4-6 19:42 | 显示全部楼层
使用STM32CubeProgrammer,以“under reset”模式连接芯片,查看EDATA区域数据,验证S侧和NS侧的写入结果
Xiashiqi 发表于 2026-4-6 21:55 | 显示全部楼层
DATA区域擦写周期虽高达10万次,但需避免过度频繁的擦写操作,合理规划数据更新策略
小海师 发表于 2026-4-7 08:42 | 显示全部楼层
SecBB配置需避开Flash Watermark区域,否则可能导致配置失败或数据访问异常
Haizangwang 发表于 2026-4-7 11:06 | 显示全部楼层
需基于STM32CubeMX、STM32CubeIDE及官方固件包进行开发
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

1612

主题

2110

帖子

25

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