C8051F410单片机BootLoader的实现
C8051F410单片机BootLoader的实现
BootLoader就是单片机在复位后首先执行的一小段引导程序,通过此段程序可以实现硬件初始化、进行“用户程序”更新等功能,本文主要讨论的是通过BootLoader对“用户程序”进行动态更新。
在使用单片机进行产品开发及使用过程中,不可避免的存在更新程序的问题,正常的程序下载是通过单片机仿真器与单片机的特殊I/O口连接来实现。在产品的开发阶段,通过仿真器可以实现程序下载及调试。产品开发完成后,由于单片机已被封装在产品内部,若要进行更新则需要重新打开产品外壳,连接数据线。这对已经批量生产甚至产品已经在最终用户手中的情况下几乎是不可能的,一方面由于这样做效率很低、成本高,另一方面也使用户对产品的整体性能带来很大的负面影响。
C8051F410对Flash只支持0操作,故在写入数据前首先应擦除扇区(擦除只能整页操作,操作完成后每一位都为1)。软件写和擦除FLASH受FLASH锁定和关键码功能的保护。在进行FLASH操作之前,必须按顺序向FLASH锁定和关键码寄存器(FLKEY)写入关键码:0xA5,0xF1。写关键码的时序并不重要,但必须按顺序写。
BootLoader程序和“用户程序”分别存储于Flash不同区域内,在本文中做如下划分:BootLader程序占用地址0x6000~0x7FFF,其中页0x7C00来保存用户程序的入口地址,这样真正的BootLoader的程序大小就不能超过7k(0x6000~0x7A00)。“用户程序”占用地址0x0000~0x5FFF,这样对“用户程序”的编写除大小不能超过24k外就没有其他特殊要求。
上电复位:复位后单片机首先执行地址0x0000处的跳转指令跳转到BootLoader程序的入口地址并进行诸如关闭看门狗、晶振频率、UART串口波特率设置等操作,为了使程序更新速度更快,本应用中系统时钟频率设置一个较大的通讯波特率为115200bps。
数据接收:
BootLoader程序中不要使用中断函数,使用后会导致“用户程序”的相同中断处理函数失效,所以这里使用查询的方式实现UART串口数据接收。
BootLoader程序入口地址的保存:单片机复位后总是从Flash存储区的0x0000地址处开始执行,这里占用3个字节保存了一条跳转指令,地址0x0000内容为0x02,即为机器码的跳转指令,后面紧跟的两个字节保存的是要跳转到的地址值,为了保证能正确跳转到
BootLoader区,需要在擦除本页前保存跳转的地址值,待擦除完成后重新写入这3个字节,其实现代码如下:
内容表示在地址0x0000及向后的两个字节内的内容为0x02ECCC,即为要跳转到Flash地址0x1ECC处去执行“用户程序”的第1条指令,这里我们就要把这个地址保存起来,以便让BootLoader程序在执行完后跳转到这里来运行“用户程序”,即把“用户程序”文件内原来指向地址0x0000~0x0002的3个字节保存到BootLoader指定的一个页单独保存,本应用中是保存到了0x7A00页的前3个字节,实现代码如下:
通过C8051F410单片机内核的实际产品使用,很好的验证了本文所述方法的实用性、可靠性,同时这种方法也同样适用于其他相似结构的单片机。