大家好,用串口实现在线升级:
工程环境是CCS.
FLASH空间分配:
APP :0xE000 –0XEFFF //这么小,主要是因为我没看到2132 flash 到底有多大,知道的同学请告诉我,在哪看的,另外RAM多大也顺便告诉我吧
BOOT:0xF000 — 0xFFFF //
BOOT 程序主体: //网上借鉴的别人的,可是我不清楚理论上应该是怎样解析txt,并烧录到具体的flash空间上,麻烦大神们帮忙解释解释,多谢
init_uart(); // 初始化串口
EraseFlash(0);//擦除应用程序Flash区
// uart_send("Update Ready !"); // 发送确认
/* 下面一段函数为串口数据接收和处理程序 */
while(1)
{
if(IFG2 & UCA0RXIFG)//if(UCA0IFG & UCRXIFG) //while (!(IFG2&UCA0TXIFG));
{
RxTemp=UCA0RXBUF;
#if 1
//***********for test ********************
if(RxTemp=='@')
{
P2OUT ^= BIT0; //LED
}
//*******************************************
#endif
RecBuf[RecCnt++]=RxTemp;
while(1)
{
if(IFG2 & UCA0RXIFG)//if(UCA0IFG & UCRXIFG) //while (!(IFG2&UCA0TXIFG));
{
RxTemp=UCA0RXBUF;
#if 1
//***********for test ********************
if(RxTemp=='@')
{
P2OUT ^= BIT0; //LED
}
//*******************************************
#endif
RecBuf[RecCnt++]=RxTemp;
if(RxTemp==0x0A && RecCnt>0 ) //有收到串口数据
{
if(RecBuf[0]=='q') //quit
{
//_NOP();
//return;
asm(" mov &0xEFFE, PC;"); //检测到 ‘q’,接收完毕
}
else if(RecBuf[0]=='@') //address
{
P2OUT &= ~BIT0; //LED
i=1;
Addr=0;
while(1)
{
if(RecBuf[i]<'0')
break;
Addr<<=4;
Addr+=AsciiToHex(RecBuf[i]);
i++;
}
//set address here
}
else //number
{
RecTemp=0;
j=0;
{
if(RecBuf[0]=='q') //quit
{
//_NOP();
//return;
asm(" mov &0xEFFE, PC;"); //检测到 ‘q’,接收完毕
}
else if(RecBuf[0]=='@') //address
{
P2OUT &= ~BIT0; //LED
i=1;
Addr=0;
while(1)
{
if(RecBuf[i]<'0')
break;
Addr<<=4;
Addr+=AsciiToHex(RecBuf[i]);
i++;
}
//set address here
}
else //number
{
RecTemp=0;
j=0;
for(i=0; i<400; i++)
{
if(RecBuf[i]<'0')
{
if(RecBuf[i]==0x0A)
{ break;}
if(NumberFlag)
{ NumberFlag=0;
WriterBuf[j++]=RecTemp;
}
}
else if(RecBuf[i]>='0')
{
RecTemp <<= 4;
RecTemp += AsciiToHex(RecBuf[i]);
NumberFlag=1;
}
}
if(j>0)
{
//write data
WriteFlash(Addr,WriterBuf,j);
Addr += j;
j=0;
}
NumberFlag=0;
}
RecCnt=0;
RxTemp=0;
}
if(RecCnt>400) {
P2OUT &= ~BIT2; //错误指示
}
}
}
}
{
if(RecBuf[i]<'0')
{
if(RecBuf[i]==0x0A)
{ break;}
if(NumberFlag)
{ NumberFlag=0;
WriterBuf[j++]=RecTemp;
}
}
else if(RecBuf[i]>='0')
{
RecTemp <<= 4;
RecTemp += AsciiToHex(RecBuf[i]);
NumberFlag=1;
}
}
if(j>0)
{
//write data
WriteFlash(Addr,WriterBuf,j);
Addr += j;
j=0;
}
NumberFlag=0;
}
RecCnt=0;
RxTemp=0;
}
if(RecCnt>400) {
P2OUT &= ~BIT2; //错误指示
}
}
}
}
wenzhong lin:
比如有个APP代码是这样的:
@e000B2 40 80 5A 20 01 F2 40 11 00 2A 00 D2 C3 29 00 F2 F0 EF 00 29 00 0C 43 30 41 31 40 00 04 B0 12 3A E0 0C 43 B0 12 00 E0 B0 12 34 E0 32 D0 10 00 FD 3F 03 43 03 43 FF 3F 03 43 1C 43 30 41 @ffdeFF FF @ffe42C E0 2C E0 @ffea2C E0 2C E0 2C E0 2C E0 2C E0 2C E0 2C E0 2C E0 2C E0 2C E0 1A E0 q
具体要怎么操作,帮忙说说,谢谢