vccbjqri 发表于 2026-2-3 15:17:35

请大佬帮忙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:35



深圳国芯人工智能有限公司-实验箱

vccbjqri 发表于 2026-2-3 15:37:40

神农鼎 发表于 2026-2-3 15:25
深圳国芯人工智能有限公司-实验箱

谢谢!感觉AI卡壳,已经把相关EEPROM的代码喂给AI,但是改来改去,一直就不能存储成功。

lcwswust 发表于 2026-2-3 15:54:03

别管AI了,你看看手册及例程,地址不是从0开始吗,怎么会是0xFE0000,看成汇编了吗。

Ayb_ice 发表于 2026-2-3 16:11:49

eeprom地址是从0开始的

Roswcr 发表于 2026-2-3 16:35:37

STC8H参考手册

Roswcr 发表于 2026-2-3 16:42:34

Roswcr 发表于 2026-2-3 16:35
STC8H参考手册

楼主以MOVC的方式进行IAP操作,相当于在EEPROM_SECTOR0_ADDR 0xFE0000地址上又加了一个0xFE0000。

vccbjqri 发表于 2026-2-3 19:26:23

lcwswust 发表于 2026-2-3 15:54
别管AI了,你看看手册及例程,地址不是从0开始吗,怎么会是0xFE0000,看成汇编了吗。 ...

我自己肯定不会写代码,只能依靠AI。

vccbjqri 发表于 2026-2-3 19:29:27

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写入,还是不行。
感谢回答。

Roswcr 发表于 2026-2-3 20:32:01

vccbjqri 发表于 2026-2-3 19:29
下载范例串口2发送命令读写EEPROM
烧录后,连接串口助手
关机再开机:显示


楼主的擦读写函数EEPROM_SECTOR0_ADDR 也相应更改了吗?   
页: [1] 2
查看完整版本: 请大佬帮忙EEPROM写入问题