当前位置:首页 > 单片机 > 单片机
[导读]摘要:针对目前基于单片机的产品和C8051F410单片机特色,提出了一种使用UART接口进行程序升级的实现方法,并对实现此功能的关键技术点做了相应分析,使程序更加实用、可靠,所有代码使用C语言进行实现。此方法具有一

摘要:针对目前基于单片机的产品和C8051F410单片机特色,提出了一种使用UART接口进行程序升级的实现方法,并对实现此功能的关键技术点做了相应分析,使程序更加实用、可靠,所有代码使用C语言进行实现。此方法具有一定的普遍适用性,在基本思想不变情况下稍加改变程序代码即可用于其他型号的单片机。

关键词:BootLoader;C8051F410;引导程序;固件更新

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功能提供了充要前提条件。

1.2 存储区的功能划分

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

1.3 定位BootLoader的存储位置

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

2 BootLoader程序工作流程描述

2.1 关键过程描述

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

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

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

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

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

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

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

2.2 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!\r\n”);

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

4 上位机软件开发

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

5 结束语

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

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

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

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

本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除。
换一批
延伸阅读

单片机是一种嵌入式系统,它是一块集成电路芯片,内部包含了处理器、存储器和输入输出接口等功能。

关键字: 单片机 编写程序 嵌入式

在现代电子技术的快速发展中,单片机以其高度的集成性、稳定性和可靠性,在工业自动化、智能家居、医疗设备、航空航天等诸多领域得到了广泛应用。S32单片机,作为其中的佼佼者,其引脚功能丰富多样,是实现与外部设备通信、控制、数据...

关键字: s32单片机引脚 单片机

在微控制器领域,MSP430与STM32无疑是两颗璀璨的明星。它们各自凭借其独特的技术特点和广泛的应用领域,在市场上占据了重要的位置。本文将深入解析MSP430与STM32之间的区别,探讨它们在不同应用场景下的优势和局限...

关键字: MSP430 STM32 单片机

该系列产品有助于嵌入式设计人员在更广泛的系统中轻松实现USB功能

关键字: 单片机 嵌入式设计 USB

单片机编程语言是程序员与微控制器进行交流的桥梁,它们构成了单片机系统的软件开发基石,决定着如何有效、高效地控制和管理单片机的各项资源。随着微控制器技术的不断发展,针对不同应用场景的需求,形成了丰富多样的编程语言体系。本文...

关键字: 单片机 微控制器

单片机,全称为“单片微型计算机”或“微控制器”(Microcontroller Unit,简称MCU),是一种高度集成化的电子器件,它是现代科技领域的关键组件,尤其在自动化控制、物联网、消费电子、汽车电子、工业控制等领域...

关键字: 单片机 MCU

STM32是由意法半导体公司(STMicroelectronics)推出的基于ARM Cortex-M内核的32位微控制器系列,以其高性能、低功耗、丰富的外设接口和强大的生态系统深受广大嵌入式开发者喜爱。本文将详细介绍S...

关键字: STM32 单片机

在当前的科技浪潮中,单片机作为嵌入式系统的重要组成部分,正以其强大的功能和广泛的应用领域受到越来越多行业的青睐。在众多单片机中,W79E2051以其卓越的性能和稳定的工作特性,成为市场上的明星产品。本文将深入探讨W79E...

关键字: 单片机 w79e2051单片机

单片机,又称为微控制器或微处理器,是现代电子设备中的核心部件之一。它集成了中央处理器、存储器、输入输出接口等电路,通过外部信号引脚与外部设备进行通信,实现对设备的控制和管理。本文将详细介绍单片机的外部信号引脚名称及其功能...

关键字: 单片机 微控制器 中央处理器

随着科技的飞速发展,单片机和嵌入式系统在现代电子设备中的应用越来越广泛。它们不仅提高了设备的智能化水平,还推动了各行各业的创新与发展。在单片机和嵌入式系统的开发中,编程语言的选择至关重要。本文将深入探讨单片机和嵌入式系统...

关键字: 单片机 嵌入式系统 电子设备
关闭
关闭