phfjbnwd 发表于 2025-12-15 16:49:04

我使用 STC32G8K48芯片 现在掉电不能保存 | 可以了

#include "ALL_IO.H"
#include "COM_B.H"

我选 的晶振是22.1184
void IapIdle()
{
    IAP_CONTR = 0;                              //关闭IAP功能
    IAP_CMD = 0;                              //清除命令寄存器
    IAP_TRIG = 0;          //清除触发寄存器
    IAP_ADDRE=0XFF;
    IAP_ADDRH = 0x00;                           //将地址设置到非IAP区域
    IAP_ADDRL = 0;
}

char IapRead(unsignedshort addr)
{
    char dat;

    IAP_CONTR = 0x80;                           //使能IAP
    IAP_TPS = 22;                               //设置等待参数12MHz
    IAP_CMD = 1;                              //设置IAP读命令
          IAP_ADDRE=0XFF;
    IAP_ADDRL = addr;                           //设置IAP低地址
    IAP_ADDRH = addr >> 8;                      //设置IAP高地址
    IAP_TRIG = 0x5a;                            //写触发命令(0x5a)
    IAP_TRIG = 0xa5;                            //写触发命令(0xa5)
    _nop_();_nop_();_nop_();_nop_();_nop_();
    dat = IAP_DATA;                           //读IAP数据
    IapIdle();                                  //关闭IAP功能

    return dat;
}

void IapProgram(unsigned short addr, char dat)
{
    IAP_CONTR = 0x80;                           //使能IAP
    IAP_TPS = 22;                               //设置等待参数12MHz
    IAP_CMD = 2;                              //设置IAP写命令
                IAP_ADDRE=0XFF;
                IAP_ADDRL = addr;                           //设置IAP低地址
    IAP_ADDRH = addr >> 8;                      //设置IAP高地址
    IAP_DATA = dat;                           //写IAP数据
    IAP_TRIG = 0x5a;                            //写触发命令(0x5a)
    IAP_TRIG = 0xa5;                            //写触发命令(0xa5)
    _nop_();_nop_();_nop_();_nop_();_nop_();
    IapIdle();                                  //关闭IAP功能
}

void IapErase(unsigned short addr)
{
    IAP_CONTR = 0x80;                           //使能IAP
    IAP_TPS = 22;                               //设置等待参数12MHz
    IAP_CMD = 3;                              //设置IAP擦除命令
                IAP_ADDRE=0XFF;
                IAP_ADDRL = addr;                           //设置IAP低地址
    IAP_ADDRH = addr >> 8;                      //设置IAP高地址
    IAP_TRIG = 0x5a;                            //写触发命令(0x5a)
    IAP_TRIG = 0xa5;                            //写触发命令(0xa5)
    _nop_();_nop_();_nop_();_nop_();                                    //
    IapIdle();                                  //关闭IAP功能
}

unsigned short temp_eep_add=10;
void save_dat(void)
{

//unsigned char temp_data;
EA=0;
IapErase(temp_eep_add);
IapProgram(temp_eep_add,ALARM_statse);
EA=1;
}



void read_data(void)
{
//unsigned short temp_eep_add=10;

      EA=0;
ALARM_statse=IapRead(temp_eep_add);
第一次读出来,不是0XFF 是0

if(ALARM_statse>10)
{
      ALARM_statse=1;
}
EA=1;

}




请高手,帮看一下,谢谢

神农鼎 发表于 2025-12-15 17:28:30



EEPROM的使用 请 配合比较器做掉电检测 | 唯一正解,电力系统标准应用 - EEPROM/DataFlash 国芯人工智能技术交流网站 - AI32位8051交流社区

phfjbnwd 发表于 2025-12-15 17:31:18

神农鼎 发表于 2025-12-15 17:28
EEPROM的使用 请 配合比较器做掉电检测 | 唯一正解,电力系统标准应用 - EEPROM/DataFlash 国芯人工智能 ...

我的芯片,电源是5V,主要是掉电不能保存 EEPROM保存不进

lcwswust 发表于 2025-12-15 18:21:30

未见到对save_dat()、read_data()的调用情况

DebugLab 发表于 2025-12-16 08:28:40

请上传原理图和完整程序
要使用比较器判断掉电,没有看到比较器中断函数和楼上提到的函数调用

乘风飞扬 发表于 2025-12-16 09:53:52

IAP读、写、擦除函数里
IAP_ADDRE=0XFF;
改成
IAP_ADDRE=0X00;、

如果还是不行的话,用附件例子测试。

phfjbnwd 发表于 2025-12-16 13:43:35

乘风飞扬 发表于 2025-12-16 09:53
IAP读、写、擦除函数里
IAP_ADDRE=0XFF;
改成

你的程序可以使用,谢谢你,这个我搞了2天都不行
页: [1]
查看完整版本: 我使用 STC32G8K48芯片 现在掉电不能保存 | 可以了