430远程更新实验失败

2019-07-15 15:08发布

最近在做这个远程更新的实验,资料也从网上找了一大堆,下面上传文档,文档里面还有程序的下载地址,但是这个没实验成功,不知道哪位大神做过这块,给指导下.
还有就是我感觉这个文档里面有好多地方说的有些模糊 MSP430单片机实现远程升级.pdf (277.47 KB )
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
19条回答
后天天后
1楼-- · 2019-07-15 16:10
这个不难,思路就是把你的更新程序强制编译到固定地址空间,主程序判断条件进入更新程序后,更新程序擦除主程序区,然后外部接收要更新的代码往里写就行了,当然,更新程序所在空间是不能擦除的。
如果考虑更新过程中更新失败的情况,那你就要了解430的启动过程,在进入更新程序的时候,先将要复位要执行的指令写到中断向量区,如果更新不成功,那么每次上电让它强制进你的更新程序,知道更新完毕。
你需要了解的有启动过程、中断向量等。给你三句关键程序,结合启动过程好好研究研究吧
*(int *)0xFFFE=0xFFD0;//430复位去0XFFFE取指令,这地址值是多少就跳到多少地址执行下一条指令,即复位后去0XFFFD取指令
 *(long *)0xFFD0=0x0A004031;//mov.w  #0A00,SP;//在下一条指令的地方写入要执行的指令,这是固定的,执行完后地址偏移4继续执行
 *(long *)0xFFD4=0x117c12B0;//这句的意思就是第三条指令要调用更新程序了,117c就是更新程序的主函数所在的地址,12B0是调用函数指令
下面就开始IAP吧......
这样即使更新过程断了,下次上电还是会进入更新程序的直到更新完毕,细节地方自行研究
cz0519博睿康
2楼-- · 2019-07-15 17:50
这个用到代码的绝对定位,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文件里的数据写到对应的地址里就行了,写对了就更新完成了
男友力MAX
3楼-- · 2019-07-15 19:43
 精彩回答 2  元偷偷看……
60user96
4楼-- · 2019-07-15 23:48
没搞过,帮顶。。。。
宋小辉1
5楼-- · 2019-07-16 05:35
比较愚钝,您看我理解的对吗,现在我板子上有程序A,然后再把更新程序B下载到固定地址,这个板子不接收更新程序C时,就正常运行,接收后就运行程序C,而擦除A.至此更新完毕.
wmc55555
6楼-- · 2019-07-16 07:45
不是的,是这样的,要更新的肯定是一段代码吧,就是用IAR生产的TXT文件,这个文件你要处理好主程序区的代码和中断向量表,并去掉更新程序部分代码,进入更新后用更新程序B擦除A,然后将要更新的代码写到原来A的地方就行了,只要中断向量表没错,写完重启就会运行已经更新好的程序了。你可以用IAR仿真,然后看看flash区,main函数以后的代码,在flash中的数据,所谓的更新就是更新这个数据,也就是机器码,IAR生成的TXT就是机器码

一周热门 更多>