• 本文将记录如何在沁恒的RISC-V的BLE芯片上进行内部codeflash 和dataflash的读写,以及注意事项

适用芯片

  • CH573/CH571
  • CH583/ch582/CH581

说明(以下内容,使用CH573做示例,CH58x系列基本一致)

CH571/CH573 提供了两个可以供用户使用的区域:

  1. CodeFlash
  2. 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的起始地址
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耗时

<待编辑>

注意事项:

  1. libISP573.a 文件可能有多个版本, 用的时候一定注意,要用wch官网最新EVT例程里面提供的该文件,一定不要使用MRS工具新建工程提供的该文件(修改日期在2020/12/9日,或者之前的版本)
  2. 尽量不要使用 FLASH_ROM_LOCK 函数进行锁定.
  3. Flash api跟 EEPROM api 同样的数据实际存储的内容并不一样,所以不能用同样的方式读取

相关文章:

  • 2021-04-17
  • 2021-08-16
  • 2021-12-12
  • 2018-05-16
  • 2022-02-08
  • 2022-12-23
猜你喜欢
  • 2022-12-23
  • 2021-07-26
  • 2021-08-14
  • 2021-09-05
  • 2021-12-09
  • 2022-12-23
  • 2022-12-23
相关资源
相似解决方案