新闻  |   论坛  |   博客  |   在线研讨会
C8051单片机BootLoader心得
0750long | 2009-07-10 10:03:36    阅读:3855   发布文章

C8051单片机BootLoader心得

       8051至今仍占据着MCU的大量市场,以其通用、价格低廉等众多原因而被学校和大多公司作为微控制开发的首选。随着ARM等32位控制器的出现,使得8051的追随者对于其使用编程器烧片子的方式逐渐的难以接受。不论是从易用性、以及程序的可靠性来说,都添加了诸多不便。

       此时很多人想到了ARM中常用的BootLoader得概念,其实这是一个很好的方法。要想在MCU中实现BootLoader,首先要求单片机具有IAP功能,或是可以对其自身的FLASH进行擦除、写入的功能。其次要考虑FLASH的空间,毕竟加入一个boot的代码是需要付出代价的。

       下面以C8051F340为例说明一下我的心得与体会。

1. 整体规划

分区

作用

说明

中断向量区

中断向量保存

1.1

APP区

应用程序区

1.2

BOOT区

BootLoader代码存放区

1.3

1.1中断向量区

       中断向量区提供复位以及异常中断的跳转, 鉴于51的特点,这部分必须存放在0地址开始的区域。

1.2 APP区

       应用程序区存放用户应用程序,亦即boot操作区。这部分可以存放在FLASH的任意区域。下载程序时,bootloader需要将下载的数据写入该区。正常启动时,bootloader需要让CPU跳转至此执行。

1.3 BOOT区

       BootLaoder代码存放区。这部分可以存放在FLASH的任意区域。 

2. 实现方法

地址

作用

说明

0000H -- 0002H

Boot入口地址

2.1

0003H -- D_APP_LIMIT

APP程序

2.2

D_RUN_ADDRESS

APP入口地址

2.3

D_BOOT_ADDR

Boot程序

2.4

2.1 Boot入口地址

       8051上电后执行的第一条便是0x0000—0x0002处的指令,考虑到程序的通用性,此处必须跳转到Boot 程序区,以便从boot开始引导或是装入程序。

STARTUP.A51文件中:

CSEG    AT      0

?C_STARTUP:       LJMP    STARTUP1

这两条语句便是实现了程序的跳转。

?C_STARTUP的地址是链接时确定的,但是必须要在Boot程序区。关于制定Boot区的位置请参考2.3。

2.2 APP程序

应用程序区必须放在0地址开始的分区!由于8051的局限性,他基本不能像其他系统一样可以将代码拷贝到RAM中,之后重建中断向量表执行。

为了中断向量表的跳转方便,介意将应用程序烧写到0地址开始的分区,但是要注意:应用程序的前三个字节要写到D_RUN_ADDRESS指向的APP入口地址(见2.3)。

// APP入口地址写入

       for (i=0; i<3; i++) {      

              flash_write(D_RUN_ADDRESS+i, dat);

       }

       // 程序区

       for (i=3; i<size; i++) {

              flash_write(i++, dat);

       }

2.3 APP入口地址

       Boot下载程序后,前三个字节为APP的入口地址,Boot启动时APP,就是跳转到这个地址的。

       我的实现中,将此三个字节放到了一个独立的分区,这样方便操作,但是有点浪费。呵呵!

// APP入口地址写入

       for (i=0; i<3; i++) {      

              flash_write(D_RUN_ADDRESS+i, dat);

       } 

Boot启动过程中,其实就是实现了跳转:

       Reset(0x0000) à D_BOOT_ADDR  (Boot正常启动)à D_RUN_ADDRESS (APP运行)

                                                    (Boot下载程序)à进入Loader模式

       这样在程序每次启动中,总是先执行Boot代码,是其具有通用性。

2.4 Boot程序

       此处为Boot程序区,在此我采用检测IO的方法,这样不像检测终端输入那样存在等待时间的问题。软件的下载采用串口。具体步骤如下:

第一步,MCU复位后,从0地址跳转到BOOT区。

       第二步:Boot代码检测是否存在Loader使能按键,若不存在直接跳转到第四步。

第三步:与用户进行软件握手,握手成功后按照如下步骤操作:

1.       暂存boot入口地址(第0扇区的前三哥字节),这样在擦除第0扇区后可以回写。

2.       准备扇区,擦除APP程序扇区和APP入口地址扇区。

3.       回写boot入口地址(1中读出的三个字节)。

4.       通知主机发送代码,我使用DNW发送,数据格式为:4Byte(数据长度)+数据+2Byte(校验和)

5.       读接收数据长度,4Byte。

6.       开始接收数据, 同时写入Flash APP区。此时注意FLASH写入时间和串口速度的匹配。一般来说115200的速度足够了。

这部分数据分为两部分:接收到的前三个字节为APP的入口地址,需要单独保存。

7.       读校验和,校验数据。

这样在线编程完毕。

       第四步:读取APP入口地址处是否存在有效指令(一般判断是否为0x02),不存在则等待用户复位!

3. 结语

       BootLoader作为程序的主体,需要考虑代码的链接位置以及代码量的大小,我们可以用如下方法在KEIL中控制CODE的位置,

*博客内容为网友个人发布,仅代表博主个人观点,如有侵权请联系工作人员删除。

参与讨论
登录后参与讨论
推荐文章
最近访客