1. 理解指针强转与EEPROM存储的基础原理
说到STC32G12K128的EEPROM存储,很多初学者一开始可能只会用uint8类型的数据,也就是单字节的数据存储。但实际项目中,我们经常需要存储更复杂的数据类型,比如浮点数、整数、甚至是自定义的结构体。这时候,指针强制类型转换和sizeof操作符就成了我们的得力助手。
指针强转听起来有点吓人,但其实很简单。想象一下,你有一个float类型的变量,占4个字节,而EEPROM的读写函数只认uint8类型的指针。这时候,你可以通过强制类型转换,告诉编译器:“别管它原来是float还是int,现在你就把它当成uint8类型来处理”。这样,EEPROM函数就能正确读写这些多字节的数据了。
sizeof操作符则是帮我们自动计算数据类型或变量占用的字节数。比如sizeof(float)通常返回4,因为float类型占4个字节。这样,我们就不用手动计算数据长度,避免出错。
在实际操作中,EEPROM的存储是以扇区为单位的,每个扇区512字节。写数据之前,通常需要先擦除整个扇区。这是因为EEPROM的写操作只能将1变为0,而不能将0变为1。擦除操作会将整个扇区置1,这样后续的写操作才能正确进行。
2. 基础数据类型存储实战:float与int的EEPROM操作
让我们先从最简单的float和int类型开始。假设我们有一个float类型的变量需要存储到EEPROM中,下面是一个完整的示例代码:
#include "headfile.h"
float current_temperature = 25.6;
float read_back_temperature = 0.0;
void main()
{
board_init();
iap_init();
// 先擦除目标扇区
iap_erase_page(0);
// 写入float数据
iap_write_bytes(0x00, (uint8*)¤t_temperature, sizeof(current_temperature));
// 读取float数据
iap_read_bytes(0x00, (uint8*)&read_back_temperature, sizeof(read_back_temperature));
while(1)
{
printf("Original: %.2f, Readback: %.2f\n", current_temperature, read_back_temperature);
delay_ms(1000);
}
}
这段代码演示了如何将一个float类型的变量写入EEPROM,然后再读回来。关键就在于那两个强制类型转换:(uint8*)¤t_temperature 和 (uint8*)&read_back_temperature。这样转换后,iap_write_bytes和iap_read_bytes函数就能正确处理float类型的数据了。
对于int类型也是同样的道理。不过要注意的是,int类型在不同编译器下可能占用2字节或4字节,使用sizeof(int)可以确保我们总是使用正确的长度。
在实际使用中,我建议为每种数据类型编写专门的读写函数。比如:
void eeprom_write_float(uint32 addr, float value)
{
iap_write_bytes(addr, (uint8*)&value, sizeof(value));
}
float eeprom_read_float(uint32 addr)
{
float value;
iap_read_bytes(addr, (uint8*)&value, sizeof(value));
return value;
}
这样封装后,代码的可读性和可维护性都会大大提高。
5189



被折叠的 条评论
为什么被折叠?



