OpenEdv-开源电子网

 找回密码
 立即注册

扫一扫,访问微社区

正点原子新作:阿波罗STM32F767&F429&探索者STM32F4开发板&赶快来下载资料哦。

查看: 2423|回复: 17

430远程更新的问题请教

[复制链接]

  离线 

32

主题

110

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
328
金钱
328
注册时间
2014-2-24
在线时间
31 小时
发表于 2015-5-27 16:17:32 | 显示全部楼层 |阅读模式
5金钱
最近在做这个远程更新的实验,资料也从网上找了一大堆,下面上传文档,文档里面还有程序的下载地址,但是这个没实验成功,不知道哪位大神做过这块,给指导下.
还有就是我感觉这个文档里面有好多地方说的有些模糊

MSP430单片机实现远程升级.pdf

277.47 KB, 下载次数: 743

最佳答案

查看完整内容[请看2#楼]

这个不难,思路就是把你的更新程序强制编译到固定地址空间,主程序判断条件进入更新程序后,更新程序擦除主程序区,然后外部接收要更新的代码往里写就行了,当然,更新程序所在空间是不能擦除的。 如果考虑更新过程中更新失败的情况,那你就要了解430的启动过程,在进入更新程序的时候,先将要复位要执行的指令写到中断向量区,如果更新不成功,那么每次上电让它强制进你的更新程序,知道更新完毕。 你需要了解的有启动过程、中断 ...
回复

使用道具 举报

  离线 

11

主题

338

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
445
金钱
445
注册时间
2013-6-15
在线时间
13 小时
发表于 2015-5-27 16:17:33 | 显示全部楼层
这个不难,思路就是把你的更新程序强制编译到固定地址空间,主程序判断条件进入更新程序后,更新程序擦除主程序区,然后外部接收要更新的代码往里写就行了,当然,更新程序所在空间是不能擦除的。
如果考虑更新过程中更新失败的情况,那你就要了解430的启动过程,在进入更新程序的时候,先将要复位要执行的指令写到中断向量区,如果更新不成功,那么每次上电让它强制进你的更新程序,知道更新完毕。
你需要了解的有启动过程、中断向量等。给你三句关键程序,结合启动过程好好研究研究吧
*(int *)0xFFFE=0xFFD0;//430复位去0XFFFE取指令,这地址值是多少就跳到多少地址执行下一条指令,即复位后去0XFFFD取指令
 *(long *)0xFFD0=0x0A004031;//mov.w  #0A00,SP;//在下一条指令的地方写入要执行的指令,这是固定的,执行完后地址偏移4继续执行
 *(long *)0xFFD4=0x117c12B0;//这句的意思就是第三条指令要调用更新程序了,117c就是更新程序的主函数所在的地址,12B0是调用函数指令
下面就开始IAP吧......
这样即使更新过程断了,下次上电还是会进入更新程序的直到更新完毕,细节地方自行研究
回复

使用道具 举报

  离线 

11

主题

338

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
445
金钱
445
注册时间
2013-6-15
在线时间
13 小时
发表于 2015-5-27 16:17:33 | 显示全部楼层
回复【6楼】疯子韩:
---------------------------------
这个用到代码的绝对定位,B程序写成一个.C文件,这个文件里每个函数定义的后面都加上@"UPDATECODE",这个UPDATECODE是自己定义的,在149的xcl文件里改,xcl文件在IAR的安装目录里找,在里面找到这一段
//  Code
-Z(CONST)UPDATECODE=1100-1FFF
-Z(CODE)CSTART=2000-FFDF
-Z(CODE)CODE=2000-FFDF


// Constant data

-Z(CONST)DATA16_C,DATA16_ID,DIFUNCT,CHECKSUM=2000-FFDF
你找到你的xcl文件对比一下不同就知道了。
这样A和B编译完之后,B就在UPDATECODE里了,关于代码的绝对定位网上能找到资料,我的IAR是3.4版本的,可以这样做。5以上的版本好像还需要改设置什么的,具体的记不清了,查查资料吧。
然后就是C怎么写到程序区,其实吧TXT文件打开,里面的数据都是和flash地址从前往后对应的,比如里面有@2000开头,那么下面的代码数据就是从flash的2000地址开始写直到写完。最后的是中断向量表,比如@ffd0,那么就把下面的数据从ffd0开始写。中断向量表是flash的最后32个字还是字节来着忘了。
你需要把这个txt文件进行整理,去掉B的代码,总之就是要保证程序区一个地址对应txt里一个字节数据就行了。我的这个工作是用自己写的软件处理的(公司的东西就不方便发了)至于串口怎么接受,进了更新,主程序和中断向量被擦了,串口中断肯定是不能用了,就用查询方式。我是开了个515字节的缓存,一次串口发送512个字节+3个校验和(因为430flash一段是512字节,只能按段擦除),加上校验,校验正确了就把512字节写进flash里,然后通知软件发送下一个512字节。依次类推直到写完。当然这个用什么方法写无所谓,只要能保证写进去而且写对了就可以了。
可能我也表述不清楚,你也别想太复杂,简单点就是想办法把txt文件里的数据写到对应的地址里就行了,写对了就更新完成了
回复

使用道具 举报

  离线 

11

主题

338

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
445
金钱
445
注册时间
2013-6-15
在线时间
13 小时
发表于 2015-5-27 16:17:33 | 显示全部楼层
    不要看那个了,看我这个把,给你一个串口更新的程序,注意这个是1611芯片的,flash大小和地址跟149不一样,注意一下就行,看我这个的流程就行,细节还有什么宏定义可以不必在意,这个流程就是,调用RTU_Update_Usart后,初始化相关硬件,先擦掉中断向量表,把更新程序的地址写进去,前面说过了。然后串口发送ready,这时候就可以通过串口发送更新文件了,更新文件是经过处理的,你不能直接用txt,这个自己处理吧,然后就是接收一个字节就写一个字节,最后一起校验,我这用的CRC校验,这个自己定,最后校验完了,再把最后的中断向量写进去,如果校验不通过,那么重启,再一次更新。这个东西本身不难,你要完全明白原理,知道430启动流程,跟着启动流程一步步走,比如默认启动后去找main函数,那么完全可以在这地方让他默认去找你的更新函数,这就得了解中断向量表了,你可以简单点,进了更新程序,用串口随便发几个数,用更新程序写到某个地址,这个会了,那么把这个随便的几个数,换成程序代码不是一样的原理吗。好好研究下这些东西吧,都懂了你对单片机硬件原理是理解能有很大提升,如果不懂,看了别人的代码也驾驭不了,换个芯片就废了,这东西毕竟不是通用的,但是原理是通用的。
    另外好像TI官方也有430的IAP程序,我没研究过也没用过,你可以找找资料看看。

Update.c

14.64 KB, 下载次数: 277

回复

使用道具 举报

  在线 

482

主题

8万

帖子

30

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
117171
金钱
117171
注册时间
2010-12-1
在线时间
899 小时
发表于 2015-5-27 22:47:01 | 显示全部楼层
没搞过,帮顶。。。。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
微信公众平台:正点原子   点击扫码添加
回复

使用道具 举报

  离线 

32

主题

110

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
328
金钱
328
注册时间
2014-2-24
在线时间
31 小时
 楼主| 发表于 2015-5-28 17:24:35 | 显示全部楼层
回复【3楼】as564335sa:
---------------------------------
比较愚钝,您看我理解的对吗,现在我板子上有程序A,然后再把更新程序B下载到固定地址,这个板子不接收更新程序C时,就正常运行,接收后就运行程序C,而擦除A.至此更新完毕.
回复

使用道具 举报

  离线 

11

主题

338

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
445
金钱
445
注册时间
2013-6-15
在线时间
13 小时
发表于 2015-5-28 19:52:51 | 显示全部楼层
不是的,是这样的,要更新的肯定是一段代码吧,就是用IAR生产的TXT文件,这个文件你要处理好主程序区的代码和中断向量表,并去掉更新程序部分代码,进入更新后用更新程序B擦除A,然后将要更新的代码写到原来A的地方就行了,只要中断向量表没错,写完重启就会运行已经更新好的程序了。你可以用IAR仿真,然后看看flash区,main函数以后的代码,在flash中的数据,所谓的更新就是更新这个数据,也就是机器码,IAR生成的TXT就是机器码
回复

使用道具 举报

  离线 

32

主题

110

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
328
金钱
328
注册时间
2014-2-24
在线时间
31 小时
 楼主| 发表于 2015-5-30 10:25:31 | 显示全部楼层
回复【3楼】as564335sa:
---------------------------------
再看第一次的回复,似乎理解了,老程序A 更新程序B 都已经烧进板子,一切运行正常,在老程序A中判断进入更新程序后,B就把A擦除,而把要更新的C写入,重启即完成更新,

问题:A和B怎么一块下载到板子的?C程序通过串口接收怎么存储
回复

使用道具 举报

  离线 

32

主题

110

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
328
金钱
328
注册时间
2014-2-24
在线时间
31 小时
 楼主| 发表于 2015-5-30 11:21:17 | 显示全部楼层
回复【7楼】as564335sa:
---------------------------------
把下面这两处改成您上面写的
 // -------------------------------------
// Constant data
//

-Z(CONST)DATA16_C,DATA16_ID,DIFUNCT,CHECKSUM=1100-FFDF


// -------------------------------------
// Code
//

-Z(CODE)CSTART,ISR_CODE,CODE_ID=1100-FFDF
-P(CODE)CODE=1100-FFDF

我回复的太慢了,您都离线了,呵呵
您都说的差不多了,剩下的东西我再自己弄,希望尽快弄出来谢谢您啊

我在网上找了一个代码,一会贴上来您看看,里面的是汇编,不过他是两个工程,不知道怎么用
回复

使用道具 举报

  离线 

32

主题

110

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
328
金钱
328
注册时间
2014-2-24
在线时间
31 小时
 楼主| 发表于 2015-5-30 11:22:03 | 显示全部楼层
代码

flash_monitor.s43

25.59 KB, 下载次数: 435

回复

使用道具 举报

  离线 

32

主题

110

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
328
金钱
328
注册时间
2014-2-24
在线时间
31 小时
 楼主| 发表于 2015-5-30 11:25:21 | 显示全部楼层
代码 

monitor_demo_app.c

3.4 KB, 下载次数: 523

回复

使用道具 举报

  离线 

32

主题

110

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
328
金钱
328
注册时间
2014-2-24
在线时间
31 小时
 楼主| 发表于 2015-5-30 16:49:45 | 显示全部楼层
回复【11楼】as564335sa:
---------------------------------
感谢啊,研究研究,
回复

使用道具 举报

  离线 

32

主题

110

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
328
金钱
328
注册时间
2014-2-24
在线时间
31 小时
 楼主| 发表于 2015-6-1 10:08:08 | 显示全部楼层
回复【11楼】as564335sa:
---------------------------------
这几个头文件都是什么呢
#include "h\portini.h" 
#include "h\update.h"
#include <update.h>
回复

使用道具 举报

  离线 

11

主题

338

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
445
金钱
445
注册时间
2013-6-15
在线时间
13 小时
发表于 2015-6-1 10:15:13 | 显示全部楼层
回复【13楼】疯子韩:
---------------------------------
不要在意这些,这个C文件里的东西都是独立的,跟外部没有任何关系。那头文件无非就是写端口定义什么的,你要是写IAP程序也要注意一定要独立,不可使用外部的任何东西,否则进了更新代码一擦就死了
回复

使用道具 举报

  离线 

32

主题

110

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
328
金钱
328
注册时间
2014-2-24
在线时间
31 小时
 楼主| 发表于 2015-6-1 10:22:30 | 显示全部楼层
回复【14楼】as564335sa:
---------------------------------
我照着您上面给的那个代码   在149的xcl文件里改了之后编译出现错误
这是错误提示
Fatal Error[e72]: Segment CODE_ID must be defined in a segment definition option (-Z, -b or -P) C:\Program Files\IAR Systems\Embedded Workbench 6.0 Evaluation\430\CONFIG\lnk430F149.xcl 114 

回复

使用道具 举报

  离线 

32

主题

110

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
328
金钱
328
注册时间
2014-2-24
在线时间
31 小时
 楼主| 发表于 2015-7-31 15:02:24 | 显示全部楼层
回复【11楼】as564335sa:
--------------------------------
终于自己成功升级了一个小程序,感谢
回复

使用道具 举报

  离线 

11

主题

338

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
445
金钱
445
注册时间
2013-6-15
在线时间
13 小时
发表于 2015-8-2 20:08:21 | 显示全部楼层
回复【16楼】疯子韩:
---------------------------------
恭喜
回复

使用道具 举报

  离线 

0

主题

1

帖子

0

精华

新手上路

Rank: 1

积分
15
金钱
15
注册时间
2017-11-7
在线时间
0 小时
发表于 2017-11-7 09:08:39 | 显示全部楼层

最近也在做430远程升级,学习学习!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则




QQ|联系我们|手机版|官方淘宝店|新浪微博|微信公众平台|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2017-11-21 01:08

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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