yixuantaba 发表于 2013-9-4 00:03:12

MSP430 IAP 升级疑问?

最近在做MSP430 IAP升级的工作,遇到了些问题,请大家指教!
   1.升级代码是通过串口中断接收并写入外部FLASH 存储器的,而这个串口中断程序是定义在应用程序区的,因为应用程序也会用到。这样每次升级应用程序的时候都会更新一次中断函数,请教大家这样合适吗?个人感觉不太保险!看过别人写升级代码的基本都是串口查询方式接收的。现在遇到的问题就是:升级完应用程序后,再进行串口接收时,在串口中断函数中会有一些函数在执行过程中跑飞,这些函数都是定义在UPDATACODE 区跟BOOTLOADER在同一个区,只是串口中断函数在应用程序区。

yixuantaba 发表于 2013-9-4 09:16:53

我自己先顶起来吧,期待大家的解答!

yixuantaba 发表于 2013-9-4 10:31:09

请大家不吝赐教!{:smile:}

lcofjp 发表于 2013-9-4 10:44:42

主要是你没太说明白,写入外部存储器,然后怎么更新到内部的?
您用的是自定义的升级程序是在code区而不是BSL区是吗。在code区调用了BSL区的代码?您用的是什么型号?

yixuantaba 发表于 2013-9-4 12:04:51

lcofjp 发表于 2013-9-4 10:44 static/image/common/back.gif
主要是你没太说明白,写入外部存储器,然后怎么更新到内部的?
您用的是自定义的升级程序是在code区而不是B ...

谢谢您的回复!
    我是自己写的升级程序定义在1100H-1FFFH,通过串口接收到更新的代码,并写入外部FLASH,然后置升级标志,重启MSP430F149后,升级程序会进入“蚂蚁搬家程序”就是将要更新的代码搬入应用程序区2000-FDFFH段。更新完了再重启,跳转到2000这个位置或者跳到UserAPP()这里执行应用程序。
void main(void)@"UPDATECODE" //1100-1FFF
{
SysClk_Init();               // 时钟源配置
SCI_Init();
if((tempbuff == 0x55)&&(tempbuff == 0x55)&&(tempbuff == 0x55)&&(tempbuff == 0x55))
      {
          Update();                  
      }
   UserApp();
   while(1);
}

lcofjp 发表于 2013-9-4 12:41:27

你的工程的具体细节我不太了解,不知道您的工程是如何编译的,是把IAP程序和APP程序放在两个工程中还是合在一个工程中。我觉得要是合在一起的话问题会小点,如果没和在一起,要注意问题就多些。

yixuantaba 发表于 2013-9-4 14:25:41

本帖最后由 yixuantaba 于 2013-9-4 14:54 编辑

都是在一个工程里的,一起编译的,应用程序放在2000以后,所以升级的时候只将2000以后的代码更新。这样接收用串口中断觉得合适吗?而且这个串口还要在应用程序里使用。
再请教:430在启动之前要调用初始化变量函数:
         XCALL    #__data16_memzero   
    00111212B0   24FC                        这个函数貌似被定义到了0x24fc 这里,但是我升级的时候把他擦除并写了其他东西,然后到这里就死了!怎么重定位这个函数?
这是我修改的XCL文件:
////////-------------------------------
-Z(CODE)CSTART=1100-1FFF
-Z(CODE)UPDATECODE=1100-1FFF
-Z(CODE)CODE=2000-FDFF   
-Z(CONST)DATA16_C,DATA16_ID,DIFUNCT=1100-1FFF
-Z(CONST)MYRESET=FFDE-FFDF
-Z(CONST)INTVEC=FFE0-FFFF
////////////////------------------------

lcofjp 发表于 2013-9-5 12:18:27

用中断接收的话,问题会多一些。这样需要一个位置确定的共享缓冲区,一定要确保地址不便。如果采用查询方式接收就不需要注意这个问题。
IAP程序中尽量少使用(最好不使用)全局变量,以便你重新编译的时候变量位置发生变化,这样c运行时库就不能正确初始化变量了。
c运行时库初始化代码的重定位我还真没接触到过,你查一查编译器或者链接器的手册吧。

yixuantaba 发表于 2013-9-5 14:46:08

lcofjp 发表于 2013-9-5 12:18 static/image/common/back.gif
用中断接收的话,问题会多一些。这样需要一个位置确定的共享缓冲区,一定要确保地址不便。如果采用查询方式 ...

谢谢您的答复!
    IAP程序里面用了4个全局变量,主要是串口接收数据包时用的,我查看了RAM 他们的地址没有变,程序升级之后,接收数据包也没有发生异常!但是问题出来了。2000H以后更新到FLASH的代码跟之前的一致,只是版本做了修改。到了249A以后代码就不一致了!是IAR的自己产生的代码。我不知道错在什么地方了?
如下是升级程序前后2496H后的反汇编代码,帮我分析一下!串口中断函数是在2000H以后flash里。

lcofjp 发表于 2013-9-5 14:50:34

我上班时间比较忙,有时间的话详谈吧。

yixuantaba 发表于 2013-9-5 16:06:29

我再看看相关手册,一定能搞定他!

yixuantaba 发表于 2013-9-6 14:57:28

本帖最后由 yixuantaba 于 2013-9-6 14:59 编辑

问题解决了,还是很感谢了您的解答。
原来用IAR烧写到芯片的代码和输出为txt格式的内容稍有不同导致的。最后用第三方烧写软件将含有引导程序的txt文件烧写到芯片,再升级的话,就不存在问题了!

pldjn 发表于 2014-10-21 17:22:20

楼主,你这样用是不是需要把UserApp();函数固定位置啊,不固定的话,如果下次编译完了这个函数位置变了,你Main函数里调用是不是就飞了。

acmilannast 发表于 2016-12-23 20:43:29

正在做cc430的 IAP 。。。 感觉boot中断还是不用最好
页: [1]
查看完整版本: MSP430 IAP 升级疑问?