关于EEPROM地址打印数据错误问题
是这样的,我的全局变量 u8 table 没有赋初值,程序如下,但是打印出来的不是200,是不是哪个环节除啦问题啊大神,我用STC8H的EEPROM 一直没有成功过,头疼!有没有startup.a51,如果没有还不初始化,RAM是上电随机数 startup.a51初始化已使用的ram区域,不建议删除 DebugLab 发表于 2024-8-29 09:26
startup.a51初始化已使用的ram区域,不建议删除
一般写代码,RAM的使用都是先赋值/写再读,一般不初始化有什么风险呢? 烧录附件的例子到芯片里试试 21cnsound 发表于 2024-8-29 10:06
一般写代码,RAM的使用都是先赋值/写再读,一般不初始化有什么风险呢?
先赋值就没事了,默认为0不赋值就出错 IAP的擦、写、读函数贴出来看看 #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; //ËùÓÐָʾµÆ¶¼¹Ø±Õ
}
u8 table;
IapErase(0x0000);
IapProgram(0x0000, 200);
table = IapRead(0x0000);
我给地址0 擦除后 编程 地址0 ,数值为200,然后读取地址0,数值给table 然后打印出来就是-56 问题找到啦哈哈 {:lol:}
页:
[1]