(意法半导体(ST)社区知识库文章中译)
引言
嵌入式与图形应用越来越复杂,对更大存储、更快访问、更强数据保护的需求也跟着上来。
STM32 器件集成了高性能外部存储器接口,用来接额外存储并做保护。大型图形资源可以放外面,访问和显示性能跟得上,再用加解密把数据护住。
1. 工程概览
本工程说明三件事:在 STM32H7S78-DK 上经 **XSPI2** 配好 **MX66UW1G45G** 外部 NOR Flash;用存储器映射模式访问外部 Flash 里的图像,经 **LTDC** 显示到 LCD;再用 **MCE** 对外 Flash 数据加解密。想直接拿已改好的文件,可下文末附件。
2. 前置条件
硬件
- STM32H7S78-DK
软件
- STM32CubeMX version 6.17.0
- STM32CubeIDE version: 2.1.1
3. 步骤
Step 1: 打开 STM32CubeMX,点击 [ACCESS TO BOARD SELECTOR]。
Step 2: 在 Commercial Part Number 中输入相关料号。本例使用 STM32H7S78-DK,选中后点 [Start Project]。按弹窗提示点 [Yes]。
Step 3: 点击 [Pinout] → [Clear Pinouts],弹窗点 [Yes]。
Step 4:XSPI 模式与配置
要访问并跟外部 Flash 通信,在 CubeMX 打开 XSPI2,按 Octal DTR 模式配好时序与引脚,GPIO Settings 里把 XSPI 引脚设为 Very High。GPIO Settings 里确认 XSPI 引脚为 Very High。
注:外部 Flash 类型/规格及 XSPI2、GPIO 细节见相关文章:“How to configure the external flash memory MX66UW1G45G on the STM32H7S78-DK via XSPI interface”。
Step 5:LTDC 模式与配置
要用 LTDC 在 LCD-TFT 上显示图像,须配 Data format、Timing、Display Layers 与 GPIO。详细步骤见:“How to display an image stored in external flash on the STM32H7S78-DK using the LTDC controller”。
Step 6:MCE 模式与配置
Memory Cipher Engine(MCE)是 STM32H7S78 里的硬件安全加速器:处理器不用插手,就能对外部存储器(如 NOR Flash 或 PSRAM)里的数据做透明加解密。本例在 CubeMX 使能 MCE,用来护外部 NOR Flash 数据。
注:概念与更多信息见应用笔记 “How to use MCE for encryption/decryption on STM32 MCUs”,并查阅 RM0477 第 39 章 Memory cipher engine (MCE)。
Step 7:SBS 模式与配置
当 XSPIM 域用 1.8 V 供电、串行存储器接口跑到最高 200 MHz 时,建议打开 HSLV。详见 FAQ:“Recommendations for high-speed low-voltage mode (HSLV) on the STM32H7RS”。
Step 8:时钟配置
- MCU Clock Frequency = 600 MHz
- f_Kernel = 200 MHz
- LTDC Frequency = 25 MHz
LTDC 频率细节见上述 LTDC KB。按本例完成存储器映射与相关 MPU/区域配置,使 CPU 能以映射方式读外部 Flash 图像。
Step 9:生成代码
输入 Project Name,选择 Toolchain/IDE,点击 [GENERATE CODE]。
Step 10:图像转换
要从外部 Flash 显示图像,须把图片转成与 LTDC framebuffer 兼容的像素格式。用 LCD-Image-Converter-20190317 生成头文件 `Image.h`,步骤见 LTDC KB 文章。
Step 11:编辑 Boot 工程中的 main.c
在 `main.c` 里加入配置 MCE2、以及经 XSPI2 连接的 MX66UW1G45G 的代码。本工程里 MCE2 配成 Noekeon Block Cipher 模式。
- 私有变量:`MCE_RegionConfigTypeDef`、`MCE_NoekeonConfigTypeDef` 等;以及:
```c
uint32_t Key[4][4] = {
{ 0x71234567, 0x89ABCDEF, 0x71234567, 0x89ABCDEF },
{ 0xEDCBA987, 0x6543210F, 0xEDCBA987, 0x6543210F },
{ 0x23456789, 0xABCDEF01, 0x23456789, 0xABCDEF01 },
{ 0xCBA98765, 0x43210FED, 0xCBA98765, 0x43210FED }
};
```
- 私有函数原型:`XSPI_NOR_OctalDTRModeCfg`、`JumpToApplication`。
- USER CODE BEGIN 2:调用 `XSPI_NOR_OctalDTRModeCfg(&hxspi2);` 与 `JumpToApplication();`
- USER CODE BEGIN 4:实现 `HAL_XSPI_ErrorCallback`、`XSPI_NOR_OctalDTRModeCfg`(写使能、状态轮询、写 CFG 寄存器切换 Octal)、以及 `JumpToApplication`:配置 Octal DTR 写/读、使能 memory-mapped、`HAL_MCE_ConfigNoekeon`(`Key[2]`)、区域配置:
```c
RegionConfig.Mode = MCE_BLOCK_CIPHER;
RegionConfig.ContextID = MCE_NO_CONTEXT;
RegionConfig.StartAddress = 0x70000000;
RegionConfig.EndAddress = 0x7FFFFFFF;
RegionConfig.PrivilegedAccess = MCE_REGION_NPRIV;
RegionConfig.AccessMode = MCE_REGION_READWRITE;
```
应用向量基址 `Application_vector = 0x70000000U`,跳转到复位处理程序。Boot 工程在 `JumpToApplication` 里把 `Application_vector` 设为 `0x70000000U`,再跳到该向量的复位处理程序;MCE 区域覆盖 `0x70000000`–`0x7FFFFFFF`(详见社区例程 `main.c`)。
Step 12:编辑 Boot 工程 main.h
加入 MX66UW1G45G 命令宏,例如:
```c
#define OCTAL_IO_DTR_READ_CMD 0xEE11
#define OCTAL_PAGE_PROG_CMD 0x12ED
#define READ_STATUS_REG_CMD 0x05
#define WRITE_CFG_REG_2_CMD 0x72
#define WRITE_ENABLE_CMD 0x06
#define DUMMY_CLOCK_CYCLES 20
#define WRITE_ENABLE_MATCH_VALUE 0x02
#define WRITE_ENABLE_MASK_VALUE 0x02
```
注:MCE 与 XSPI 同用时,必须经 Flash 控制器的存储器映射模式访问 Flash。
Step 13:编辑应用工程 main.c
- Includes:`#include "Image.h"`
- 设置 LTDC 层:Window 0–800 / 0–480;`LTDC_PIXEL_FORMAT_RGB565`;`FBStartAdress = (uint32_t)image_data_Image`;ImageWidth 800;ImageHeight 480 等。
- 在 `Image.h` 中注释掉表后的结构体定义,仅保留表定义(注释掉像素表后面的结构体定义,只保留表本身,供 `FBStartAdress = image_data_Image` 使用)。
Step 14: 构建应用工程。
Step 15:调试与验证
按文章 “STM32CubeIDE: How to debug an STM32H7Rx/Sx project without flashing boot every time” 调试。Resume 后 LCD 应显示图像,确认 framebuffer 在外部 Flash 且由 LTDC 渲染,同时 MCE2 负责加解密。
进一步:Memory Browser 查看存储器映射地址 **0x70000000**(RM0477 中 XSPI2 Base Address)。在 `HAL_XSPI_MemoryMapped`、`HAL_MCE_ConfigRegion`、`HAL_MCE_DisableRegion` 处设断点,分别观察映射后明文可见、配置区域后呈加密、DisableRegion 后恢复明文。
结论
按本指南,可在 STM32H7S78-DK 上经 XSPI2 配好 MX66UW1G45G,用 LTDC 显示外部 Flash 里的图像,并用 MCE 护住专用存储器区域里的数据。
来源:https://community.st.com/stm32-mcus-60/how-to-use-xspi-external-flash-to-display-an-image-with-ltdc-and-protect-data-using-mce-168447
参数以意法半导体官方最新资料为准。
40
