关于SiliconLab 8051F015单片机的在线升级浅谈

最近做了一个关于SiliconLabF015单片机的在线升级程序,现在来简单谈谈做法。

首先介绍一下编程环境:

下位机采用Keil4 + JTAG调试器

上位机采用VS2008

 

然后需要知道该款MCU提供了:

256字节内部数据RAM

2304字节内部数据RAM

32K字节闪速存储器;可以在系统编程,扇区大小为512字节

另ISP Flash大大方便了在线升级的实现

 

然后列出Flash存储空间的整体规划情况:

0000H0002H    Boot入口地址        0扇区

0003H6FFFH    APP程序             0-56扇区

7000H7C00H    Boot程序            56-62扇区

7A00H7A02H    APP入口地址         61扇区

7A03H7A05H    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文件本身还包括别的附加信息

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值