跳到主要内容
极客日志极客日志面向AI+效率的开发者社区
首页博客我的书AI学习GitHub 精选镜像AI工具UI配色美学关于
搜索内容 / 工具 / 仓库 / 镜像...⌘K搜索
注册
博客列表
C

STC32G12K128 指针强转实现 EEPROM 复杂数据类型存储

在 STC32G12K128 微控制器中使用 EEPROM 存储复杂数据的方法。通过指针强制类型转换和 sizeof 操作符,实现了 float、int 及结构体等数据类型的安全读写。文章提供了基础代码示例,并建议封装专用读写函数以提高代码可维护性。

DataScient发布于 2026/3/28更新于 2026/10/25118 浏览

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*)&current_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*)&current_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;
}

这样封装后,代码的可读性和可维护性都会大大提高。

3. 结构体数据的存储与管理技巧

目录

  1. 1. 理解指针强转与 EEPROM 存储的基础原理
  2. 2. 基础数据类型存储实战:float 与 int 的 EEPROM 操作
  3. 3. 结构体数据的存储与管理技巧

更多推荐文章

查看全部
  • Python 自动化脚本:8 个实用场景与代码实现
  • 飞算 JavaAI 实战:智能引导与协同交互提升 Java 开发效率
  • 借助 Ollama 和 Embeddings 构建智能知识图谱问答系统
  • MySQL 安装配置完整指南
  • 深度学习环境搭建指南:PyTorch、Anaconda 与 GPU 配置
  • Stable Diffusion WebUI 无障碍改造:键盘导航与屏幕阅读器适配
  • 使用 Docker 部署 Neo4j 图数据库
  • Spring Cloud 负载均衡实战:LoadBalancer 原理与策略
  • 从零开始手写 LLM 模型架构与实现
  • FAST_LIO 与 FAST_LIO2 算法原理及环境复现
  • MoonBit 构建 Luna UI:Web Components 与 SSR 实战
  • C++ 哈希表核心机制:unordered 系列容器、位图与布隆过滤器实战
  • Python 核心语法实战:从变量到文件操作
  • 7 款 AI+Excel 高效工具推荐,提升数据分析效率
  • LLaMA 2/3、Qwen 与 DeepSeek 开源大模型技术对比分析
  • 浏览器 F5 刷新机制深度解析
  • 2026 GitHub 热门 Python 项目:AI 代理与数据工具精选
  • 使用 DeepSeek API 构建贪吃蛇游戏全流程解析
  • FaceFusion 人脸融合算法详解:从对齐到渲染全过程
  • 逆向工程中的 Hash 算法识别与破解

相关免费在线工具

  • Base64 字符串编码/解码

    将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online

  • Base64 文件转换器

    将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online

  • Markdown转HTML

    将 Markdown(GFM)转为 HTML 片段,浏览器内 marked 解析;与 HTML转Markdown 互为补充。 在线工具,Markdown转HTML在线工具,online

  • HTML转Markdown

    将 HTML 片段转为 GitHub Flavored Markdown,支持标题、列表、链接、代码块与表格等;浏览器内处理,可链接预填。 在线工具,HTML转Markdown在线工具,online

  • JSON 压缩

    通过删除不必要的空白来缩小和压缩JSON。 在线工具,JSON 压缩在线工具,online

  • JSON美化和格式化

    将JSON字符串修饰为友好的可读格式。 在线工具,JSON美化和格式化在线工具,online