C8051F410单片机BootLoader的实现

发布者:朱雀最新更新时间:2014-08-13 来源: 21ic关键字:C8051F410  单片机  BootLoader 手机看文章 扫描二维码
随时随地手机看文章

BootLoader就是单片机在复位后首先执行的一小段引导程序,通过此段程序可以实现硬件初始化、进行“用户程序”更新等功能,本文主要讨论的是通过BootLoader对“用户程序”进行动态更新。

在使用单片机进行产品开发及使用过程中,不可避免的存在更新程序的问题,正常的程序下载是通过单片机仿真器与单片机的特殊I/O口连接来实现。在产品的开发阶段,通过仿真器可以实现程序下载及调试。产品开发完成后,由于单片机已被封装在产品内部,若要进行更新则需要重新打开产品外壳,连接数据线。这对已经批量生产甚至产品已经在最终用户手中的情况下几乎是不可能的,一方面由于这样做效率很低、成本高,另一方面也使用户对产品的整体性能带来很大的负面影响。

1 Flash操作及程序存储区结构功能划分

1.1 Flash基本操作和存储结构

C8051F410对Flash只支持0操作,故在写入数据前首先应擦除扇区(擦除只能整页操作,操作完成后每一位都为1)。软件写和擦除FLASH受FLASH锁定和关键码功能的保护。在进行FLASH操作之前,必须按顺序向FLASH锁定和关键码寄存器(FLKEY)写入关键码:0xA5,0xF1。写关键码的时序并不重要,但必须按顺序写。

要实现BootLoader首先要了解存储程序的Flash结构,如表1。C8051F410共有32kFlash程序存储器,该存储器以512为一个扇区(页),可以在系统内部编程操作(IAP)。这就给实现BootLoader功能提供了充要前提条件。

C8051F410单片机BootLoader的实现

1.2 存储区的功能划分

BootLoader程序和“用户程序”分别存储于Flash不同区域内,在本文中做如下划分:BootLader程序占用地址0x6000~0x7FFF,其中页0x7C00来保存用户程序的入口地址,这样真正的BootLoader的程序大小就不能超过7 k(0x6000~0x7A00)。“用户程序”占用地址0x0000~0x5FFF,这样对“用户程序”的编写除大小不能超过24 k外就没有其他特殊要求。

C8051F410单片机BootLoader的实现

1.3 定位BootLoader的存储位置

使用Keil软件在程序开发时很容易实现程序的定位,这里介绍一种操作最为简便的方法,在BootLoader工程的设置窗口的BL51 Locate面板内输入程序的地址范围即可,如下图示。

C8051F410单片机BootLoader的实现

2 BootLoader程序工作流程描述

2.1 关键过程描述

上电复位:复位后单片机首先执行地址0x0000处的跳转指令跳转到BootLoader程序的入口地址并进行诸如关闭看门狗、晶振频率、UART串口波特率设置等操作,为了使程序更新速度更快,本应用中系统时钟频率设置一个较大的通讯波特率为115200bps。

升级握手:根据预先定义的握手规则,通过URAT与上位机(一般是计算机)进行一些数据交换,收到正确回复后即认为握手成功,并通过串口发送准备好接收数据的指示,若不成功则进行用户程序的跳转操作。

用户程序判断:若存在则立即跳转到用户程序入口地址(这也是最为普通的正常启动过程)。

跳转到用户程序入口:BootLoader任务完成,将单片机的控制权交由用户程序接管直到下次复位才能重新进入BootLoader。

接收数据:在BootLoadler内没有使用中断函数,从而减少了对中断向量的重新映射操作,也增加了程序的稳定性,这里采用查询的方式实现数据接收。

指令类型分析:由上位机传来的数据帧有多个功能,协议由BootLoader的开发人员自行规定,主要包括的指令类型有:写入数据、读取数据并上传、结束数据传输过程。

发送“xxxx”提示:通过UART向上位机发送一些操作结果信息反馈给上位机,如“操作成功”、“操作失败”等,以告知上位机如何继续进行下步操作。

2.2 BootLoader流程图

C8051F410单片机BootLoader的实现

3 关键操作的程序处理

数据接收:BootLoader程序中不要使用中断函数,使用后会导致“用户程序”的相同中断处理函数失效,所以这里使用查询的方式实现UART串口数据接收。

BootLoader程序入口地址的保存:单片机复位后总是从Flash存储区的0x0000地址处开始执行,这里占用3个字节保存了一条跳转指令,地址0x0000内容为0x02,即为机器码的跳转指令,后面紧跟的两个字节保存的是要跳转到的地址值,为了保证能正确跳转到BootLoader区,需要在擦除本页前保存跳转的地址值,待擦除完成后重新写入这3个字节,其实现代码如下:

BootAddr[0]=FlASH_ByteRead(0x0001);

BootAddr[1]=FLASH_ByteRead(0x0002);

FLASH_PageErase(0X0000);//擦除0页

