STC32G8K64的EEPROM为什么不能正确写入读出数据 | 已解决
子程序是copy例程的,set=CAN1_Rx.DataBuffer;
set=CAN1_Rx.DataBuffer;
set=CAN1_Rx.DataBuffer;
set=CAN1_Rx.DataBuffer;
set=0x50;
set=0x51;
set=0x52;
set=0x53;
EEPROM_SectorErase(0); //擦除扇区
EEPROM_write_n(0,&set,8); //写N个字符
EEPROM_read_n(0,set,8); // 读0x000000地址开始的8个开机设置值,读出的SET-SET的值不是之前送进去的数,怎么回事?
您好,关于您提到的 STC32G8K64 芯片中 EEPROM 不能正确写入和读出数据 的问题,结合您提供的代码片段,我将从以下几个方面进行专业分析和排查建议:
一、EEPROM操作基本流程回顾
STC32G8K64 芯片的 EEPROM 操作通常包括以下几个步骤:
1. 扇区擦除(Sector Erase)
EEPROM 为 Flash 类型,写入前必须先擦除。
擦除单位为扇区,每个扇区大小为 1KB。
注意:擦除后所有位为 1(即数据为 0xFF)。
2. 数据写入(Write)
使用 EEPROMwriten(addr, buffer, len) 函数。
写入前必须确保目标地址所在的扇区已经被擦除。
3. 数据读取(Read)
使用 EEPROMreadn(addr, buffer, len) 函数。
读取无需擦除或写入操作前置。
二、您代码中存在的关键问题分析
1. 地址参数错误:写入地址为 0x20(即十进制32),读取地址为0
c
EEPROMwriten(0, &set, 8);// 实际写入地址为 set 的地址,即 set+20
EEPROMreadn(0, set, 8); // 从地址0开始读取
&set 是一个 指针偏移操作,表示从 set 数组的第20个元素开始取地址。
如果 set 是一个大小为 8 的数组(set),那么 set 已经越界,导致写入地址错误。
这会导致:
数据写入到不可控的内存区域,甚至可能覆盖了其他变量。
后续读取地址 0 时,当然无法读到您期望的数据。
✅ 建议修改为:
c
EEPROMwriten(0, set, 8);// 将 set ~ set 写入地址0
2. 写入前是否成功擦除?
c
EEPROMSectorErase(0);// 擦除扇区0
这一行是正确的,但需确认:
函数是否返回成功?
是否等待擦除完成?
是否在写入前调用?
✅ 建议:
添加擦除结果判断,例如:
c
if (EEPROMSectorErase(0) != SUCCESS) {
// 处理擦除失败
}
确保擦除完成后,再进行写入。
3. EEPROM写入函数是否正确实现?
STC32 系列芯片的 EEPROM 操作依赖于库函数或自定义的 Flash 操作函数。
如果 EEPROMwriten 是用户自定义或非官方例程,请检查:
是否按页写入(Flash 写入通常按页对齐)。
是否处理了地址对齐问题。
是否等待写入完成。
✅ 建议:
使用官方 SDK 提供的 Flash 写入函数。
或者确保自定义函数正确实现了 Flash 写入逻辑。
4. 数据类型与对齐问题
set 是 uint8t 类型数组?
如果是其他类型(如 int、float、结构体),需要注意:
对齐方式。
大小端问题。
数据类型一致性。
✅ 建议:
明确 set 类型为 uint8t set;。
写入与读取使用相同的数据类型和顺序。
三、完整推荐代码示例
c
include "stc32g.h"
uint8t set;
// 假设CAN数据已正确获取
set = CAN1Rx.DataBuffer;
set = CAN1Rx.DataBuffer;
set = CAN1Rx.DataBuffer;
set = CAN1Rx.DataBuffer;
set = 0x50;
set = 0x51;
set = 0x52;
set = 0x53;
// 擦除扇区0
if (EEPROMSectorErase(0) != SUCCESS) {
// 错误处理
while(1); // 停止程序
}
// 写入8字节数据到地址0
EEPROMwriten(0, set, 8);
// 读取8字节数据回set
EEPROMreadn(0, set, 8);
// 此时 set~set 应为预期值
四、常见调试建议
1. 使用调试器查看写入地址是否正确
查看 set 数组的地址是否与写入地址一致。
使用断点或内存查看功能,确认写入后 Flash 地址内容是否正确。
2. 检查电源电压是否稳定
Flash 操作对电压敏感,建议使用稳压电源供电。
3. 避免频繁写入
Flash 有擦写寿命(通常 10万次左右),建议尽量减少擦写次数。
4. 确认编译器优化等级
有时编译器优化可能导致变量地址被优化掉,影响读写。
五、总结
您遇到的问题主要集中在 地址错误写入 和 数组越界 上,导致写入与读取不在同一地址。建议:
检查 set 数组定义和写入地址是否一致。
确保写入前擦除成功。
使用调试工具验证 Flash 地址内容。
使用官方 Flash/EEPROM 操作函数以确保兼容性。
如果您能提供完整的 EEPROMwriten 和 EEPROMSectorErase 函数实现,我可以进一步分析是否存在底层实现问题。
祝您调试顺利!
[本文内容由国芯人工智能辅助生成,仅供参考] 谢谢啦,SET,改为SET就可以了。万分感谢
页:
[1]