本文目的
- 本文将记录如何在沁恒的RISC-V的BLE芯片上进行内部codeflash 和dataflash的读写,以及注意事项
适用芯片
- CH573/CH571
- CH583/CH582/CH581
- CH592/CH591
- CH569/CH565 (未验证)
说明(以下内容,使用CH573做示例,CH58x系列基本一致)
CH571/CH573 提供了两个可以供用户使用的区域:
- CodeFlash
- DataFlash
我们看下官方的说明:
地址范围 | 用途 | 描述 |
---|---|---|
0x00000000-0x0006FFFF | CH573:用户应用程序存储区CodeFlash | 448KB |
0x00000000-0x0002FFFF | CH571:用户应用程序存储区CodeFlash | 192KB |
0x00070000-0x00077FFF | 用户非易失数据存储区DataFlash | 32KB |
0x00078000-0x0007DFFF | 系统引导程序存储区BootLoader | 24KB |
0x0007E000-0x0007FFFF | 系统非易失配置信息存储区InfoFlash | 8KB |
很明显实际上,这两个flash区域,都是一块flash,只是地址不同,纯粹是人为定义的不同地址范围的区域.
由于CH571/573 操作flash wch 只提供了库函数. 这里分享下一些使用记录
使用
wch提供的是flash 的操作库函数,头文件在:
CH573EVT\EXAM\SRC\StdPeriphDriver\inc\ISP573.h
库文件在:
CH573EVT\EXAM\SRC\StdPeriphDriver\libISP573.a
操作CodeFlash
- 下面接口,默认都在内部进行了关闭全局中断处理.
//读取数据
codeflash 部分,是可以通过指针方式进行读取的,比如:
uint8_t *p = (uint8_t *)0x8000;
PRINT("p[0] = %02x\r\n",p[0]);
//擦除数据
//这里的length 是字节,但是实际的擦除是按照4096字节高位对齐,比如传入4097字节,实际是擦除了8192字节.
//传入的地址是绝对地址
//擦除后的数据,读出来是加扰后的数据,并不是0xff,在使用时候,不能通过判断是否为0xff来确定codelflash区域是否是空
FLASH_ROM_ERASE(StartAddr,Length)
//写入数据
//这里的buffer是需要写入的指针数据,需要进行4字节对齐,数据长度要是4的倍数(否则非对齐部分会被舍去),数据需要在RAM里面
//传入的地址是绝对地址
FLASH_ROM_WRITE(StartAddr,Buffer,Length)
操作DataFlash
注意:
- 这里的EEPROM_XXX API的名称有些误导人,实际上这里并不是EEPROM也不能按照EEPROM那样去操作(这里的API写之前需要擦除,并且有最小擦除大小)
- 这里的地址是相对地址,比如0是对应的dataflash的起始地址
//读取数据
//传入的地址是相对地址,0对应dataflash的起始地址
EEPROM_READ(StartAddr,Buffer,Length)
//擦除数据
//这里的length 是字节,但是实际的擦除是按照256字节高位对齐,比如传入257字节,实际是擦除了512字节.
//擦除后的区域,使用EEPROM_READ读出来默认是0xff,使用指针方式绝对地址读取,非0xff
//传入的地址是相对地址,0对应dataflash的起始地址
EEPROM_ERASE(StartAddr,Length)
//写入数据
//这里的buffer是需要写入的指针数据,不需要进行4字节对齐,数据长度是1的倍数,数据需要在RAM里面
//传入的地址是相对地址,0对应dataflash的起始地址
EEPROM_WRITE(StartAddr,Buffer,Length)
获取其他信息
//获取mac地址,这里的Buffer就是6字节的mac地址,实际上BLE的mac地址也是通过这个api获取后传进去的,这个mac地址是芯片在生产时候烧录进去的,该数据是唯一的
GetMACAddress(Buffer)
//获取unique_id,这个unique_id 不是很建议用,应该是内部flash的序列号之类的东西,不同的flash unique_id可能长度不太一样,一旦芯片改版换flash,这里没处理好,可能就会有乌龙,这里wch提供的长度是64bit 即为8byte.
GET_UNIQUE_ID(Buffer)
API耗时
<待编辑>
注意事项:
- libISP573.a 文件可能有多个版本, 用的时候一定注意,要用wch官网最新EVT例程里面提供的该文件,一定不要使用MRS工具新建工程提供的该文件(修改日期在2020/12/9日,或者之前的版本)
- 尽量不要使用
FLASH_ROM_LOCK
函数进行锁定. - Flash api跟 EEPROM api 同样的数据实际存储的内容并不一样,所以不能用同样的方式读取
- 该接口不提供任何磨损均衡feature, 用户如果需要,须自行实现