#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); } // 清空整个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); } 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 // 保存标志位 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; }