FLASH_ByteWrite(0x0000,0x02);//跳转指令0x02

FLASH_ByteWfite (0x0001,BootAddr [0]);//写入bootloader的开始地址

FLASH_ByteWrite(0x0002,BootAddr[1]);

“用户程序”入口地址的保存:“用户程序”入口地址在程序文件内标示保存在程序的前3个地址字节内,在生成的程序的Hex文件内显示为:

:03000000021ECC11

:0C1ECC00787FE4F6D8FD7581700216A046

第1行内的内容表示在地址0x0000及向后的两个字节内的内容为0x02ECCC,即为要跳转到Flash地址0x1ECC处去执行“用户程序”的第1条指令,这里我们就要把这个地址保存起来,以便让BootLoader程序在执行完后跳转到这里来运行“用户程序”,即把“用户程序”文件内原来指向地址0x0000~0x0002的3个字节保存到BootLoader指定的一个页单独保存,本应用中是保存到了0x7A00页的前3个字节,实现代码如下:

#define APP_ADDR_PAGE 0x7C00L∥用户程序的入口地址……

startAddr=RecData[2]*256+RecData[3];

if((startAddr+i==0)‖(startAddr+i==1)‖(startAddr+i==2))

FLASH_ByteWrite(APP_ADDR_PAGE+i,RecData[5+i]);

startAddr为上位机传来的数据帧内指明的数据应保存的地址

BootLoader程序区的保护:在更新“用户程序”过程中要防止上位机传来的数据包含与BootLoader程序保存区地址重复的地址段,如果将BootLoader区覆盖将导致下次复位后不能正确执行引导程序。通过以下程序段实现引导区的保护:

if(startAddr>=0x6000)//与BootLoader冲突

SendString(“Code overflow! ”);

绝对地址的跳转:当升级完成或在复位后上位机未响应升级握手时,程序即跳往“用户程序”的入口地址,此地址保存于Flash的0x7C00处。

4 上位机软件开发

为了配合单片机内BootLoader的功能实现,需要在计算机端编写对应的下载程序来共同完成固件升级,按照BootLoader的通讯协议,上位机服务程序使用Delphi开发,程序主要针对串口操作,完成握手协议、用户程序文件读取并按照固定格式打包、下载及进度监测等功能,程序的运行界面如图4所示。

C8051F410单片机BootLoader的实现

5 结束语

BootLoader是一个完善产品应该具备的基本功能,其为基于单片机的产品程序升级提供了很好的解决途径。

通过C8051F410单片机内核的实际产品使用,很好的验证了本文所述方法的实用性、可靠性,同时这种方法也同样适用于其他相似结构的单片机。

当程序具有重要保密需求时,可考虑将原Hex文件进行加密,在下载过程中按照加密规则进行解密,以使程序升级更加安全、通用。

为了使程序功能更加完善,在更新程序前应将单片机内原有旧版本的“用户程序”下载并保存,然后再进行更新,当新升级的程序不能使用时还可恢复为旧版本。

关键字:C8051F410  单片机  BootLoader 引用地址:C8051F410单片机BootLoader的实现

上一篇:基于红外对射技术的安全警示系统设计
下一篇:基于MMA8452Q传感器的计步器抗干扰设计

推荐阅读最新更新时间:2024-03-16 13:39

