摘要:针对现在依据单片机的产品和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文件进行加密,在下载进程中依照加密规矩进行解密,以使程序晋级愈加安全、通用。
为了使程序功用愈加完善,在更新程序前应将单片机内原有旧版本的“用户程序”下载并保存,然后再进行更新,当新晋级的程序不能运用时还可康复为旧版本。