关于MSP430F149远程升级代码的编写思路,请指点

2019-07-30 15:35发布

想试一下,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段后的代码,保证程序升级过程中出现失败后,还能再次升级,直到成功或完全失败.....


友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。