本文目的
- 本文将记录如何在沁恒的RISC-V的BLE芯片上进行内部codeflash 和dataflash的读写,以及注意事项
 
适用芯片
- CH57x_gen2
 - CH58x_gen1
 - CH58x_gen2
 - CH59x_gen1
 - CH569/CH565 (未验证)
 
说明(以下内容,使用CH573做示例,CH58x系列基本一致)
CH571/CH573 提供了两个可以供用户使用的区域:
- CodeFlash
 - DataFlash
 
下面为ch573flash分布官方的说明:
| 地址范围 | 用途 | 大小 | 备注 | 
|---|---|---|---|
| 0x00000000-0x0006FFFF | 用户CodeFlash | 448KB | |
| 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的起始地址
//对于不支持page erase的芯片(不支持256擦除,如ch581m,ch584x),如果擦除大小小于4096,实际将不会执行擦除
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, 用户如果需要,须自行实现
 
文章更新日志
- 20250715: 注释部分增加CH584x,ch581m额外说明
 

                
            
        
浙公网安备 33010602011771号