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) 可以确保我们总是使用正确的长度。
在实际使用中,我建议为每种数据类型编写专门的读写函数。比如:
{
iap_write_bytes(addr, (uint8*)&value, (value));
}
{
value;
iap_read_bytes(addr, (uint8*)&value, (value));
value;
}

