工作笔记-----ICache对中文显示的影响问题
工作笔记-----ICache对中文显示的影响问题
@@ Author:明月清了个风
@@ Date:2025.10.7
@@ PS:在开发LCD驱动程序的过程中遇到的一个中文显示问题,硬件为STM32H563,记录现象和解决方法,以供参考
@@ Version:First published date 2025.10.7
现象回顾:ICache 对中文显示的影响
使用 LCD 显示中文时,未开启 ICache(指令缓存)会导致中文无法显示,但代码不报错;而开启 ICache 后一切正常,同样存储在 Flash 中的图片数据(更大的 const 数组)却能正常显示。
在 STM32H563 上开发 LCD 显示功能时,发现一个特殊现象:
- 中文显示依赖字库(const 数组存储在 Flash),未开启 ICache 时无法显示,无报错信息;
- 开启 ICache 后,中文显示恢复正常;
- 同样以 const 数组形式存储在 Flash 中的图片数据,无论是否开启 ICache 都能正常显示。
这一现象涉及 STM32H5 的存储架构、缓存机制及数据访问模式的底层逻辑,下面逐一解析。
核心原因 1:ICache 与 Flash 访问效率的关联
STM32H563 作为高性能 MCU,主频最高可达 250MHz,但其内置 Flash 的物理读取速度无法直接匹配 CPU 高频访问需求。ICache(指令缓存)的作用正是弥补这一差距:
-
未开启 ICache 时:CPU 每次访问 Flash 中的数据(如中文字库)都需直接读取 Flash 芯片,而 Flash 读取存在固定延迟(尤其是高频模式下需配置多个等待周期)。对于频繁访问的场景,这种延迟会导致数据无法及时传输到 LCD 控制器。
-
开启 ICache 时:ICache 会缓存最近访问的 Flash 数据(包括指令和常量),后续访问相同数据可直接从高速缓存读取,大幅降低访问延迟,确保字库数据能实时供给 LCD 显示。
中文字库作为高频访问的常量数据,对 Flash 访问效率极其敏感,因此成为 ICache 开关影响的“重灾区”。
核心原因 2:中文与图片的访问模式差异
同样是存储在 Flash 中的 const 数组,中文与图片的显示差异本质上源于访问模式的不同:
特性 | 中文字库(中文显示) | 图片数据(图片显示) |
---|---|---|
数据单元 | 小字模(如 16x16 字模仅 32 字节) | 连续像素块(通常数十 KB 至 MB) |
访问方式 | 离散随机访问(频繁切换字模地址) | 连续顺序访问(从起始到结束不间断) |
访问频率 | 极高(每个汉字需逐行解析字模) | 中等(一次性连续传输) |
-
图片的连续访问优势:Flash 控制器内置“预取缓冲区”,可自动预加载后续连续数据。图片的连续访问模式能充分利用这一机制,即使无 ICache,也能通过预取优化减少延迟,满足显示需求。
-
中文的离散访问劣势:显示一行文字需频繁切换不同字模的地址(如从“你”到“好”),属于随机离散访问。此时预取缓冲区失效,每次访问都需等待 Flash 响应,延迟累积导致数据传输中断,最终无法显示。
验证与解决方案
若需进一步验证上述原理,可通过以下方法测试:
方法 1:强制字库存储到 SRAM
将中文字库从 Flash 移至 SRAM(利用 section
属性),避开 Flash 访问延迟:
// 强制中文字库存储到 SRAM 的 .data 段
unsigned char chinese_font[] __attribute__((section(".data"))) = {// 16x16 "你"字模0x00, 0x00, 0x23, 0xF8, 0x12, 0x08, ...,// 16x16 "好"字模0x00, 0x00, 0x7F, 0xFC, 0x01, 0x00, ...
};
此时即使关闭 ICache,因 SRAM 访问速度远高于 Flash,中文也能正常显示(需注意 SRAM 空间是否充足)。
注意这里字模数据就不能是const
了,否则会报错,const
类型是存储在.rodata
段的。
方法 2:保持 ICache 开启
STM32H5 系列在高频场景下,开启 ICache 是官方推荐的最佳实践:
- 无需修改代码,直接在初始化时使能 ICache:
HAL_ICache_Enable(); // 使能指令缓存
- 既能保证中文显示正常,又能提升整体代码执行效率,且不占用额外 SRAM。
总结
STM32H563 中“中文显示依赖 ICache”的现象,本质是数据访问模式与 Flash 效率不匹配的结果:
- 中文显示的离散、高频小字模访问对延迟极其敏感,依赖 ICache 消除 Flash 读取延迟;
- 图片的连续大块访问可通过 Flash 预取机制优化,对 ICache 依赖较低。
开发中建议保持 ICache 开启,既能充分发挥 STM32H5 的高性能,又能避免类似兼容性问题。理解存储访问特性与缓存机制的关联,能帮助我们更高效地调试嵌入式系统中的“玄学”问题。