打印

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

[复制链接]
1235|4
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
arefeng|  楼主 | 2014-10-16 12:37 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
想试一下,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段后的代码,保证程序升级过程中出现失败后,还能再次升级,直到成功或完全失败.....


相关帖子

沙发
smilingangel| | 2014-10-16 17:27 | 只看该作者
这程序的啥意思,整那么多的空指令的?

使用特权

评论回复
板凳
arefeng|  楼主 | 2014-10-16 18:45 | 只看该作者
擦除的时候,从0X3100+512后开始擦除,前面的不动,占位置的

使用特权

评论回复
地板
dirtwillfly| | 2014-10-16 22:05 | 只看该作者
思路没问题。具体从什么地方开始擦除flash,要根据手册里flash的段地址来选择

使用特权

评论回复
评分
参与人数 1威望 +3 收起 理由
arefeng + 3
5
dirtwillfly| | 2014-10-17 21:12 | 只看该作者
楼主,你要学习正确的结贴方法:https://bbs.21ic.com/icview-442857-1-1.html

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

10

主题

99

帖子

1

粉丝