2、具体实现
1)定义 FLASH 页大小,储存数据大小:
#define FLASH_PAGE 1024
#define FLASH_DATAPACK 16
2)定义一个储存结构体
typedef struct {
u32 Addr; // 地址为 flash 一页的首地址
u8 Read; // 读地址的计数
u8 Write; // 写地址的计数
u8 ReadBuff[FLASH_DATAPACK]; // 读取缓存区
u8 WriteBuff[FLASH_DATAPACK]; // 写入缓存区
} EEPROMTypeDef;
// FLASH 写函数
void FlashWrite( EEPROMTypeDef *Flash_16 )
{
u8 Flag;
while_1:
// 获取标志位
Flag = *(vu8*)(Flash_16->Addr + (Flash_16->Write) * FLASH_DATAPACK);
if(Flash_16->Write < 64 && Flag == 0xff) // 如果地址在一页内且内容空白
{
HT_Flash_ByteWrite(Flash_16->WriteBuff, Flash_16->Addr + (Flash_16->Write++) * FLASH_DATAPACK, FLASH_DATAPACK);
}
else if ( Flash_16->Write < 64 && Flag != 0xff ) // 如果地址在一页内却有数据存储
{
Flash_16->Write++;
goto while_1;
}
else if(Flash_16->Write >= 64 ) // 如果地址不在一页内
{
Flash_16->Write = 63;
}
}
// FLASH 读函数
void FlashRead(EEPROMTypeDef *Flash_16)
{
u8 Flag;
while_1:
// 获取标志位
Flag = *(vu8*)(Flash_16->Addr + (Flash_16->Read) * FLASH_DATAPACK);
if( Flash_16->Read < 64 && Flag == 0xA5 ) // 如果地址在一页之内且数据有效
{
HT_Flash_ByteRead(Flash_16->ReadBuff, Flash_16->Addr + (Flash_16->Read) * FLASH_DATAPACK, FLASH_DATAPACK);
HT_Flash_ByteWrite(00, Flash_16->Addr + (Flash_16->Read++) * FLASH_DATAPACK, 1); // 标记数据无效
}
else if(Flash_16->Read < 64 && Flag != 0xA5) // 如果地址在一页之内但数据无效
{
if(Flag != 0xff)
{
Flash_16->Read++;
goto while_1;
}
}
else if(Flash_16->Read >= 64) // 如果地址不在一页之内
{
Flash_16->Read = 0;
Flash_16->Write = 0;
HT_Flash_PageErase(Flash_16->Addr); // 页擦除
}
}
|