沁恒 RISC-V 蓝牙芯片 Flash 分区管理及操作
沁恒 RISC-V 蓝牙芯片 FLASH 操作以及分区管理 ...... 矜辰所致 ...... 更新更大容量 CH584x 芯片部分 2025/12/3前言要合理使用一块芯片熟悉其内部 Flash 的分区管理是必不可少的。本文我们说明一下沁恒 RISC-V 蓝牙芯片 Flash 的分区以及读写操作。我是矜辰所致全网同名尽量用心写好每一系列文章不浮夸不将就认真对待学知识的我们矜辰所致金石为开目录前言一、 Flash 分区1.1 基本分区介绍1.2 BLE 应用使用区域二、 FLASH 读写2.1 函数说明2.2 Flash 操作注意事项2.3 擦写时间和寿命三、 其他相关说明3.1 CH592A 和 CH584X3.2 连续操作 Flash 的场景结语一、 Flash 分区本文以 CH585 芯片为例其他芯片都可根据手册和代码确定方法在文中会有说明。1.1 基本分区介绍在官方的芯片手册《CH585DS1》文档中第一页芯片介绍的时候就有说明在文档第 2 章《系统结构及存储器》 2.3 小结也有表格说明本文我们讨论的是 Flash 存储器区域对应的映射地址是0x0000 0000 —— 0x0007 FFFF 的部分。其他系列的芯片手册也有明显的标注可以自行查看。针对上面的的官方说明我绘制了一张图示说明目前来说 CH585 在沁恒微 32 位 RISC-V 里面此系列芯片中 Flash 和 SRAM 是最大的了除了另一个带以太网接口的 CH32V208 系列达到 480K Flash。更新 CH584x 最大 48024512 K RAM 96 KInfoFlash 区域保存了一些出场信息类似 芯片 ID 、RF 频偏、LDO 校准等等信息不建议改虽然手册上提示部分区域可以配置。BootLoader 区域官方的 BootLoader 主要用来做产品 ISP 下载升级的工作产品能够 USB 下载串口下载串口免按键下载全靠它了。DataFlash 和 CodeFlash 就是官方帮客户区分好的 Flash 区域一个区域用来放代码一个区域用来放掉电保存的数据。在工程中对两个区域操作的函数也不一样这个在本文后面会有测试说明。要明确知道的是它们和上面两块区域本质上是都是同一块 Flash 区域只是官方为了方便应用自己划分了开了不同的区域。理论上用户是可以自己区分的只不过官方的示例和很多软件是配合了这个分区开发使用的这里并不建议开发者胡来。1.2 BLE 应用使用区域应用区域即便是同一芯片不同版本的 EVT 可能会有调整随着系列芯片的不断推出需要做一些兼容以官网最新为例在应用上用户是可以自行修改的。上面的0x0007 0000 ~ 0x 0007 8000区即 DataFlash 区是留给客户保存数据的部分但是如果使用蓝牙应用蓝牙配对Mesh 组网OTA 升级等的数据也被保存在这部分区域用户需要注意一下如果使用到对应的部分功能自己的数据不要和这些数据重叠了当然用户也可以自己修改地址存放直接在程序中修改宏定义即可 。这里我们也用一张示意图来说明一下再次提醒一下下图区域为 Flash 的0x0007 0000 ~ 0x 0007 8000区域。不同芯片的地址可能有区别具体的可查看代码中的定义。上面这些区域的划分在代码中都有体现的只是刚学习的时候很容易搞不清楚。大家可以自己打开工程查看比如在主机工程中的CONFIG.h文件中这个文件怎么快速找到通过某些通用的宏定义跳转就过来了比如#if(defined(BLE_MAC)) (BLE_MAC TRUE)中的BLE_MAC有关于 BLE 配对绑定信息存储区域的宏定义如下如果使用蓝牙 Mesh在配网发起者例程provisioner_vendor中的app_mesh_config.h中有关于 Mesh 网络信息存储区域的宏定义如下:在带有 OTA 功能的工程中ota.h中有 OTA 标志位存放的地址这里特别说明上面BLE_SNV_ADDR和OTA_DATAFLASH_ADD重复了是因为确实博主目前手头的 EVT 包就是这样的写错了已经和沁恒微工程师反馈确认。但为什么我上面写出图表说明是因为和沁恒微工程师请教过默认 DataFlash 应用就是上图那么区分。只是后来出了不同的芯片做兼容可能一下忽略了但是沁恒微的 FAE 响应速度还是很快的 相信很快就能改正 。在 2026 年 8 月更新的 EVT 包已经修复此问题二、 FLASH 读写那了解了 Flash 的分区我们来学习一下 Flash 的读写操作。这个官方提供了现成的示例先跑一遍示例再来看后面读写数据太简单了大家自己过一遍即可。2.1 函数说明库函数把操作 DataFlash 和 CodeFlash 的函数做了区分。DataFlash 操作带 EEPROM 名字读EEPROM_READ(StartAddr,Buffer,Length)擦除EEPROM_ERASE(uint32_t StartAddr, uint32_t Length)写EEPROM_WRITE(StartAddr,Buffer,Length)CodeFlash 操作带 FLASH_ROM 名字读FLASH_ROM_READ(uint32_t StartAddr, void *Buffer, uint32_t len)擦除FLASH_ROM_ERASE(StartAddr,Length)写FLASH_ROM_WRITE(StartAddr,Buffer,Length)校验FLASH_ROM_VERIFY(StartAddr,Buffer,Length)❤️ 强调一下 上面 Codeflash 操作函数里面的所有参数StartAddr、Buffer、Length都需要 4 自己对齐 ❤️2.2 Flash 操作注意事项首先是大家跑示例会发现读取 Codeflash 擦除后读出来并不是 0xFF这是正常的MCU内核有加解密。Codeflash 最小擦除单位为 4096字节。DataFlash 操作函数的地址参数都是基于0x70000的 基地址的偏移比如EEPROM_READ(0, TestBuf, 500);就是从Flash 地址为0x70000的位置读取数据。DataFlash 最小擦除单位为 256字节CH585。操作 Flash 的函数在库中已包含失能/恢复中断 无需应用层代码再添加。写 Flash之前一定要擦除不论是 DataFlash 还是 CodeFlash操作 CodeFlash 地址长度buffer长度都按 4 字节的整数倍不按照4字节出问题的情况太多了 操作 DataFlash 相对要求没那么严格在 CH585 上是可以 1 字节操作的我做了个测试但是官方建议4字节对齐考虑到通用性和移植 地址还是建议 4 字节对齐。根据官方的宏列了个表格概念官方宏数值分区备注Page页EEPROM_PAGE_SIZE256 BBlock块EEPROM_BLOCK_SIZE4096 BData-Flash 最小擦除EEPROM_MIN_ER_SIZE256 BData 区可单页擦也可整块擦 CH585Code-Flash 最小擦除注释里说明4096 BCode 区只能用4 KB 页擦最小写粒度EEPROM_MIN_WR_SIZE1 BData 区实际硬件仍 4 B 对齐库自动补最小写粒度FLASH_MIN_WR_SIZE4 BCode 区必须 4 B 倍数否则 HardFault2.3 擦写时间和寿命这部分直接在官方芯片手册的最后 参数 章节里有说明沁恒 RISC-V内核的 CH5Xx 蓝牙 MCU 此处参数相差不大。注 上面文字中的 “扇区” 即为 Block块4096 字节。三、 其他相关说明本小节作为补充内容记录一下一些特别型号的说明保持持续更新…3.1 CH592A 和 CH584XCH592A 和 CH584X 的 Dataflash 和 CodeFlash 擦除单位都为 4K 所以他们的 DataFlash 中 Ble 配对绑定数据存储地址为0x7 7000偏移0x7000。更新CH584x芯片Flash480Kcodeflash 24KBootLoader 512KdataflashRAM 96 K3.2 连续操作 Flash 的场景我们知道操作 Flash 函数会自动关闭中断那么在实际应用中什么场景下可能会因为关闭中断导致问题呢下面说明引用沁恒微官方电子社区无线库中连续操作 flash 的场景只有 mesh 组网中会出现一块 SNV 扇区存满整理/搬移 dataflash 的网络信息时根据信息的碎片化程度可能会连续操作 2s那么如果还同时连接上了 BLE 且超时时间协商 2s会断连。跑 meshBLE可以把 BLE 的超时时间拉长点整理 flash 期间丢几个包后还可以继续交互 BLE 连接事件。.BLE和2.4GRF场景下在“配对”时会存储对端设备的一些信息到dataflash中但字节长度不大且发生在连接期间不影响连接后的运行。如何安排 Flash 操作以尽可能避免和蓝牙任务冲突应用层添加 flash 代码可以将大面积的 flash 操作分散处理让 BLE 连接事件有足够的时间可以穿插执行。.如果无法避免连续操作数K字节 flash 的场景有两种思路调整 BLE 配置常用处理在操作flash前重新协商连接参数加大连接间隔及连接超时时长。连接间隔拉长到操作flash的事件开销能不丢包是最好。flash操作完成后再次协商连接参数还原。有待测试配置latency参数允许BLE从机能够忽略N个连接事件。比较适用于BLE键盘的场景帮助BLE键盘在没有按键按下时降低功耗有按键时又可以及时上传。理论可行有待测试的区别点是BLE键盘是“主动忽略”连接事件连续擦写flash场景下MCU是“被动忽略”连接事件。结语本文主要给大家介绍了 CH585 芯片的内存分布读写操作。东西并不复杂但是切记要牢记注意事项这里建议大家在以后应用中只要是 Flash 写操作都按照 4 字节对齐来操作避免不必要的麻烦。好了本文就到这里。谢谢大家