在开发中,希望数据掉电不丢失,有两种方法:
1)通过 I2C 或者 SPI 总线外接存储,比如 E2PROM 或 FLASH;
2)操作片上 flash。
要想操作片上 flash,首先要搞清楚片上 flash 的存储结构以及寻址方式。
例如:
CC2541F256 这个芯片,我们查一下技术手册,介绍片上 flash 存储组织结构的部分如下:
梳理如下:
1)内部 flash 由 page 组成,每一个页有 2K=2048byte;
2)最小可擦除单元为一个 page;
3)最小可写入单元为 32bit(一个 word);
4)寻址地址大小为 16bit。
以上这些涵盖了我们操作 flash 时必须的信息。
CC2541F256一共有256KB的片上flash空间,那么一共有256/2=128个page。
在写入flash之前,我们通常会先对要写入的区域进行擦除操作,由于最小可擦除单元为一个page,那么我们只需要定义好要擦除的页即可,例如,我们把一个标志位flag写入第120个page,这时可以直接调用HAL层的HAL_FLASH提供的操作API,HalFlashErase(0x78)。
擦除完毕后,我们需要在相应的地址写入flag的值,那么如何确定地址?可以通过page进行换算,120*2048为总的byte数,最小可写入单元大小为32bit也就是4个byte,也就是说每个地址对应的是4个byte,所以120*2048/4=0xF000即第120页的首地址。
读写参考代码如下:
uint8 newValue[10];
uint8 newChar1[2];
......
HalFlashErase(0x78);
while( FCTL & 0x80 ); // wait for erase to complete
HalFlashWrite(0xF000,newValue,1);
HalFlashRead(0x78,0,newChar1,2);
refer:
https://blog.csdn.net/happytomyoung/article/details/48895217