CC254X片上flash读写解析

原文地址:http://blog.csdn.net/happytomyoung/article/details/48895217


           因为毕设弄的是低功耗蓝牙,需要在CC2541中存储少量数据,保持掉电不丢失,找到了这篇博文,冒昧转载下。

         如果在开发中,希望个别数据掉电不丢失,那么有几种方法可以考虑,一种是通过I2C或者SPI总线外接存储,比如E2PROM或FLASH,如果数据不大,第二种方便的方法就是操作片上flash了,要想操作片上flash,首先要搞清楚片上flash的存储结构以及寻址方式。

        例如CC2541F256这个芯片,我们查一下技术手册,介绍片上flash存储组织结构的部分,截取如下:

        

        我们可以梳理如下:

        1.内部flash由page组成,每一个页有2048-byte;

        2.最小可擦除单元为一个page;

        3.最小可写入单元为32bit(一个word);

        4.寻址地址大小为16-bit。

        以上这些涵盖了我们操作flash时必须的信息。CC2541F256一共有256KB的片上flash空间,那么一共有多少page?答案是256/2=128个page。在写入flash之前,我们通常会先对要写入的区域进行擦除操作,由于最小可擦除单元为一个page,那么我们只需要定义好要擦除的页即可,例如,我们把一个标志位flag写入第120个page(这里注意核对下代码的大小,不要写到代码存储区即可,尤其是OAD更要特别注意),这时可以直接调用HAL层的HAL_FLASH提供的操作API,HalFlashErase(0x78)。擦除完毕后,我们需要在相应的地址写入flag的值,那么如何确定地址?可以通过page进行换算,120*2048为总的byte数,最小可写入单元大小为32-bit也就是4个byte,也就是说每个地址对应的是4个byte,所以120*2048/4=0xF000即第120页的首地址。

        读写参考代码如下:

[cpp] view plain copy

  1. uint8 newValue[10];  
  2. uint8 newChar1[2];  
  3. ......  
  4. HalFlashErase(0x78);  
  5. while( FCTL & 0x80 ); // wait for erase to complete  
  6. HalFlashWrite(0xF000,newValue,1);  
  7. HalFlashRead(0x78,0,newChar1,2); 
根引用的信息,死机问题可能与片外Flash读写操作有关。片外Flash具有使用寿命,一般为10万次左右,频繁的读写操作可能导致坏块的出现。此外,写Flash的时间较长,需要关闭中断,可能导致串口中断无法产生,从而出现数据丢失现象。 对于此问题的解决方案,根据引用的信息,可以通过去除读写保护来对Flash进行读写操作。读写保护是通过配置选项字节完成的。具体的方法可以参考芯片的技术文档和相关资料。 此外,根据引用的分析,当程序保存参数时,需要先擦除Flash再写入。如果在擦除后还没有写入,就被其他中断打断,可能导致参数不正常,进而导致死机。为了解决这个问题,可以在串口处理部分增加对参数值的判断,如果读出的参数值为空,则不进行内存块的释放,从而避免死机的发生。 因此,对于片外Flash读写死机问题,可以通过去除读写保护、增加对参数值的判断等方式来解决。具体的实施方法需要根据具体的硬件平台和软件设计进行适配。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [flash读写导致死机问题分析](https://blog.csdn.net/zhang421412170/article/details/117477962)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* [STM32学习笔记 | 片内FLASH读写失败问题分析](https://blog.csdn.net/ybhuangfugui/article/details/114464678)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值