phfjbnwd 发表于 2025-12-16 11:16:07

stc32G8k48 EEPROM不能掉电保存


#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(;;)
        {
        }
}



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



haiger 发表于 2025-12-16 11:41:55

主函数没加死循环,跑飞了吧。
加循环看看

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(;;)
            {
            }
      }
}

C_wolf 发表于 2025-12-16 15:31:25

问题一样啊
页: [1]
查看完整版本: stc32G8k48 EEPROM不能掉电保存