首先定义一个含有浮点数的结构体,其中浮点数利用共用体union表示。
typedef struct Shop_List{
unsigned char X_Store;
unsigned char Y_Store;
union{
float Price;
uint8_t buf[4];
}X_Price;
} Shop,*ShopPtr;
然后定义一个结构体。
Shop ShopList = {10,10,1.3};
其次再进行EEPROM的配置。利用STM32CUBEMX进行配置,这里省略。EEPROM的读写程序如下,
unsigned char EEPROM_Read1(unsigned char Adr){
unsigned char Data;
I2CStart();
I2CSendByte(0xa0);
I2CWaitAck();
I2CSendByte(Adr);
I2CWaitAck();
I2CStop();
I2CStart();
I2CSendByte(0xa1);
I2CWaitAck();
Data = I2CReceiveByte();
I2CStop();
return Data;
}
void EEPROM_Write1(unsigned char Adr,unsigned char Data){
I2CStart();
I2CSendByte(0xa0);
I2CWaitAck();
I2CSendByte(Adr);
I2CWaitAck();
I2CSendByte(Data);
I2CWaitAck();
I2CStop();
}
float占用4个字节,每个EEPROM地址只能存储一个字节,因此利用四个位置进行存储。
void EEPRAM_Write2(unsigned char Adr,ShopPtr Data){
uint8_t Len = sizeof(Data->X_Price.Price);
while(Len--){
EEPROM_Write1(Adr + (4 - Len),Data->X_Price.buf[4 - Len]);
HAL_Delay(10);
}
}
void EEPRAM_Read2(unsigned char Adr,ShopPtr Data){
uint8_t Len = sizeof(Data->X_Price.Price);
while(Len--){
Data->X_Price.buf[4 - Len] = EEPROM_Read1(Adr + (4 - Len));
HAL_Delay(10);
}
}
此时完成了直接对结构体中的共用体的直接存储和读取,断电亦可以保存数据。