430也要远程升级
这里所说的远程升级,确切的说就是通过430的串口(当然,通过其它通讯口甚至是IO也可以,串口最为方便使用而已)来实现内部程序的更新;之所以说成是“远程升级”,是因为在此基础上,可以通过RS485、CAN、无线网络或者其它远距离通讯手段实现单片机远程程序升级或者数据更新,在实际产品应用中,这是极具意义的。430系列单片机并不直接支持串口下载,那么如何更新片上程序呢?430系列单片机提供了片内FLASH的在线读写能力,可以在430的flash中划分出一个区域,内部预存一个bootloader程序,当此程序被激活时,可以通过430的串口接收数据,按指令改写片上指定地址的FLASH,这就是实现远程升级的基本思路。这种方法所占用的程序空间不大,几百个字节即可,即使在123、2132这类小资源的单片机上实现,一般也不至于影响应用程序的存储。
用这个方法进行远程程序升级存在一个缺憾,那就是bootloader程序通常不能改写,升级是不彻底的——自杀肯定是不允许的。不过对于5系的430MCU来说,得益于其大容量ram(当然是在430系列里来说)以及ram内运行程序的能力,这个问题完全可以解决。我们可以把bootloader程序调入ram,在ram中执行,这样就可以更改全部的FLASH,来个彻底的程序升级了。下面就说说在IAR中怎么实现这个操作。
首先需要修改连接配置文件(.lnk文件),完成以下3个工作:
1 将RAMCODE加入RAM段,其中RAMCODE段即是运行程序的内存段;
2 建立BOOTLOADER中代码到RAMCODE的关联,其中BOOTLOADER是FLASH中的升级程序;
3 定义BOOTLOADER段的存储位置;
程序里需要做的工作是:
1 定义段名:定义BOOTLOADER和RAMCODE段名,以便地址运算符使用
#pragma segment="BOOTLOADER"
#pragma segment="RAMCODE"
2 把所有bootloader中的函数定义到RAMCODE段,也就是在函数前添加
#pragma location="RAMCODE"
3 把flash中的升级程序导入ram,这需要一个小函数来完成
//----------------------------------------------------------------------------//
// 拷贝flash内代码至内存中 //
//----------------------------------------------------------------------------//
void copy_flash_to_RAM(void)
{
unsigned char *flash_start_ptr ; // 定义程序段指针
unsigned char *flash_end_ptr ;
unsigned char *RAM_start_ptr ;
flash_start_ptr = (unsigned char *)__segment_begin("BOOTLOADER") ; // 初始化端起止地址
flash_end_ptr = (unsigned char *)__segment_end("BOOTLOADER") ;
RAM_start_ptr = (unsigned char *)__segment_begin("RAMCODE") ;
unsigned long function_size =(unsigned long)(flash_end_ptr)
- (unsigned long)(flash_start_ptr) ; // 计算函数大小
memcpy(RAM_start_ptr,flash_start_ptr,function_size) ; // 拷贝程序
}
以上已经为实现430单片机的远程程序升级打好了全部基础,剩下诸如串口通信、flash擦写就不必罗嗦了。5系的16K ram还是蛮管用的,甚至做个升级界面也绰绰有余。
http://cache.amobbs.com/bbs_upload782111/files_45/ourdev_672207PQ0978.jpg
(原文件名:升级.jpg)
至于一些细节问题,比如设置升级口令、通讯加密与校验等等,也都是必要的,注意一下就行了。
附件里是升级所需的配置文件。
点击此处下载 ourdev_672208HHAAEA.rar(文件大小:1K) (原文件名:lnk430F5438update.rar) 强帖,这个人要顶一下 好东西,顺便请教一下楼主,用5系的430单片机驱动分辨率为176*220的液晶屏进行动态显示一些波形,不知道在速度和资源上面能否胜任呢? mark mark mark 这个牛! mark! 430远程升级,mark! mark mark,正需要。 mark 真不错。 回复【2楼】voval
-----------------------------------------------------------------------
我觉得10KHz级别的波形,完全可以胜任 mark 汗。。。。准备个带bootloader的固件就可以全写了。 这个有用 我手头有大量的430的F5438单片机的设备,都在现场运行。目前急需这个功能,期望楼主能出差一趟(天津),帮助我搞定我目前产品的远程升级,看到后请联系我 。QQ:414804689。电话:13752025039 恩,关键的不同就是把升级程序放入RAM中运行!!! 支持下 这个在一些场合很有用,本人就见过类似的应用 太利害了,不顶不行啊。。。。 Thanks a lot!! 23楼看来有高见,不过都没把东西贴出来,还是支持楼主!谢谢 学习了顶一个 楼主几篇文章都不错啊。 强烈关注 感谢楼主分享{:handshake:} 不错...很实用...MARK一下 不错的说,应该试一试。。。 感谢楼主分享 本帖最后由 coolsir 于 2013-10-3 12:07 编辑
感觉楼主的方法还是有点繁琐,我现在采用的还是现在很多资料上说的,BOOTLOADER和应用程序分开,先下载BOOTLOADER 然后通过BOOTLOADER 升级应用程序,至于BOOTLOADER 的升级 则完全可以在应用程序里面升级。难度没有 只是需要定义好中断向量的转移即可了。还有就是下载的时候暂存也是一个问题,对于程序比较大的时候不可能一下子先暂存到内部RAM里面 ,就需要直接在线写进FLASH 这就需要串口发送程序需要有发送多少字节延时发送的功能。 谢谢分享。 也说下我的430升级,芯片是149,我是把bootloader也放在程序应用区一起的,只要把flash分成上下2个区,轮流操作即可,当然,每次升级都要擦写中断向量表,来完成中断向量的切换 好厉害的东西 帮顶 楼主的帖子 都很精彩... msp430远程升级,mark, 呵呵!正在看相关的资料,谢谢! 收藏下,有空试下 以前在维护POS终端时就是这样做的:
首先在PC上准备待下载的固件;
然后用网线连接终端和PC;
待PC进度跑到逗,出现OK则可拔掉网线。 藏龙卧虎,受益匪浅 谢谢分享,正是需要的。 好帖 {:smile:} 这个办法也不错! mark............... 430现在也这么牛了 强帖收藏,谢谢楼主、。 学习了 ,必须收藏 多谢多谢
页:
[1]