打印
[MCU]

MSP430 外部flash使用经验

[复制链接]
395|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
jcky001|  楼主 | 2020-12-2 10:26 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

对于开发来说,我们经常需要保存一些参数,当数据多时我们往往采用串行flash存储我们所需的数据,往往这些串行flash有一个缺点,就是必须以4K擦除,这样对于小ram的单片机来说就不好处理了,如果直接擦除就会丢到之前保存的数据,所以为了解决这个问题,我们可以按照这样的方法来解决数据处理:

首先我们选择串行flash的第一个4K扇区为缓存扇区,后面的扇区作为我们实际数据存储区,比如我们需要在一个地址写数据,先判断地址数据是否可以写,如果可以就直接写,如果不行,就先擦除第一个缓存扇区,把需要写的地址扇区数读出来放到第一个扇区,再擦除需要写数据的扇区,把数据写进去,根据需要把之前迁移到第一个扇区的数据搬回来。这样,我们就不需要4K的ram来做缓存。对于小ram的MSP430特别适用。

参考代码如下:


  • void Write2532(unsigned char Cd,ulong address,unsigned int  length,unsigned char *buffer)
  • {      
  •   unsigned char i,temp; ulong j;
  •   ulong address_buffer;
  •   ulong address_count;
  •   address_buffer=address;
  •   for (i = 0; i < length; i++)                  
  •   {
  •     address_count=address_buffer%4096;
  •         temp=Read_Byte(address_buffer);
  •         if (temp!= *(buffer+i))
  •     {
  •            if (temp == 0xff)  //无数据
  •            {
  •               Write_Byte(address_buffer, *(buffer+i));
  •            }                                                                        //
  •            else               //有数据
  •            {
  •               SErase(0x000000);     //  清除数据缓冲区
  •                   for(j = 0; j <address_count; j++)//  挪块操作    ==  > 挪块到缓存 sector0
  •                           Write_Byte(0x000000+j, Read_Byte(address_buffer-address_count+j));//单字节读取数据(如果用连续的不可以边读边写并存缓存)
  •                   SErase(address_buffer);              //  清除当前数据块
  •                   for (j = 0; j <address_count; j++)   //  回写数据
  •                   Write_Byte((address_buffer-address_count+j), Read_Byte(0x000000+j));
  •                   Write_Byte(address_buffer, *(buffer+i));
  •            }            
  •         }
  •         address_buffer++;
  •    }
  • }

复制代码



使用特权

评论回复

相关帖子

发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1522

主题

4615

帖子

6

粉丝