尧图网站建设 尧图网络
  • 首页
  • 关于我们
  • 服务项目
  • 案例展示
  • 建站流程
  • 资讯中心
  • 联系我们
首页/资讯中心/详情

STM32读写EEPROM

STM32读写EEPROM
📅 发布时间:2026/6/19 16:31:04

代码如下

#include "i2c.h"
#include <string.h>/* M24C64设备地址(A0/A1/A2接地,7位地址为0x50,左移1位后为0xA0) */
#define EEPROM_ADDR           (0x50 << 1)
#define M24C64_PAGE_SIZE      32          // 页面大小:32字节
#define M24C64_WRITE_DELAY_MS 5           // 写入周期:5毫秒
#define EEPROM_PARAM_ADDR     0x0000      // EEPROM参数存储起始地址// 参数结构体定义
typedef struct {uint8_t data[256]; // 数据缓冲区:256字节
} Param_t;/*** @brief  向M24C64 EEPROM写入Param_t结构体数据* @param  hi2c: I2C句柄指针* @param  param: 指向要写入的Param_t结构体的指针* @retval HAL_StatusTypeDef: HAL_OK表示成功,HAL_ERROR表示失败*/
HAL_StatusTypeDef EEPROM_WriteParam(I2C_HandleTypeDef *hi2c, Param_t *param)
{uint8_t *data = (uint8_t *)param; // 将结构体转换为字节数组uint16_t size = sizeof(Param_t);  // Param_t结构体大小(256字节)uint16_t addr = EEPROM_PARAM_ADDR; // 当前内存地址uint16_t bytes_written = 0;       // 已写入字节计数while (bytes_written < size) {// 计算当前页面剩余字节数uint16_t page_remain = M24C64_PAGE_SIZE - (addr % M24C64_PAGE_SIZE);// 确定本次写入的块大小(取剩余数据或页面剩余空间的最小值)uint16_t chunk_size = (size - bytes_written) > page_remain ? page_remain : (size - bytes_written);// 准备16位地址字节(高字节在前)uint8_t addr_bytes[2] = { (uint8_t)(addr >> 8), (uint8_t)(addr & 0xFF) };// 合并地址和数据到缓冲区uint8_t buffer[M24C64_PAGE_SIZE + 2];buffer[0] = addr_bytes[0];buffer[1] = addr_bytes[1];memcpy(&buffer[2], &data[bytes_written], chunk_size);// 向EEPROM写入数据if (HAL_I2C_Master_Transmit(hi2c, EEPROM_ADDR, buffer, chunk_size + 2, HAL_MAX_DELAY) != HAL_OK) {return HAL_ERROR;}// 等待EEPROM写入周期完成
        HAL_Delay(M24C64_WRITE_DELAY_MS);// 更新地址和已写入字节数bytes_written += chunk_size;addr += chunk_size;}return HAL_OK;
}/*** @brief  从M24C64 EEPROM读取Param_t结构体数据* @param  hi2c: I2C句柄指针* @param  param: 指向存储读取数据的Param_t结构体的指针* @retval HAL_StatusTypeDef: HAL_OK表示成功,HAL_ERROR表示失败*/
HAL_StatusTypeDef EEPROM_ReadParam(I2C_HandleTypeDef *hi2c, Param_t *param)
{uint8_t data[sizeof(Param_t)]; // 存储原始数据的缓冲区uint16_t mem_addr = EEPROM_PARAM_ADDR; // 读取起始地址// 从EEPROM读取数据if (HAL_I2C_Mem_Read(hi2c, EEPROM_ADDR, mem_addr, I2C_MEMADD_SIZE_16BIT, data, sizeof(Param_t), HAL_MAX_DELAY) != HAL_OK) {return HAL_ERROR;}// 将原始数据复制到Param_t结构体memcpy(param, data, sizeof(Param_t));return HAL_OK;
}/*** @brief  测试EEPROM的写入和读取功能* @param  无* @retval 无*/
void EEPROM_Test(void)
{Param_t write_param; // 用于写入测试的结构体Param_t read_param;  // 用于读取测试的结构体// 用测试数据填充write_param(0到255的循环模式)for (uint16_t i = 0; i < sizeof(Param_t); i++) {write_param.data[i] = (uint8_t)(i % 256);}// 向EEPROM写入数据printf("正在写入数据到EEPROM...\n");if (EEPROM_WriteParam(&hi2c2, &write_param) == HAL_OK) {printf("写入成功!\n");} else {printf("写入失败!\n");}// 从EEPROM读取数据printf("正在从EEPROM读取数据...\n");if (EEPROM_ReadParam(&hi2c2, &read_param) == HAL_OK) {printf("读取成功!\n");} else {printf("读取失败!\n");}
}

c14d15e92ebd062ab57bcc9203534d94

 

相关新闻

  • AI革命2025:新一代人力资源管理系统十大标杆产品评测
  • API 响应体加密场景下的调试实践:Postman 的局限与 Apipost 的优化
  • java锁升级过程

最新新闻

  • Python爬虫实战:逆向破解动态Cookie加密与签名生成
  • 个人跨省寄快递怎么省钱?2026长途低价渠道实测对比 - 快递物流资讯
  • 2026重庆闲置奢包回收测评|爱马仕LV香奈儿变现优选榜单 - 名奢变现站
  • 金价高位变现测评,哈尔滨黄金回收哪家贴合大盘价无隐形收费 - 奢侈品交易观察员
  • 走访深圳多区珠宝市场:2026 翡翠回收实测排行,7大商家各有专长 - 薛定谔的梨花猫
  • 西安黄金回收上门靠谱吗 2026六月金价行情避坑全攻略 - 润富黄金回收

日新闻

  • 5分钟掌握Python进化算法:Geatpy高性能优化工具完全指南
  • Microchip 24AA044 EEPROM选型与应用全指南:从参数解析到实战编程
  • 华为的鸿蒙到底有多牛?为什么称作遥遥领先?

周新闻

  • 3步解锁iOS设备:applera1n激活锁绕过完全指南
  • 39 2026 人工智能证书终极盘点,普通人选 AI 证书可以从这些方向入手
  • Redis 暴露公网有多危险?从端口检查到补救步骤

月新闻

  • 【总结】入门篇:50句话让你记住架构核心概念
  • WeChatMsg技术方案解析:实现Mac微信数据自主管理的完整解决方案
  • WeChatMsg:革新性微信数据备份方案,打造你的专属数字记忆库

关于尧图

  • 公司简介
  • 团队介绍
  • 企业文化
  • 荣誉资质

服务项目

  • 定制开发
  • 电商建站
  • UI 设计
  • 运维服务

快速链接

  • 案例展示
  • 建站流程
  • 常见问题
  • 资讯中心

联系方式

  • 📍北京市朝阳区互联网产业园 A 座 10 层
  • 📞400-888-8888
  • ✉️contact@rkmt.cn
  • 🕐周一至周日 9:00-21:00

© 2024 北京尧图网络科技有限公司 版权所有 | 京 ICP 备 XXXXXXXX 号