TO:老古 有没用过IAP我现在 用P89C668的芯片,IAP功能,发现总是重启。查不到原因,改了很久也没改好。怀疑是看门狗的问题,但是我用的是硬狗,不是软狗,应该没有影响才对啊。请赐教。付程序。
void ERASE_FLASH(unsigned char block)
{
switch(block)
{
case 0:{
#pragma asm
MOV AUXR1,#20H file://AUXR1 的位ENBOOT=1 寻址到固件
MOV R0,#18 file://晶振为11.O592M 取11
MOV R1,#01H file://R1=01H 块擦除
MOV DPTR,#0 file://擦除BLOCK4
LCALL 0fff0H file://调用无返回参数
MOV AUXR1,#0
#pragma endasm
}
case 1:{
#pragma asm
MOV AUXR1,#20H file://AUXR1 的位ENBOOT=1 寻址到固件
MOV R0,#18 file://晶振为11.O592M 取11
MOV R1,#01H file://R1=01H 块擦除
MOV DPTR,#2000H file://擦除BLOCK4
LCALL 0fff0H file://调用无返回参数
MOV AUXR1,#0
#pragma endasm
}
case 2:{
#pragma asm
MOV AUXR1,#20H file://AUXR1 的位ENBOOT=1 寻址到固件
MOV R0,#18 file://晶振为11.O592M 取11
MOV R1,#01H file://R1=01H 块擦除
MOV DPTR,#4000H file://擦除BLOCK4
LCALL 0fff0H file://调用无返回参数
MOV AUXR1,#0
#pragma endasm
}
case 3:{
#pragma asm
MOV AUXR1,#20H file://AUXR1 的位ENBOOT=1 寻址到固件
MOV R0,#18 file://晶振为11.O592M 取11
MOV R1,#01H file://R1=01H 块擦除
MOV DPTR,#8000H file://擦除BLOCK4
LCALL 0fff0H file://调用无返回参数
MOV AUXR1,#0
#pragma endasm
}
case 4:{
#pragma asm
MOV AUXR1,#20H
MOV R0,#18 file://晶振为11.O592M 取11
MOV R1,#01H file://R1=01H 块擦除
MOV DPTR,#0c000H file://擦除BLOCK4
LCALL 0fff0H file://调用无返回参数
MOV AUXR1,#0
#pragma endasm
}
}
}
unsigned char WRITE_FLASH(unsigned char ch)
{
#pragma asm
CLR C
MOV AUXR1,#20H file://AUXR1 的位ENBOOT=1 寻址到固件
MOV R0,#18 file://晶振为18.432,取18
MOV R1,#02H file://R1=02H 字节编程功能
#pragma endasm
DPH=0x0c1;
DPL=0;
ACC=ch;
#pragma asm
LCALL 0fff0H INC DPTR
#pragma endasm
return ACC;
}
bit FLASH_SAVE()
{
unsigned char i;
unsigned char ch;
unsigned char *p;
p=¶_buf.com_id;
EA=0;
ERASE_FLASH(4);
EA=1;
for(i=0; i <10; i++)//写10个字节的数据
{
ch=*(p+i);
EA=0;
if( WRITE_FLASH(ch) != 0 )
{
EA=1;
return 0;
}
EA=1;
return;
}