STM32G431利用EEPROM存储结构体中的共用体(union)浮点数

首先定义一个含有浮点数的结构体,其中浮点数利用共用体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);
}
}

此时完成了直接对结构体中的共用体的直接存储和读取,断电亦可以保存数据。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值