|
这里所说的远程升级,确切的说就是通过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还是蛮管用的,甚至做个升级界面也绰绰有余。
(原文件名:升级.jpg)
至于一些细节问题,比如设置升级口令、通讯加密与校验等等,也都是必要的,注意一下就行了。
附件里是升级所需的配置文件。
点击此处下载 ourdev_672208HHAAEA.rar(文件大小:1K) (原文件名:lnk430F5438update.rar) |
阿莫论坛20周年了!感谢大家的支持与爱护!!
你熬了10碗粥,别人一桶水倒进去,淘走90碗,剩下10碗给你,你看似没亏,其实你那10碗已经没有之前的裹腹了,人家的一桶水换90碗,继续卖。说白了,通货膨胀就是,你的钱是挣来的,他的钱是印来的,掺和在一起,你的钱就贬值了。
|