大家好,用串口实现在线升级:
工程环境是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; //错误指示
}
}
}
}