avr单片机秒表Proteus仿真程序 tm1637数码管显示
单片机源程序如下: /** *版权所有(c)2018,艁ukasz Marcin Podkalicki *2009年12月13日 *简单定时器(启动/复位/停止),使用基于TM1637的一个按钮和7段显示模块。 * *注意,这个ATtiny13项目使用的内部时钟并不精确 *时间可以向前或向后流动,但是嘿! *它仍然足够做一个好的鸡蛋计时器:) */ //#include stdint.h #include avr/io.h #include util/delay.h #include avr/interrupt.h #include tm1
[单片机]
avr<font color='red'>单片机</font>秒表Proteus仿真程序 tm1637数码管显示
第14节:二进制与十六进制
从业十年,教你单片机入门 第14讲: C51编译器并不支持二进制的书写格式,即使添加某个头文件后能支持二进制的书写格式,二进制的书写还是有个弊端,就是数字太多太长了,写起来非常费劲不方便,怎么办?解决办法就是用十六进制。十六进制是二进制的缩写,之所以称它为二进制的缩写,是因为它们的转换关系非常简单直观,不需要借助计算器即可相互转换。 何谓十六进制?欲搞清楚这个问题,还得先从十进制说起。所谓十进制,就是用一位字符可以表示从0到9这十个数字。所谓二进制,就是用一位字符可以表示从0到1这二个数字。所谓十六进制,当然也就是用一位字符可以表示从0到15这十六个数字。但是马上就会面临一个问题,十六进制的10到15这6个数其实是有两位字符组成的
[单片机]
利用飞思卡尔S12X系列单片机双核功能实现串口空闲中断接收
1. 关于协处理器XGATE   Freescale公司推出的S12XE系列双核单片机,其内部集成了一个可编程RISC内核的XGATE协处理器(双核),专门用来处理I/O和中断,其性能就相当于一个DMA控制器。由于采用了RISC架构,且处理速率比CPU快一倍,从而提高了系统的实时处理能力,极大的减轻了CPU的工作负荷,让CPU有能多的“精力”用于处理逻辑及计算上的问题,提高了单片机的工作效率。 2. 协处理器XGATE的工作模式   协处理器XGATE工作独立,和主CPU之间通过片内的双口RAM实现数据交互。同时,两个内核之间可以相互发送中断请求。当主CPU与XGATE之间存在竞争问题时,单片机采用了8个内部硬件信号量予以解决
[单片机]
利用飞思卡尔S12X系列<font color='red'>单片机</font>双核功能实现串口空闲中断接收
基于单片机的数控恒流源电路的设计
  0 引言   恒流源是能够向负载提供恒定电流的电源,也称作稳流源或者电流源。当前,数控恒流源的应用,随着电子技术的发展使用范围越来越广,在电子测量仪器、激光、传感技术、超导、现代通信等高新技术领域,恒流源都被广泛应用,且发展前景较为良好。同时,也不仅局限于此,目前,急需迫切解决的工业需求是,数字化在工业生产中采集的模拟信号量,并将其作为控制信号的恒定电流,并参与到下一级生产的控制当中。   1 系统的结构与原理   变压整流、单片机控制部分、D/A 与A/D 转换电路、供电部分、显示器或键盘接口电路、恒流源电路等,本数控恒流源便由以上的几个部分组成。该系统还能实现人机交流,主要是通过LED数码管和小键盘来实现的,LED
[单片机]
基于<font color='red'>单片机</font>的数控恒流源电路的设计
基于ARM高速闪存MCU应对广泛嵌入式需求
  由于采用了ARM7TDMI-S内核,LPC2000系列MCU工作频率达60MHz,与其他8-bit产品相比具有更强的功能延展性。同时它借助片上存储器加 模块实现了“零等待访问”高速闪存功能,提高了指令执行的效率。   此外,LPC2000的外设接口非常丰富,包括UART、SPI、I2C、CAN、ADC、 PWM、RTC等。LPC2000系列MCU应用领域非常广泛,从网络通信、 马达控制,到汽车和消费电子都适合于涉足。   嵌入式系统是面向用户、面向产品、面向应用的,它是将先进计算机技术、半导体技术和电子技术以及各行业的具体应用相结合的产物,因此它是一个高度密集、不断创新的知识集成系统。作为嵌入式系统,它必须能够根据应用的需
[应用]
STC单片机的下载协议
关于STC的下载在Linux平台下面一直是一个老大难的问题。我最近一段时间去ourdev网站,和数码之家,包括有一些热心人的协助。以及一些前人开发的开源软件,类似gSTC-ISP之类的软件。才让我完全的搞懂了STC的ISP协议。 本文以GPL v3条款发布。但是切勿胡乱传播。影响宏晶的利益。这个逆向工程做的并不妥当。望宏晶包涵,毕竟你并未公开协议。导致我们使用Linux的人痛苦不堪。 现在先放出用Gambas写的两个ISP软件。分别对应89系列和12系列。15系列正在分析。别的系列因为不常用暂无协议。 SerialPort kSTC89-ISP 那么呢,我就先从STC89系列的讲起。大同小异的。 STC89系列的单片机
[单片机]
Holtek 推出具有LCD功能的A/D型MCU
HT46CU66为盛群半导体(Holtek)最新一代八位MCU,符合工业规格需求,且HT46CU66具备有16Kx16 Mask程序内存及576 Byte的一般数据存储器。内建LCD Driver提供46x4 Pixel的输出能力。支援32个I/O pin可供设计者应用于输入及输出控制的装置,如外部按键输入控制、直接驱动LED或控制外部开关组件TRIAC、Relay等。HT46CU66提供12-bit分辨率的A/D输入转换功能,搭配不同Sensor可应用于侦测,如电压、电流、温度等监测外部模拟信号之用途。搭载8-bit PWM输出,以直接存取内部Register就能控制PWM Duty Cycle,使PWM之使用相当方便。PWM输
[安防电子]
MSC-51单片机的3字节和4字节浮点数计算程序分析
MSC-51 3字节和4字节浮点数计算程序,主要用于数据采集及上传,经过IEEE转换,在上位机直接显示。 ;这是本人使用的MSC-51 3字节和4字节浮点数计算程序,主要用于数据采集及上传,经过IEEE转换,在上位机直接显示。 ; FLOATING PROGRAM ;########################################## ;########################################## ;----------------------------------------------- ; IEEE754 FLOAT CONVERT TO 4 BYTES FLOAT ; IN
[单片机]
MSC-51<font color='red'>单片机</font>的3字节和4字节浮点数计算程序分析
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
随便看看
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved