huyongji1.1-system/App/EEPROM/EEPROM.c

106 lines
2.8 KiB
C
Raw Permalink Normal View History

2025-04-16 09:58:09 +08:00
#include "EEPROM.h"
#include "stdio.h"
void Inf_AT24C02_Init(void)
{
HAL_I2C_Init(&hi2c2);
}
void Inf_AT24C02_WriteByte(uint8_t innerAddr, uint8_t byte)
{
HAL_I2C_Mem_Write(&hi2c2,ADDR,innerAddr,I2C_MEMADD_SIZE_8BIT,&byte,1,2000);
HAL_Delay(5);
}
uint8_t Inf_AT24C02_ReadByte(uint8_t innerAddr)
{
uint8_t byte;
HAL_I2C_Mem_Read(&hi2c2,ADDR+1,innerAddr,I2C_MEMADD_SIZE_8BIT,&byte,1,2000);
return byte;
}
void Inf_AT24C02_WriteBytes(uint8_t innerAddr, uint8_t *bytes, uint8_t len)
{
HAL_I2C_Mem_Write(&hi2c2,ADDR,innerAddr,I2C_MEMADD_SIZE_8BIT,bytes,len,2000);
HAL_Delay(5);
}
void Inf_AT24C02_ReadBytes(uint8_t innerAddr, uint8_t *bytes, uint8_t len)
{
HAL_I2C_Mem_Read(&hi2c2,ADDR+1,innerAddr,I2C_MEMADD_SIZE_8BIT,bytes,len,2000);
}
2025-05-20 09:41:22 +08:00
// 清空整个AT24C02 EEPROM (写入0xFF)
void Clear_EEPROM_All(void)
{
uint16_t addr; // 使用 uint16_t 以防地址超过 255 (虽然AT24C02不会)
uint8_t clear_data = 0xFF; // 定义要写入的值,通常用 0xFF
// printf("开始清空整个 EEPROM...\r\n");
// AT24C02 有 256 个字节地址 (0 到 255)
for(addr = 0; addr < 256; addr++)
{
// 调用你驱动中的单字节写入函数
Inf_AT24C02_WriteByte((uint8_t)addr, clear_data);
// 你驱动中的 Inf_AT24C02_WriteByte 已经包含了 HAL_Delay(5)
// 所以这里不需要额外加延时,除非你需要更长的延时。
// 可以选择性地加一个进度打印,但会拖慢速度
// if ((addr + 1) % 32 == 0) { // 每写入32个字节打印一次
// printf("已清空 %d / 256 字节...\r\n", addr + 1);
// }
}
// printf("EEPROM 清空完成。\r\n");
}
void Save_Float_To_EEPROM(uint8_t addr, float data)
{
uint8_t bytes[4]; // 用于存储浮点数的字节数组
memcpy(bytes,&data,sizeof(float));
Inf_AT24C02_WriteBytes(addr,bytes,4);
}
2025-04-16 09:58:09 +08:00
2025-05-20 09:41:22 +08:00
float Read_Float_From_EEPROM(uint8_t addr)
{
uint8_t bytes[4];
float data;
Inf_AT24C02_ReadBytes(addr,bytes,4);
memcpy(&data,bytes,sizeof(float));
return data;
}
void Save_Energy_To_EEPROM(float energy)
{
// 保存能量值
Save_Float_To_EEPROM(EEPROM_ENERGY_ADDR, energy); // 保存能量值到 EEPROM
2025-04-16 09:58:09 +08:00
2025-05-20 09:41:22 +08:00
// 保存标志位
Inf_AT24C02_WriteByte(EEPROM_ENERGY_FLAG, EEPROM_ENERGY_FLAG_VAL);
}
float Load_Energy_From_EEPROM(void)
{
float energy = 0.0f; // 默认值
uint8_t flag;
flag = Inf_AT24C02_ReadByte(EEPROM_ENERGY_FLAG); // 读取标志位
if(flag == EEPROM_ENERGY_FLAG_VAL)
{
energy=Read_Float_From_EEPROM(EEPROM_ENERGY_ADDR); // 读取能量值
}
else
{
energy=0.0f; // 未找到有效数据,返回默认值
Save_Energy_To_EEPROM(energy); // 保存默认值到 EEPROM
}
return energy;
}