19839009851 发表于 2024-8-29 09:06:42

关于EEPROM地址打印数据错误问题

是这样的,我的全局变量 u8 table 没有赋初值,程序如下,但是打印出来的不是200,是不是哪个环节除啦问题啊大神,我用STC8H的EEPROM 一直没有成功过,头疼!

DebugLab 发表于 2024-8-29 09:25:27

有没有startup.a51,如果没有还不初始化,RAM是上电随机数

DebugLab 发表于 2024-8-29 09:26:31

startup.a51初始化已使用的ram区域,不建议删除

21cnsound 发表于 2024-8-29 10:06:42

DebugLab 发表于 2024-8-29 09:26
startup.a51初始化已使用的ram区域,不建议删除

一般写代码,RAM的使用都是先赋值/写再读,一般不初始化有什么风险呢?

乘风飞扬 发表于 2024-8-29 10:09:50

烧录附件的例子到芯片里试试

DebugLab 发表于 2024-8-29 10:32:45

21cnsound 发表于 2024-8-29 10:06
一般写代码,RAM的使用都是先赋值/写再读,一般不初始化有什么风险呢?

先赋值就没事了,默认为0不赋值就出错

21cnsound 发表于 2024-8-29 11:21:44

IAP的擦、写、读函数贴出来看看

19839009851 发表于 2024-8-29 15:23:28

#include "pbdata.h"



void UART1_Initalize(void);
void TIM0_Initalize(void);
void INIT1_Initalize(void);


void Delay100ms(void);

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_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_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_TRIG = 0x5a;                            //?????(0x5a)
    IAP_TRIG = 0xa5;                            //?????(0xa5)
    _nop_();                                    //
    IapIdle();                                  //??IAP??
}



u8 table;



void main(void)
       


{
       
   P1M1=0x00;        P1M0=0x00;
       P3M1=0x00;        P3M0=0x00;               
       P5M1=0x00;        P5M0=0x00;
       

       
               Delay100ms();
               Delay100ms();
               Delay100ms();
               Delay100ms();
               
       UART1_Initalize();
           ADC_Initalize();
                TIM0_Initalize();
               PWM_Initalize();
       INIT1_Initalize();
       
    IapErase(0x0000);
    IapProgram(0x0000, 200);
    table = IapRead(0x0000);                     //P1
               
       

               

               

               
               ADC_Process();
          
       
               
                while(1)
                {
               
                          Delay100ms();
                  Delay100ms();
                               printf("EEPROMÖµ%bd\n",table );
                                Delay100ms();
                  Delay100ms();
               
               
               
                }

               
               
               
               



               



}


/************´®¿Ú1´òÓ¡º¯Êý************/

void UART1_Initalize(void)          //115200bps@22.1184MHz
{
        SCON = 0x50;                              //8λÊý¾Ý£¬¿É±ä²¨ÌØÂÊ
        AUXR |= 0x40;                              //¶¨Ê±Æ÷1ʱÖÓ1Tģʽ
        AUXR &= 0xFE;                      //Ñ¡Ôñ¶¨Ê±Æ÷1Ϊ²¨ÌØÂÊ·¢ÉúÆ÷
        TMOD &= 0x0F;                              //ÉèÖö¨Ê±Æ÷ģʽ
        TL1 = 0xD0;                                   
        TH1 = 0xFF;                       
        ET1 = 0;                                      //¹Ø±Õ¶¨Ê±Æ÷1ÖжÏ
        TR1 = 1;                                      //¿ªÆô¶¨Ê±Æ÷
}

/**********ÖØÐ¶¨Òå***************/

void UART1_SendChar(u8 udata)
{
       
        SBUF=udata;
        while(!TI);
        TI=0;

}


char putchar(char c)
{
        UART1_SendChar(c);
        return c;

}

/****************************¶¨Ê±Æ÷0Òç³öÂÊ*************************/

void TIM0_Initalize(void)                //3΢ÃëÒç³öÂÊ×÷ΪPWMʱÖÓÔ´
{
        AUXR |= 0x80;                        //?????1T??
        TMOD &= 0xF0;                        //???????
        TL0 = 0xea;                                //???????
        TH0 = 0xff;                                //???????
        TF0 = 0;                                //??TF0??
        TR0 = 1;                                //???0????
}


/************************ÍⲿÖжÏ1³õʼ»¯****************************/

void INIT1_Initalize(void)
{

                IT1 = 1;         //ϽµÑØ´¥·¢                           
    EX1 = 1;                                 
   EA = 1;

}

/******************************ÑÓʱº¯Êý****************************/





void Delay100ms(void)        //@22.1184MHz
{
        unsigned char data i, j, k;

        i = 12;
        j = 57;
        k = 122;
        do
        {
                do
                {
                        while (--k);
                } while (--j);
        } while (--i);
}

/***************±£»¤ÍⲿÖжÏ1***********************/


void INT1_IRQ_Handler(void) interrupt 2
{
       
    CCAP0L=0;        CCAP0H=0;                                          //Õ¼¿Õ±È¿ØÖÆÎ»,¹Ø±ÕPWM
       
                Level_20=1; Level_40=1;        Level_60=1; Level_80=1; Level_100=1;       //ËùÓÐָʾµÆ¶¼¹Ø±Õ
   
          
}













19839009851 发表于 2024-8-29 15:25:28

    u8 table;

IapErase(0x0000);
    IapProgram(0x0000, 200);
    table = IapRead(0x0000);                     
我给地址0 擦除后 编程 地址0 ,数值为200,然后读取地址0,数值给table 然后打印出来就是-56

19839009851 发表于 2024-8-29 15:41:03

问题找到啦哈哈 {:lol:}
页: [1]
查看完整版本: 关于EEPROM地址打印数据错误问题