搜索
bottom↓
回复: 13

MSP430 IAP 升级疑问?

[复制链接]

出0入0汤圆

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

出0入0汤圆

 楼主| 发表于 2013-9-4 09:16:53 | 显示全部楼层
我自己先顶起来吧,期待大家的解答!

出0入0汤圆

 楼主| 发表于 2013-9-4 10:31:09 | 显示全部楼层
请大家不吝赐教!

出0入0汤圆

发表于 2013-9-4 10:44:42 | 显示全部楼层
主要是你没太说明白,写入外部存储器,然后怎么更新到内部的?
您用的是自定义的升级程序是在code区而不是BSL区是吗。在code区调用了BSL区的代码?您用的是什么型号?

出0入0汤圆

 楼主| 发表于 2013-9-4 12:04:51 | 显示全部楼层
lcofjp 发表于 2013-9-4 10:44
主要是你没太说明白,写入外部存储器,然后怎么更新到内部的?
您用的是自定义的升级程序是在code区而不是B ...

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

出0入0汤圆

发表于 2013-9-4 12:41:27 | 显示全部楼层
你的工程的具体细节我不太了解,不知道您的工程是如何编译的,是把IAP程序和APP程序放在两个工程中还是合在一个工程中。我觉得要是合在一起的话问题会小点,如果没和在一起,要注意问题就多些。

出0入0汤圆

 楼主| 发表于 2013-9-4 14:25:41 | 显示全部楼层
本帖最后由 yixuantaba 于 2013-9-4 14:54 编辑

都是在一个工程里的,一起编译的,应用程序放在2000以后,所以升级的时候只将2000以后的代码更新。这样接收用串口中断觉得合适吗?而且这个串口还要在应用程序里使用。
再请教:  430在启动之前要调用初始化变量函数:
           XCALL    #__data16_memzero   
    001112  12B0     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
////////////////------------------------

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

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

出0入0汤圆

 楼主| 发表于 2013-9-5 14:46:08 | 显示全部楼层
lcofjp 发表于 2013-9-5 12:18
用中断接收的话,问题会多一些。这样需要一个位置确定的共享缓冲区,一定要确保地址不便。如果采用查询方式 ...

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

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

发表于 2013-9-5 14:50:34 | 显示全部楼层
我上班时间比较忙,有时间的话详谈吧。

出0入0汤圆

 楼主| 发表于 2013-9-5 16:06:29 | 显示全部楼层
我再看看相关手册,一定能搞定他!

出0入0汤圆

 楼主| 发表于 2013-9-6 14:57:28 | 显示全部楼层
本帖最后由 yixuantaba 于 2013-9-6 14:59 编辑

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

出0入0汤圆

发表于 2014-10-21 17:22:20 | 显示全部楼层
楼主,你这样用是不是需要把UserApp();函数固定位置啊,不固定的话,如果下次编译完了这个函数位置变了,你Main函数里调用是不是就飞了。

出0入4汤圆

发表于 2016-12-23 20:43:29 | 显示全部楼层
正在做cc430的 IAP 。。。 感觉boot中断还是不用最好
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-4-20 12:08

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表