问题描述
您好,我有两个简单的函数可以将值写入 EEPROM,但这不能正常工作。我在转换时做错了什么?
HAL_StatusTypeDef writeEEPROMByte(uint32_t address,uint8_t data) {
HAL_StatusTypeDef status;
address = address + EEPROM_BASE_ADDRESS;
HAL_FLASHEx_DATAEEPROM_Unlock(); //Unprotect the EEPROM to allow writing
status = HAL_FLASHEx_DATAEEPROM_Program(TYPEPROGRAMDATA_BYTE,address,data);
HAL_FLASHEx_DATAEEPROM_Lock(); // Reprotect the EEPROM
return status;
}
uint8_t readEEPROMByte(uint32_t address) {
uint8_t data = 0;
address = address + EEPROM_BASE_ADDRESS;
data = *(__IO uint32_t*)address;
return data;
}
void savetoEEPROM (uint32_t address,float data)
{
uint8_t *array;
array = (uint8_t*)(&data);
for(uint32_t i=0;i<4;i++) //float to array of uint8_t
{
writeEEPROMByte(address,array[i]);
}
}
float loadFromEEPROM (uint32_t address)
{
float value = 0;
uint8_t data[3];
for(uint32_t i=0;i<4;i++) //float to array of uint8_t
{
data[i] = readEEPROMByte(i+address);
}
value = *(float *)(&data);
return value;
}
浮点数的输出为 64.00 或 65-70 以获取更大的数字
感谢您的回答。我编辑了函数并更改为双精度,因为我使用了 atof()。但我仍然没有很好的读数, 数据[7-i] = readEEPROMByte(i+address); 给出更好的结果,例如 保存 - 读取 2 - 64,3 - 2112,4 - 4160,
void saveConfigToEEPROM (uint32_t address,double data)
{
uint8_t *array;
array = (uint8_t*)(&data);
for(int i=0;i<8;i++) //float to array of uint8_t
{
writeEEPROMByte(address+i,array[i]);
}
}
double loadConfigFromEEPROM (uint32_t address)
{
double value = 0;
uint8_t data[8];
for(int i=0;i<8;i++) //float to array of uint8_t
{
data[i] = readEEPROMByte(address+i);
}
value = *(double *)(&data);
return value;
}
解决方法
在函数 saveToEEPROM 的循环中,您重复覆盖相同的地址。
在 loadFromEEPROM 的循环中,您从 4 个不同的地址读取 4 个字节,但尝试将它们保存在 3 个字节长的缓冲区中。
此外,在 readEEPROMByte 中,您将地址转换为 uint32_t 指针,读取 uint32_t,然后将其作为 uint8_t 返回。这可能是未对齐的读取,这在这个平台上可能没问题(您没有准确指定您正在使用的部分)但为了安全起见并使代码更易于阅读,我只会读取一个字节(强制转换为 uint8_t 指针)。
类似地将字节数组转换为 loadFromEEPROM 中的浮点指针不是一个好习惯,但同样可能仍然没问题。