想试一下,MSP430F149是否可以远程升级,思路是:
在应用程序的开头嵌入一段IAP代码,比如:在0X2100~0X21FF处增加判断是否升级,应用程序是否完善的代码,当然还包括远程通信,擦除FLASH,写FLASH等,这里面不用中断,直接查询处理,操作。
然后,在这段代码的后面写主程序,0X3100开始,一开始就调用IAP代码,判断0X3100+512后的代码是否完全,如果完全,就跳出IAP,回到主函数,进入到APP函数中去。如果不成功,就永远在IAP中等待升级指令。
如:
void run_iap_or_app(void) @"MY_IAP_CODE"
{
unsigned int i;
WDTCTL = WDTPW + WDTHOLD; //关闭看门狗
/***************************关闭所有IO口*************************/
P1DIR = 0XFF;
P1OUT = 0XFF;
P2DIR = 0XFF;
P2OUT = 0XFF;
P3DIR = 0XFF;
P3OUT = 0XFF;
P4DIR = 0XFF;
P4OUT = 0XFF;
P5DIR = 0XFF;
P5OUT = 0XFF;
P6DIR = 0XFF;
P6OUT = 0XFF;
sleep_mode=0x5A;
// 32kHz
TACTL =TASSEL0+TACLR+MC0;
CCTL0 = CCIE;
CCR0 =(32768/8);
//8MHz
BCSCTL1&=~XT2OFF;//打开XT振荡器
do
{
IFG1 &= ~OFIFG;//清除振荡错误标志
for(i = 0; i < 0xff; i++)
{
_NOP();//延时等待
}
}
while ((IFG1 & OFIFG) != 0);//如果标志为1继续循环等待
BCSCTL2|=SELM_2+SELS;//MCLK 8M and SMCLK 8M
IFG1&=~OFIFG;
if(1){
/*while(1){
}*/
}
}
void main (void)
{
run_iap_or_app();
_NOP();_NOP();
_NOP();_NOP();_NOP();_NOP();_NOP();_NOP();_NOP();_NOP();_NOP();_NOP();_NOP();_NOP();_NOP();_NOP();_NOP();_NOP();
_NOP();_NOP();_NOP();_NOP();_NOP();_NOP();_NOP();_NOP();_NOP();_NOP();_NOP();_NOP();_NOP();_NOP();_NOP();_NOP();
_NOP();_NOP();_NOP();_NOP();_NOP();_NOP();_NOP();_NOP();_NOP();_NOP();_NOP();_NOP();_NOP();_NOP();_NOP();_NOP();
_NOP();_NOP();_NOP();_NOP();_NOP();_NOP();_NOP();_NOP();_NOP();_NOP();_NOP();_NOP();_NOP();_NOP();_NOP();_NOP();
_NOP();_NOP();_NOP();_NOP();_NOP();_NOP();_NOP();_NOP();_NOP();_NOP();_NOP();_NOP();_NOP();_NOP();_NOP();_NOP();
_NOP();_NOP();_NOP();_NOP();_NOP();_NOP();_NOP();_NOP();_NOP();_NOP();_NOP();_NOP();_NOP();_NOP();_NOP();_NOP();
_NOP();_NOP();_NOP();_NOP();_NOP();_NOP();_NOP();_NOP();_NOP();_NOP();_NOP();_NOP();_NOP();_NOP();_NOP();_NOP();
_NOP();_NOP();_NOP();_NOP();_NOP();_NOP();_NOP();_NOP();_NOP();_NOP();_NOP();_NOP();_NOP();_NOP();_NOP();_NOP();
_NOP();_NOP();_NOP();_NOP();_NOP();_NOP();_NOP();_NOP();_NOP();_NOP();_NOP();_NOP();_NOP();_NOP();_NOP();_NOP();
_NOP();_NOP();_NOP();_NOP();_NOP();_NOP();_NOP();_NOP();_NOP();_NOP();_NOP();_NOP();_NOP();_NOP();_NOP();_NOP();
_NOP();_NOP();_NOP();_NOP();_NOP();_NOP();_NOP();_NOP();_NOP();_NOP();_NOP();_NOP();_NOP();_NOP();_NOP();_NOP();
_NOP();_NOP();_NOP();_NOP();_NOP();_NOP();_NOP();_NOP();_NOP();_NOP();_NOP();_NOP();_NOP();_NOP();_NOP();_NOP();
_NOP();_NOP();_NOP();_NOP();_NOP();_NOP();_NOP();_NOP();_NOP();_NOP();_NOP();_NOP();_NOP();_NOP();_NOP();_NOP();
_NOP();_NOP();_NOP();_NOP();_NOP();_NOP();_NOP();_NOP();_NOP();_NOP();_NOP();_NOP();_NOP();_NOP();_NOP();_NOP();
_NOP();_NOP();_NOP();_NOP();_NOP();_NOP();_NOP();_NOP();_NOP();_NOP();_NOP();_NOP();_NOP();_NOP();_NOP();_NOP();
_NOP();_NOP();_NOP();_NOP();_NOP();_NOP();_NOP();_NOP();_NOP();_NOP();_NOP();_NOP();_NOP();_NOP();_NOP();_NOP();
while(1);
}
写这些NOP是为了数据对齐,将来升级时,只擦除0X3000+512段后的代码,保证程序升级过程中出现失败后,还能再次升级,直到成功或完全失败.....
|