请大佬帮忙EEPROM写入问题
本人小白。但是最近AI编程比较火,所以请AI设计GPS相关的程序。MCU使用的是STC32G12K128 64Pin模块,连接了串口GPS 3.3V供电。
GPS定位成功后,把最新经纬度写入EEPROM,下次开机,比较地点经纬度相同,就不用写入,直接使用。经纬度不同则写入最新的。
但是AI无论如何都无法使最新经纬度存储成功。每次系统等到GPS:OK 后关机再开机,还是初始默认的经纬度。
这里附上相关代码,请大佬斧正!
// 1. 新增寄存器定义
sfr IAP_ADDR2 = 0xC1; // 扩展地址寄存器 (高8位)
#define EEPROM_SECTOR0_ADDR 0xFE0000 // STC32G EEPROM 物理起始地址
// 2. 修复后的扇区擦除函数 (增加 IAP_ADDR2 设置)
void IAP_EraseSector(unsigned long addr) {
bit ea_save = EA;
EA = 0; // 关中断
IAP_CONTR = 0x80; // 使能 IAP
IAP_TPS = 11; // 11MHz 时钟设置
IAP_CMD = 3; // 擦除命令
IAP_ADDRL = (unsigned char)addr;
IAP_ADDRH = (unsigned char)(addr >> 8);
IAP_ADDR2 = (unsigned char)(addr >> 16); // 【关键修复】设置高8位 0xFE
IAP_TRIG = 0x5A;
IAP_TRIG = 0xA5;// 触发
_nop_();
IAP_Disable();
EA = ea_save; // 恢复中断
}
// 3. 修复后的保存函数
void Save_Settings() {
// ... 读取数据到 buffer ...
// 擦除 0xFE0000 扇区
IAP_EraseSector(EEPROM_SECTOR0_ADDR);
// 写入数据
for(i=0; i<512; i++) {
if(g_eeprom_buf != 0xFF) {
// IAP_ProgramByte 同样需要修复支持 unsigned long 地址
IAP_ProgramByte(EEPROM_SECTOR0_ADDR + i, g_eeprom_buf);
}
}
// ...
}
深圳国芯人工智能有限公司-实验箱
神农鼎 发表于 2026-2-3 15:25
深圳国芯人工智能有限公司-实验箱
谢谢!感觉AI卡壳,已经把相关EEPROM的代码喂给AI,但是改来改去,一直就不能存储成功。 别管AI了,你看看手册及例程,地址不是从0开始吗,怎么会是0xFE0000,看成汇编了吗。 eeprom地址是从0开始的 STC8H参考手册 Roswcr 发表于 2026-2-3 16:35
STC8H参考手册
楼主以MOVC的方式进行IAP操作,相当于在EEPROM_SECTOR0_ADDR 0xFE0000地址上又加了一个0xFE0000。 lcwswust 发表于 2026-2-3 15:54
别管AI了,你看看手册及例程,地址不是从0开始吗,怎么会是0xFE0000,看成汇编了吗。 ...
我自己肯定不会写代码,只能依靠AI。 Roswcr 发表于 2026-2-3 16:42
楼主以MOVC的方式进行IAP操作,相当于在EEPROM_SECTOR0_ADDR 0xFE0000地址上又加了一个0xFE0000。 ...
下载范例串口2发送命令读写EEPROM
烧录后,连接串口助手
关机再开机:显示
# RECV ASCII>
# RECV ASCII>
STC32G绯诲垪鍗曠墖鏈篍EPROM娴嬭瘯绋嬪簭锛屼覆鍙e懡浠よ缃涓?
W 0x000040 1234567890--> 瀵?x000040鍦板潃鍐欏叆瀛楃1234567890.
R 0x000040 10 --> 瀵?x000040鍦板潃璇诲嚭10涓瓧鑺傚唴瀹?
输入读命令:显示
# SEND ASCII>
R 0x000040 10
# RECV ASCII>
R 0x000040 10
璇诲嚭10涓瓧鑺傚唴瀹瑰涓?
1234567890
MCU可以验证范例,交给AI按照范例加入代码,已经按照0x000000写入,还是不行。
感谢回答。 vccbjqri 发表于 2026-2-3 19:29
下载范例串口2发送命令读写EEPROM
烧录后,连接串口助手
关机再开机:显示
楼主的擦读写函数EEPROM_SECTOR0_ADDR 也相应更改了吗?
页:
[1]
2