找回密码
 立即注册
查看: 24|回复: 2

stc32G8k48 EEPROM不能掉电保存

[复制链接]
  • 打卡等级:初来乍到
  • 打卡总天数:2
  • 最近打卡:2025-12-16 11:16:07
已绑定手机

2

主题

2

回帖

14

积分

新手上路

积分
14
发表于 昨天 11:16 | 显示全部楼层 |阅读模式

#include "comm\STC32G.h"

void IapIdle()
{
    IAP_CONTR = 0;                              //关闭IAP功能
    IAP_CMD = 0;                                //清除命令寄存器
    IAP_TRIG = 0;                               //清除触发寄存器
    IAP_ADDRH = 0x80;                           //将地址设置到非IAP区域
    IAP_ADDRL = 0;
}

char IapRead(int addr)
{
    char dat;

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

    return dat;
}

void IapProgram(int addr, char dat)
{
    IAP_CONTR = 0x80;                           //使能IAP
    IAP_TPS = 22;                               //设置等待参数12MHz
    IAP_CMD = 2;                                //设置IAP写命令

    IAP_ADDRL = addr;                           //设置IAP低地址
    IAP_ADDRH = addr >> 8;                      //设置IAP高地址
                IAP_ADDRE=0xFF;
    IAP_DATA = dat;                             //写IAP数据
    IAP_TRIG = 0x5a;                            //写触发命令(0x5a)
    IAP_TRIG = 0xa5;                            //写触发命令(0xa5)
    _nop_();
    IapIdle();                                  //关闭IAP功能
}

void IapErase(int addr)
{
    IAP_CONTR = 0x80;                           //使能IAP
    IAP_TPS = 22;                               //设置等待参数12MHz
    IAP_CMD = 3;                                //设置IAP擦除命令

    IAP_ADDRL = addr;                           //设置IAP低地址
    IAP_ADDRH = addr >> 8;                      //设置IAP高地址
                IAP_ADDRE=0xFF;
    IAP_TRIG = 0x5a;                            //写触发命令(0x5a)
    IAP_TRIG = 0xa5;                            //写触发命令(0xa5)
    _nop_();                                    //
    IapIdle();                                  //关闭IAP功能
}



unsigned int eeprom_add_s=0X00;
unsigned char ALARM_statse;
void save_dat(void)
{

unsigned char temp_data;

IapErase(eeprom_add_s);
       
       
        temp_data=IapRead(eeprom_add_s);
        SBUF=temp_data; 这个地方读出来一直 0x00
IapProgram(eeprom_add_s,ALARM_statse);
//        ALARM_statse=IapRead(eeprom_add_s);
//SBUF=ALARM_statse;
}



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

EA=0;
ALARM_statse=IapRead(eeprom_add_s);
EA=1;
//if(ALARM_statse>10)
//{
//        ALARM_statse=1;
//}


}


#include "com_b.h"
#include "comm\STC32G.h"
#define MAIN_Fosc     22118400UL   //   24000000UL
#define Baudrate2   (65536 - MAIN_Fosc / 115200 / 4)
void Uart1_Init(void)        //9600bps@22.1184MHz
{
       
       
       
         T2R = 0;                //Timer stop
    T2_CT = 0;        //Timer2 set As Timer
    T2x12 = 1;        //Timer2 set as 1T mode
    T2H = (unsigned char)(Baudrate2 / 256);
    T2L = (unsigned char)(Baudrate2 % 256);
    ET2 = 0;    //禁止中断
    T2R = 1;                //Timer run enable
       
       
        SCON = 0x50;                //8位数据,可变波特率
//        AUXR |= 0x01;                //串口1选择定时器2为波特率发生器
//        AUXR |= 0x04;                //定时器时钟1T模式

//        AUXR |= 0x10;                //定时器2开始计时
       

        S1BRT=1;
                ES=1;
            REN = 1;    //允许接收
                        EA=1;
}

void UART1_int (void) interrupt 4
{
    if(RI)
    {
        RI = 0;

    }

    if(TI)
    {
        TI = 0;

    }
}


void main(void)
{
       
                  WTST = 0;  //设置程序指令延时参数,赋值为0可将CPU执行指令的速度设置为最快
    EAXFR = 1; //扩展寄存器(XFR)访问使能
    CKCON = 0; //提高访问XRAM速度
        Uart1_Init();
//        read_data();
//        SBUF=ALARM_statse;
       
        save_dat();
        for(;;)
        {
        }
}



请高手,看一下那里不对,谢谢



回复

使用道具 举报 送花

  • 打卡等级:以坛为家III
  • 打卡总天数:688
  • 最近打卡:2025-12-16 00:03:05

3

主题

93

回帖

2349

积分

金牌会员

积分
2349
发表于 昨天 11:41 | 显示全部楼层
主函数没加死循环,跑飞了吧。
加循环看看

void main(void)
{
      
                  WTST = 0;  //设置程序指令延时参数,赋值为0可将CPU执行指令的速度设置为最快
    EAXFR = 1; //扩展寄存器(XFR)访问使能
    CKCON = 0; //提高访问XRAM速度
        Uart1_Init();
//        read_data();
//        SBUF=ALARM_statse;
      
        while(1)
        {
            save_dat();
            for(;;)
            {
            }
        }
}
回复

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:417
  • 最近打卡:2025-12-16 11:09:16
已绑定手机

14

主题

226

回帖

2534

积分

金牌会员

积分
2534
发表于 昨天 15:31 | 显示全部楼层
问题一样啊
屏幕截图 2025-12-16 152909.png
屏幕截图 2025-12-16 152929.png
回复

使用道具 举报 送花

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

GMT+8, 2025-12-17 07:43 , Processed in 0.105334 second(s), 59 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表