📄 main.c
字号:
#include "REG516.H"
#include "def.h"
#define ON 0;
#define OFF 1;
sbit LED_RED = P3 ^ 3; //P1 ^ 2 //LED control 1 = dark ; 0=light
sbit LED_GRE = P3 ^ 4;
extern void initSERIAL(void);
extern void Uart0_print(char *p);
extern void Erase_64k(void);
extern void Program_64k(WORD RomAddr, BYTE xdata *pxdata, WORD Length0);
BYTE data ISP_STATE; //0: start;
//1: shakehand success;
//2: received data length and check sum;
//3: 1st data (32k)
//4: 2nd data (32k)
WORD data Rec_length;
WORD data Data_length;
BYTE data CheckSum1, CheckSum2;
BYTE data Rec_sum=0;
BYTE xdata *pxdata=0x0000;
BYTE xdata Rec_buff[0x8000]; //can receive 31k(31*1024 byte);
void initInt(void)
{
EA=1;
}
void initTIMER0(void)
{
TMOD|=0X01; //TIMER0: MODE 1(16bit),timer ;
ET0=1;
}
void Start_Timer0(WORD count) //
{
TL0=count&0x0ff;
TH0=(count>>8)&0x0ff;
TR0=1; //START;
}
/////////////////////////////////////////////////////
//-----------------------------------------------------
void main(void)
{
// WORD data i;
initInt();
initSERIAL();
initTIMER0();
ISP_STATE=0;
Rec_length=0;
Data_length=0;
LED_RED=ON;
//-------ENTER ISP MODE-------------
CHPENR=0X87;
CHPENR=0X59;
CHPCON=0X03; //ISP MODE
CHPENR=0X00; //READ ONLY (CHPCON)
Start_Timer0(0XFFF0); //15MS;
PCON|=0X01; //IDLE;
LED_GRE=ON;
//----------------------------------
while(TRUE)
{
switch(ISP_STATE)
{
case 0:
if(Rec_length>=4)
{
if( *(pxdata)=='s'&&*(pxdata+1)=='t')
{
Rec_length=0;
ISP_STATE++;
LED_GRE=~LED_GRE;
Uart0_print("stok");
}
}
break;
case 1: //receive length;
if(Rec_length>=4)
{
Data_length=*((WORD xdata *)pxdata);
CheckSum1=*(pxdata+2);
CheckSum2=*(pxdata+3);
Rec_sum=0;
Rec_length=0;
ISP_STATE++;
//Erase_64k(); //erase 64k flash;
LED_GRE=~LED_GRE;
//Uart0_print("leok");
//------------send back--------------
ES=0; //disabe uart0 interrupt;
TI=0;
SBUF=*(pxdata);
while(!TI);
TI=0;
SBUF=*(pxdata+1);
while(!TI);
TI=0;
SBUF=*(pxdata+2);
while(!TI);
TI=0;
SBUF=*(pxdata+3);
while(!TI);
TI=0;
ES=1;
//-----------------------------------
}
break;
case 2: //1st data;
if(Rec_length>=Data_length || Rec_length>=0x8000)
{
if(Rec_sum!=CheckSum1)
{
Rec_length=0;
ISP_STATE=0;
LED_GRE=~LED_GRE;
Uart0_print("eror");
}
else
{
LED_GRE=~LED_GRE;
Erase_64k(); //erase 64k flash;
//--------------program (Rec_length) byte
if(Rec_length>0x8000)
Rec_length=0x8000;
Program_64k(0, 0, Rec_length);
//--------------------------
if(Rec_length<Data_length)
{
Data_length-=Rec_length;
Rec_length=0;
Rec_sum=0;
ISP_STATE++;
LED_GRE=~LED_GRE;
}
else ISP_STATE=0;
Rec_length=0;
Uart0_print("prok");
}
}
break;
case 3: //2nd data;
if(Rec_length>=Data_length || Rec_length>=0x8000)
{
if(Rec_sum!=CheckSum2)
{
Rec_length=0;
ISP_STATE=0;
LED_GRE=~LED_GRE;
Uart0_print("eror");
}
else
{
LED_GRE=~LED_GRE;
//program (Rec_length) byte
if(Rec_length>0x8000)
Rec_length=0x8000;
Program_64k(0x8000, 0, Rec_length);
//------------------------
Uart0_print("prok");
ISP_STATE=0;
Rec_length=0;
}
}
break;
default:
break;
} //end of switch
// for(i=0;i<6000;i++);
// Uart0_print("GOOD\n");
}
}
void INT_TIMER0(void) interrupt 1
{
TR0=0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -