一引子 :需要大量存储数据时,一般都不会使用单片机内部存储资源(单片机内部的eerom或者flash模拟eeprom只适合存储少量的数据)。一般是通过I2C/SPI接口外部扩展eeprom或者flash,这类器件存储空间都很大能满足大部分的数据存储要求。
二 存储器件内部空间的划分:根据存储IC的容量大小、存储操作方法(页操作或块操作)、要存储的内容分类、对存储的实时性要求,
2.1先定义各记录的自定义数据结构(按记录内容不同分为不同的存储块)
typedef struct
{
unsigned char A01;
float A02; //
float A03; //
。。。。
}Block_A_Type;
typedef struct
{
unsigned char B01;
float B02; //
float B03; //
。。。。
}Block_B_Type;
.....
2.2对存储IC按各记录内容的大小进行空间分配:
/*-----------------------------存储地址分配---------------------------------*/
#define BLOCK_A_ADDR 1*1024
#define BLOCK_B_ADDR 2*1024
#define BLOCK_C_ADDR 3*1024
....
#define BLOCK_TOTAL_ADDR 30*1024
2.3 对存储IC的驱动程序进行封装,使其能够接收开始地址、写缓冲指针/读缓冲buf指针、读写的字节数这三个参数,
2.4分别编写对不同数据记录块读写的函数(用具备变量定义记录块可节省RAM,共用体方便操作):
void BlockA_Write(Block_A_Type Block)
{
union abc
{
Block_A_Type Block; //结构体变量
unsigned char Buffer[sizeof(Block_A_Type)];
}Data;
Data.Block = Block;
FM24XX_MultWrite(BLOCK_A_ADDR,Data.Buffer,sizeof(Block_A_Type));
}
/*
----------------------------------------------------------------------------------------------------
功能:块A读函数
参数:无
返回:块A的数据
----------------------------------------------------------------------------------------------------
*/
Block_A_Type BlockA_Read(void)
{
union
{
Block_A_Type Block; //结构体变量
unsigned char Buffer[sizeof(Block_A_Type)];
}Data;
FM24XX_MultRead(BLOCK_A_ADDR,Data.Buffer,sizeof(Block_A_Type));
return(Data.Block);
}
三:根据实时性的要求可以增添队列操作,擦写策略的操作