关于SiliconLab 8051F015单片机的在线升级浅谈
2012-09-07 22:53
183 查看
最近做了一个关于SiliconLabF015单片机的在线升级程序,现在来简单谈谈做法。
首先介绍一下编程环境:
下位机采用Keil4 + JTAG调试器
上位机采用VS2008
然后需要知道该款MCU提供了:
−256字节内部数据RAM
−2304字节内部数据RAM
−32K字节闪速存储器;可以在系统编程,扇区大小为512字节
另ISP Flash大大方便了在线升级的实现
然后列出Flash存储空间的整体规划情况:
0000H—0002H Boot入口地址 0扇区
0003H—6FFFH APP程序 0-56扇区
7000H—7C00H Boot程序 56-62扇区
7A00H—7A02H APP入口地址 61扇区
7A03H—7A05H Boot入口地址备份 61扇区
注意:0000H-0002H这三个字节存储的是Boot的复位向量,即Boot的入口地址。
本来想把Boot程序放到0000H起始的地方,但是如果待烧录的App如果采用了中断,中断向量所在位置就会与Boot区重合,而该款MCU貌似不支持中断向量的重定位,所以如此安排。
下面介绍一下下位机boot程序的编写:
1.
下位机boot实现的功能就是通过串口收发PC机传送的数据,读/写/擦除Flash,仅此而已;
2.
串口收发采用查询方式;
3.
如果想做的好一些,则可以自定义串口收发数据格式,定义出数据帧头,帧格式(例如TLV),另外可以带上校验位,可以采用校验和或CRC校验,如果要数据保密,最好加上加密,另外如果要做多机通信,也可以采用多机通信方式收发数据;
4.
地址跳转可以见如下代码:
void (*boot)(void); // 用于转向下载代码的函数指针
//…….主程序其它部分
// 执行下载的代码
boot = (void code *) 0x7A00;
boot();
另外Keil4当然也要安好了C51的库,另外也要安装SiC8051F_uVision.exe
Keil4需要配置如下:
TargetOptions->Target->Off-chip Code memory
Eprom Start:0x7000,Size:0x0C00
这里Eprom即Flash地址范围可根据自己安排填写。
这样编译出的boot程序前三个字节,即复位向量在0x0000-0x0002,而boot其余部分在0x7000-0x0C00地址范围内。
下面介绍boot程序的运行机制:
Boot通过JTAG烧入MCU,启动后,先通过复位向量跳转到boot入口点执行boot主程序。进入boot主程序后,首先把boot复位向量保存起来(可以保存到BOOT_ENTRY),等待上位机联机命令,如果3s内没有收到,则转向APP_ENTRY。否则进入boot循环,执行升级App操作。
接收数据,如果收到App部分所在地址为第一扇区,那么App的前三个字节即为App的入口地址,将其拷贝到APP_ENTRY处,然后将BOOT_ENTRY处的值替换App的前三个字节,再写入Flash,其余部分扇区则直接写入。等上位机发送执行App命令时,就跳转到APP_ENTRY处,通过APP_ENTRY再跳转到App实际的入口地址处。
最后介绍上位机程序编写要点:
1.
首先我们一般Keil生成的是HEX文件,而实际下位机装入的一般都为bin文件,所以可以自己写上位机程序在下载前先把hex文件转换为bin文件;
2.
在这里串口的收发我采用了两个线程,一个为发送线程,另一为接收线程,两个线程根据Event进行同步;
下面是Hex文件的简介:
:llaaaatt[dd...]cc
:冒号是每一条Intel HEX记录的开始
ll 是这条记录的长度域,他表示数据(dd)的字节数目.
aaaa 是地址域,他表示数据的起始地址
<如果是数据记录,这表示将要烧录的这条记录中的数据在EPROM中的偏移地址,
对于不支持扩展段地址和扩展线性地址的,如C51,这就是此条记录的起始地址>
tt 这个域表示这条HEX记录的类型,他有可能是下面这几种类型
00 ----数据记录
01 ----文件结束记录
02 ----扩展段地址记录
04 ----扩展线性地址记录
dd 是数据域,表示一个字节的数据,一个记录可能有多个数据字节,字节数目可以
查看ll域的说明
cc 是效验和域,表示记录的效验和,计算方法是将本条记录冒号开始的所有字母对
HEX文件是用ASCII来表示二进制的数值。例如一般-BIT的二进制数值x3F,用ASCII来表示就需要分别表示字符'3'
和字符'F',每个字符需要一个BYTE,所以HEX文件需要> 2倍的空间。
对一个BIN文件而言,你查看文件的大小就可以知道文件包括的数据的实际大小。而对HEX文件而言,你看到的文件
大小并不是实际的数据的大小。一是因为HEX文件是用ASCII来表示数据,二是因为HEX文件本身还包括别的附加信息
首先介绍一下编程环境:
下位机采用Keil4 + JTAG调试器
上位机采用VS2008
然后需要知道该款MCU提供了:
−256字节内部数据RAM
−2304字节内部数据RAM
−32K字节闪速存储器;可以在系统编程,扇区大小为512字节
另ISP Flash大大方便了在线升级的实现
然后列出Flash存储空间的整体规划情况:
0000H—0002H Boot入口地址 0扇区
0003H—6FFFH APP程序 0-56扇区
7000H—7C00H Boot程序 56-62扇区
7A00H—7A02H APP入口地址 61扇区
7A03H—7A05H Boot入口地址备份 61扇区
注意:0000H-0002H这三个字节存储的是Boot的复位向量,即Boot的入口地址。
本来想把Boot程序放到0000H起始的地方,但是如果待烧录的App如果采用了中断,中断向量所在位置就会与Boot区重合,而该款MCU貌似不支持中断向量的重定位,所以如此安排。
下面介绍一下下位机boot程序的编写:
1.
下位机boot实现的功能就是通过串口收发PC机传送的数据,读/写/擦除Flash,仅此而已;
2.
串口收发采用查询方式;
3.
如果想做的好一些,则可以自定义串口收发数据格式,定义出数据帧头,帧格式(例如TLV),另外可以带上校验位,可以采用校验和或CRC校验,如果要数据保密,最好加上加密,另外如果要做多机通信,也可以采用多机通信方式收发数据;
4.
地址跳转可以见如下代码:
void (*boot)(void); // 用于转向下载代码的函数指针
//…….主程序其它部分
// 执行下载的代码
boot = (void code *) 0x7A00;
boot();
另外Keil4当然也要安好了C51的库,另外也要安装SiC8051F_uVision.exe
Keil4需要配置如下:
TargetOptions->Target->Off-chip Code memory
Eprom Start:0x7000,Size:0x0C00
这里Eprom即Flash地址范围可根据自己安排填写。
这样编译出的boot程序前三个字节,即复位向量在0x0000-0x0002,而boot其余部分在0x7000-0x0C00地址范围内。
下面介绍boot程序的运行机制:
Boot通过JTAG烧入MCU,启动后,先通过复位向量跳转到boot入口点执行boot主程序。进入boot主程序后,首先把boot复位向量保存起来(可以保存到BOOT_ENTRY),等待上位机联机命令,如果3s内没有收到,则转向APP_ENTRY。否则进入boot循环,执行升级App操作。
接收数据,如果收到App部分所在地址为第一扇区,那么App的前三个字节即为App的入口地址,将其拷贝到APP_ENTRY处,然后将BOOT_ENTRY处的值替换App的前三个字节,再写入Flash,其余部分扇区则直接写入。等上位机发送执行App命令时,就跳转到APP_ENTRY处,通过APP_ENTRY再跳转到App实际的入口地址处。
最后介绍上位机程序编写要点:
1.
首先我们一般Keil生成的是HEX文件,而实际下位机装入的一般都为bin文件,所以可以自己写上位机程序在下载前先把hex文件转换为bin文件;
2.
在这里串口的收发我采用了两个线程,一个为发送线程,另一为接收线程,两个线程根据Event进行同步;
下面是Hex文件的简介:
:llaaaatt[dd...]cc
:冒号是每一条Intel HEX记录的开始
ll 是这条记录的长度域,他表示数据(dd)的字节数目.
aaaa 是地址域,他表示数据的起始地址
<如果是数据记录,这表示将要烧录的这条记录中的数据在EPROM中的偏移地址,
对于不支持扩展段地址和扩展线性地址的,如C51,这就是此条记录的起始地址>
tt 这个域表示这条HEX记录的类型,他有可能是下面这几种类型
00 ----数据记录
01 ----文件结束记录
02 ----扩展段地址记录
04 ----扩展线性地址记录
dd 是数据域,表示一个字节的数据,一个记录可能有多个数据字节,字节数目可以
查看ll域的说明
cc 是效验和域,表示记录的效验和,计算方法是将本条记录冒号开始的所有字母对
HEX文件是用ASCII来表示二进制的数值。例如一般-BIT的二进制数值x3F,用ASCII来表示就需要分别表示字符'3'
和字符'F',每个字符需要一个BYTE,所以HEX文件需要> 2倍的空间。
对一个BIN文件而言,你查看文件的大小就可以知道文件包括的数据的实际大小。而对HEX文件而言,你看到的文件
大小并不是实际的数据的大小。一是因为HEX文件是用ASCII来表示数据,二是因为HEX文件本身还包括别的附加信息
相关文章推荐
- 关于在线升级Gnome ?
- 8051单片机在线升级软件的方法
- 关于html页面在线升级问题
- 8051单片机在线升级软件的方法
- 关于Fedora Core 5.0 通过Yum在线升级说明
- 关于DSP的boot mode / boot loader /上电顺序 /在线升级等问题的总结
- 关于STM32的IAP在线升级的整理
- 浅谈关于hotpatch的在线热补丁
- 关于Mac下在线升级dbvisualizer10.0.7的坑
- 软件包管理 之 关于Fedora Core 5.0 通过Yum在线升级说明
- 关于升级ADT22后出现java.lang.ClassNotFoundException错误的解决
- 关于郭天祥单片机书上第186页AT24C02操作
- 一个关于在线时间管理工具的想法
- 中国移动关于百宝箱升级平台的最新调整
- [IDE] Silicon Lab IDE
- 关于升级swif3.0的一些东西(续)
- 关于10.11.5之后升级cocoapods时出现以下问题
- Mstar-TP在线升级总结
- 关于DAP在线调试+串口调试