iot-fan

联系: iotfan123#163.com
注意:
1,本博客之内容来源于网上收集以及相关技术人员提供,如果有侵犯到您的权益,请电邮我沟通;
2,本博客之内容乃分享,交流,学习,研究之目的,作者不对内容的真实性,有效性,及时性负责,也不对因本博客的任何内容导致的任何后果负责;
3,本博客之内容禁止转发到CSDN网站,转到别的网站请保留出处.

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::

本文目的

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

适用芯片

  • CH573/CH571
  • CH583/CH582/CH581
  • CH592/CH591
  • CH569/CH565 (未验证)

说明(以下内容,使用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的起始地址
//读取数据
//传入的地址是相对地址,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 同样的数据实际存储的内容并不一样,所以不能用同样的方式读取
  4. 该接口不提供任何磨损均衡feature, 用户如果需要,须自行实现
posted on 2021-08-31 15:00  iot-fan  阅读(3934)  评论(0编辑  收藏  举报