|
0 1 概述 STM32H5系列(H503除外)提供高达96KBytes的EDATA内存区域,支持高达10万次的擦写周期,可用于存储数据和模拟EEPROM功能。该区域通过AHB系统总线访问,地址范围为0x09000000~0x09017FFF,映射于闪存Bank1和Bank2的最后8个(或4个)扇区。 其核心特性包括:
0 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实验板为硬件来验证结果。
▲ 图1. 选择目标芯片
▲ 图2. 创建TrustZone工程
▲ 图3. 选择STM32CubeIDE 在STM32CubeMX中,我们不需要配置任何外设,创建完工程后可以直接生成代码,然后编译,正常的话,工程是可以编译通过的。 然后我们按照官方的例程,复制相关代码,这里主要是复制HAL_FLASH_Unlock、EDATA的擦除(HAL_FLASHEx_Erase)、EDATA的写入(HAL_FLASH_Program)、还有结果的验证(Check_Flash_Content)、这个过程中要处理对应的编译错误(主要是对应的变量的申明和宏定义也需要复制过来即可,在此不展开细说)。 此时,我们就可以得到相关复制代码,且能够通过编译的工程,但是呢,此时还不能成功的操作EDATA,接下来我们还要完成TrustZone相关的配置。 2.2. TrustZone相关配置
以下是RM0481中关于STM32H563ZI(2MByte-Flash)的EDATA的memory map。
▲ 图4. Flash High-Cycle的内存分布 从这张图中可以看出,当Bank1中的最后8个sector被定义为EDATA时,我们在S侧操作EDATA时,其对应的地址为0x0D0xxxxx,NS侧操作EDATA时,对应的地址为0x090xxxxx。
▲ 图5. Flash High-Cycle的保护 以下是为Bank1的全部48KByte的EDATA区域使能SecBB保护的示例代码:
特别要注意的是,SecBB的配置需要在安全侧完成,下图是SecBB寄存器的访问规则,并且SecBB的范围不能和Flash Watermark有重叠。
▲ 图6. SecBB寄存器的访问条件 2.3. 其他注意事项
以下是设置MPU的示例代码:
2.4. 选项字节的配置 除了代码有安全的配置外,对于TrustZone架构中,芯片的选项字节同样也要有对应的配置。
▲ 图7. 使能TrustZone
▲ 图8. 配置Flash Watermark
▲ 图9. 配置EDATA 在完成上述配置之后,我们便可以将S和NS的程序分别下载到芯片中,然后按下开发板的复位按钮。 0 3 验证 在代码中,我们分别向两个EDATA区域写入了0xAA55AA55的值,所以现在我们可以通过STM32CubeProgrammer来验证EDATA区域写入的结果。注意要使用“under reset”的模式连接芯片查看。
▲ 图10. NS侧EDATA数据
▲ 图11. S侧EDATA数据 0 4 小结 本文实验附有完整的实验工程供大家直接使用。在TrustZone结构中,代码通常会多出一些安全的属性设置,本文仅针对常见场景设置,在实际操作中还可能涉及到privileged/unprivileged等访问规则以及DMA的配置,大家根据应用灵活配置即可,希望对大家有所帮助。 点击按钮下载《STM32H5在使能TrustZone下实现High-Cycle的数据存储》原文档。 |
实战经验 | STM32H5 USBD Classic 驱动 CDC 移植实战指南:裸机环境快速落地方案
详解STM32单片机的堆栈
STM32大神笔记,超详细单片机学习汇总资料
小白也能明白的STM32的低功耗与唤醒机制
STM32芯片命名规则
STM32 引脚到底有多少?为什么一个引脚能当好几个用?
STM32时钟详解
STM32H503多轴运动控制卡
【LSM6DSV320X评测】MEMS上位机体验 以及MLS数据预采集
经验分享 | STM32H563 SPI DMA应用演示
微信公众号
手机版