您的位置:首页 > 其它

关于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文件本身还包括别的附加信息
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: