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

106 lines
2.8 KiB
C
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#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;
}