对于开发来说,我们经常需要保存一些参数,当数据多时我们往往采用串行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++;
- }
- }
复制代码
|