OpenEdv-开源电子网

标题: 430远程更新的问题请教 [打印本页]

作者: 疯子韩    时间: 2015-5-27 16:17
标题: 430远程更新的问题请教
最近在做这个远程更新的实验,资料也从网上找了一大堆,下面上传文档,文档里面还有程序的下载地址,但是这个没实验成功,不知道哪位大神做过这块,给指导下.
还有就是我感觉这个文档里面有好多地方说的有些模糊
作者: as564335sa    时间: 2015-5-27 16:17
这个不难,思路就是把你的更新程序强制编译到固定地址空间,主程序判断条件进入更新程序后,更新程序擦除主程序区,然后外部接收要更新的代码往里写就行了,当然,更新程序所在空间是不能擦除的。
如果考虑更新过程中更新失败的情况,那你就要了解430的启动过程,在进入更新程序的时候,先将要复位要执行的指令写到中断向量区,如果更新不成功,那么每次上电让它强制进你的更新程序,知道更新完毕。
你需要了解的有启动过程、中断向量等。给你三句关键程序,结合启动过程好好研究研究吧
*(int *)0xFFFE=0xFFD0;//430复位去0XFFFE取指令,这地址值是多少就跳到多少地址执行下一条指令,即复位后去0XFFFD取指令
 *(long *)0xFFD0=0x0A004031;//mov.w  #0A00,SP;//在下一条指令的地方写入要执行的指令,这是固定的,执行完后地址偏移4继续执行
 *(long *)0xFFD4=0x117c12B0;//这句的意思就是第三条指令要调用更新程序了,117c就是更新程序的主函数所在的地址,12B0是调用函数指令
下面就开始IAP吧......
这样即使更新过程断了,下次上电还是会进入更新程序的直到更新完毕,细节地方自行研究
作者: as564335sa    时间: 2015-5-27 16:17
回复【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文件里的数据写到对应的地址里就行了,写对了就更新完成了
作者: as564335sa    时间: 2015-5-27 16:17
    不要看那个了,看我这个把,给你一个串口更新的程序,注意这个是1611芯片的,flash大小和地址跟149不一样,注意一下就行,看我这个的流程就行,细节还有什么宏定义可以不必在意,这个流程就是,调用RTU_Update_Usart后,初始化相关硬件,先擦掉中断向量表,把更新程序的地址写进去,前面说过了。然后串口发送ready,这时候就可以通过串口发送更新文件了,更新文件是经过处理的,你不能直接用txt,这个自己处理吧,然后就是接收一个字节就写一个字节,最后一起校验,我这用的CRC校验,这个自己定,最后校验完了,再把最后的中断向量写进去,如果校验不通过,那么重启,再一次更新。这个东西本身不难,你要完全明白原理,知道430启动流程,跟着启动流程一步步走,比如默认启动后去找main函数,那么完全可以在这地方让他默认去找你的更新函数,这就得了解中断向量表了,你可以简单点,进了更新程序,用串口随便发几个数,用更新程序写到某个地址,这个会了,那么把这个随便的几个数,换成程序代码不是一样的原理吗。好好研究下这些东西吧,都懂了你对单片机硬件原理是理解能有很大提升,如果不懂,看了别人的代码也驾驭不了,换个芯片就废了,这东西毕竟不是通用的,但是原理是通用的。
    另外好像TI官方也有430的IAP程序,我没研究过也没用过,你可以找找资料看看。
作者: 正点原子    时间: 2015-5-27 22:47
没搞过,帮顶。。。。
作者: 疯子韩    时间: 2015-5-28 17:24
回复【3楼】as564335sa:
---------------------------------
比较愚钝,您看我理解的对吗,现在我板子上有程序A,然后再把更新程序B下载到固定地址,这个板子不接收更新程序C时,就正常运行,接收后就运行程序C,而擦除A.至此更新完毕.
作者: as564335sa    时间: 2015-5-28 19:52
不是的,是这样的,要更新的肯定是一段代码吧,就是用IAR生产的TXT文件,这个文件你要处理好主程序区的代码和中断向量表,并去掉更新程序部分代码,进入更新后用更新程序B擦除A,然后将要更新的代码写到原来A的地方就行了,只要中断向量表没错,写完重启就会运行已经更新好的程序了。你可以用IAR仿真,然后看看flash区,main函数以后的代码,在flash中的数据,所谓的更新就是更新这个数据,也就是机器码,IAR生成的TXT就是机器码
作者: 疯子韩    时间: 2015-5-30 10:25
回复【3楼】as564335sa:
---------------------------------
再看第一次的回复,似乎理解了,老程序A 更新程序B 都已经烧进板子,一切运行正常,在老程序A中判断进入更新程序后,B就把A擦除,而把要更新的C写入,重启即完成更新,

问题:A和B怎么一块下载到板子的?C程序通过串口接收怎么存储
作者: 疯子韩    时间: 2015-5-30 11:21
回复【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

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

我在网上找了一个代码,一会贴上来您看看,里面的是汇编,不过他是两个工程,不知道怎么用
作者: 疯子韩    时间: 2015-5-30 11:22
代码
作者: 疯子韩    时间: 2015-5-30 11:25
代码 
作者: 疯子韩    时间: 2015-5-30 16:49
回复【11楼】as564335sa:
---------------------------------
感谢啊,研究研究,
作者: 疯子韩    时间: 2015-6-1 10:08
回复【11楼】as564335sa:
---------------------------------
这几个头文件都是什么呢
#include "h\portini.h" 
#include "h\update.h"
#include <update.h>
作者: as564335sa    时间: 2015-6-1 10:15
回复【13楼】疯子韩:
---------------------------------
不要在意这些,这个C文件里的东西都是独立的,跟外部没有任何关系。那头文件无非就是写端口定义什么的,你要是写IAP程序也要注意一定要独立,不可使用外部的任何东西,否则进了更新代码一擦就死了
作者: 疯子韩    时间: 2015-6-1 10:22
回复【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 


作者: 疯子韩    时间: 2015-7-31 15:02
回复【11楼】as564335sa:
--------------------------------
终于自己成功升级了一个小程序,感谢
作者: as564335sa    时间: 2015-8-2 20:08
回复【16楼】疯子韩:
---------------------------------
恭喜
作者: 37401    时间: 2017-11-7 09:08

最近也在做430远程升级,学习学习!
作者: 季磊    时间: 2018-2-1 09:43
疯子大哥,能不能把你升级的程序发我一个啊,邮箱:623981824@qq.com,感激不尽
作者: 疯子韩    时间: 2018-2-23 10:00
季磊 发表于 2018-2-1 09:43
疯子大哥,能不能把你升级的程序发我一个啊,邮箱:,感激不尽

4楼的Update.c就是了
作者: 季磊    时间: 2018-4-18 14:32
疯子韩 发表于 2018-2-23 10:00
4楼的Update.c就是了

谢谢,我试试,如果有问题再问您,谢谢。
作者: ssssssssssss    时间: 2018-7-19 08:58
季磊 发表于 2018-4-18 14:32
谢谢,我试试,如果有问题再问您,谢谢。

成功了吗?
作者: ssssssssssss    时间: 2018-7-19 15:49
疯子韩 发表于 2018-2-23 10:00
4楼的Update.c就是了

几个关键点还是不是很懂啊   中断向量表的映射是哪段?




欢迎光临 OpenEdv-开源电子网 (http://www.openedv.com/) Powered by Discuz! X3.4