当前位置:首页 > 嵌入式 > 嵌入式硬件
[导读]Bootloader是在单片机上电启动时执行的一小段程序。也称作固件,通过这段程序,可以初始化硬件设备、建立内存空间的映射图,从而将系统的软硬件环境带到一个合适的状态,以

Bootloader是在单片机上电启动时执行的一小段程序。也称作固件,通过这段程序,可以初始化硬件设备、建立内存空间的映射图,从而将系统的软硬件环境带到一个合适的状态,以便为最终调用应用程序准备好正确的环境。

Boot代码由MCU启动时执行的指令组成。这里的loader指向MCU的Flash中写入新的应用程序。因此,Bootloader是依赖于特定的硬件而实现的,因此,在众多嵌入式产品中目前还不可能实现通用Bootloader。

Bootloader的最大优点是:在不需要外部编程器的情况下,对嵌入式产品的应用代码进行更新升级。它使得通过局域网或者Intemet远程更新程序成为可能。例如,如果有5 000个基于MCU的电能表应用程序需要更新,电能表制造商的技术人员就可以避免从事对每一个电能表重新编程的巨大工作量,通过使用Bootloader 的功能,由控制中心通过电能表抄表系统网络,远程对5 000个电表重新编程。可见,Bootloader功能对于嵌入式系统的广泛应用具有十分重要的意义。

1 78K0/Fx2系列单片机简介

78K0/Fx2系列是带CAN控制器的8位单片机,该系列单片机广泛应用于汽车电子,智能仪表等领域。其内置POC(可编程上电清零电路)/LVI(可编程低电压指示器),单电压自编程闪存,引导交换功能(闪存安全保护),具有低功耗、宽电压范围、超高抗干扰等性能。

78K0系列单片机支持自编程(Self-programming)。所谓自编程,是指用Flash存储器中的驻留的软件或程序对Flash存储器进行擦除/编程的方法。通过单片机的自编程功能,可以设计Bootloader程序,通过串口等通信接口实现对产品重新编程、在线升级的功能。

以μPD78F0881为例。μPD78F0881为78KO/Fx2系列中的一款44管脚单片机,内置32 KB Flash ROM,2 KB RAM,自带2个串行通信接口。其内部Flash结构如图1所示。为了方便实现擦除和编程,人为地将整个Flash分成若干个block,每个block 大小为1 KB。block为自编程库函数中空白检测、擦除、校验的最小单位。blockO从地址0000H开始,程序都从0000H开始执行。 block0~block3共4 KB存储空间为Bootloader程序存储区域。block4~block31为应用程序存储区域。

 


为了防止Bootloader自身的升级失败,设计了引导交换功能。该功能定义2个簇,即Boot cluster0和Boot cluster1。Boot clustee0为block0~block3的4 KB存储空间,Boot cluster1为block4~block7的4 KB存储空间。因此,实际运用过程中,一般把应用程序的开始定义在2000H,也就是从block8开始。

Flash地址为0000H~FFFFH。7FFFFH~FFFFH存储空间为保留区域以及特殊功能寄存器区域等,用户无法对其进行编程。

2 自编程

2.1 自编程环境

2.1.1 硬件环境

FLMDO引脚是78KO/Fx2系列单片机为Flash编程模式设置的,用于控制MCU进入编程模式。在通常操作情况下,FLMDO引脚下拉到地。要进入自编程模式,必须使FLMDO引脚置成高电平。因此,通过一个普通I/O接口控制FLMD0引脚的电平。如图2所示。

 


2.1.2 软件环境

1)使用通用寄存器bank3,自编程库函数,需要调用通用寄存器bank3。因此,在自编程时,不能对通用寄存器bank3操作。

2)使用100 B RAM(入口RAM)作为隐藏ROM中函数的工作区,入口RAM,是Flash存储器自编程样例库所使用的RAM区域。用户程序需要保留着块区域,当调用库时,需要指定这片区域的起始地址。入口RAM地址可以指定在FB00h~FE20h之间。

3)4~256 B RAM作为数据缓冲区,必须是FE20H~FE83H以外的内部高速RAM区域。

4)最大39 B RAM作为隐藏ROM函数的堆栈。

5)隐藏ROM中的函数被0000H~7FFFH中的应用程序调用。

2.2 自编程流程

自编程功能利用自编程软件库完成用户程序对Flash内容的重新编程。如果在自编程的过程中有中断发生,那么自编程将暂停来响应中断。中断结束,自编程模式恢复后,自编程过程将继续进行。采用汇编语言编写78K0/Fx2自编程软件库,如表1所示。

 


自编程操作流程如图3所示,当单片机收到自编程执行信号时,开始进入自编程模式。将FLMDO引脚设置成高电平,初始化入口RAM,为自编程库函数开辟空间。当确认FLMD0为自编程状态时,开始检查需要编程区域是否为空白区域。当被编程区域不是空白区域时,先将其擦除,然后在此区域进行编程。编程结束后进行校验。若校验无误,则将FLMDO引脚设置成低电平,退出自编程模式。

 


3 引导交换(boot swap)

产品程序的升级包括应用程序的升级和引导程序(Bootloader自身)的升级。为了防止引导程序在升级的过程中发生错误,从而导致MCU无法启动,设计了引导交换功能。以图4说明引导交换的实现过程。

 


1)旧的Boot程序首先将新的Boot程序编程到交换引导簇1(Boot cluster 1),然后设置启动交换标志位,并强迫看门狗复位。

2)复位启动后,MCU看到交换标志位,便从交换引导簇1处开始启动。交换引导簇1处的新Boot程序将检查交换标志位。如果交换标志位被置1,则新的 Boot程序将擦除交换引导簇0(Boot cluster 0)区域,并将自身复制到交换引导簇O,然后将交换标志位清零,强迫看门狗复位。[!--empirenews.page--]

3)复位启动后,MCU看到交换标志位被清零。又从交换引导簇0处开始执行。这样就完成了boot程序自身的升级。即使在升级过程中遇到断电等异常情况,在重新上电后也能重新完成Boot程序升级。有效地防止在升级过程中出现断电等等异常情况而导致升级失败,MCU无法启动的问题,使Boot程序的升级变得安全可靠。

4 Bootloadler设计

4.1 简单的Bootloader

一个简单的Bootload包括5个元素。

1)启动 Bootloader的信号 Bootloader程序是在执行应用程序之前所执行的一小段程序,当Bootloader程序把控制权转交给应用程序后,在MCU复位前,Bootloader程序将不再执行。因此,需要产生一个信号触发MCU开始Bootloader程序。该信号可以是中断,也可以通过串口传送的一条指令,或者是别的程序触发的信号。

2)执行 Bootloader的信号 单片机程序启动时,MCU是装载新的应用程序还是执行已经存在的程序取决于外部信号。该信号可以是上电时的一个端口信号,用来控制MCU装载新程序还是执行旧程序,也可以是从串口接收到的指令等。

3)将新的代码传送给MCU 通过RS485、I2C、CAN或者USB传送新的应用程序数据。因为要传送的代码一般会超过MCU的RAM容量,因此需要一些控制数据流量的措施。一般使用XON/XOFF软件握手协议,传送代码的格式一般选择Intel hex格式。

4)Flash新代码的自动编程 每次MCU接收到一批新的数据,就要将其编程到正确的Flash地址。如果该地址非空白,MCU在编程前必须先擦除。一般在编程中或者编程后还需要检查存储器的内容。

5)将控制权转移给有效的应用程序 在接收和编程了新的代码后,Bootloader写一个校验和或者其他唯一字节序列到一个固定的存储单元。Bootloader检测该值,如果该值存在,Bootloader就将控制权传给应用程序。

4.2 Intelhex格式

在线升级的程序代码采用编译器输出的Intel hex格式文件。Intel hex文件常用来保存单片机或其他微处理器的程序代码。它保存物理程序存储区中的目标代码映象。一般的编程器都支持这种格式。Intel hex文件记录中的数字都是十六进制格式。在InteI hex文件中,每一行包含一个HEX记录。Intel hex文件通常用于传输将被存于Flash或者EEPROM中的程序和数据。Intel hex由任意数量的十六进制记录组成。每个记录包含5个域,它们按照图5所示格式排列。

 

每一个部分至少由2个十六进制编码字符组成。它们构成1个字节。每一个部分的意义如下所述:

1)每个Intel hex记录都由冒号开头,自编程的过程中以此判断一个Intel hex记录的开始。

2)数据长度代表当前记录中数据字节的数量。

3)地址代表当前记录中数据在存储区域中的起始地址。

4)HEX记录类型有如下4种:00-数据记录;01-文件结束记录;02-扩展段地址记录;03-转移地址记录。NEC编译器输出的Intel hex文件中。只包含数据类型00和01。其中O1作为自编程过程中数据结束的判定标志。

5)数据域分用于存储需要写入Flash中的内容,一个记录可以有许多数据字节。记录中的数据字节数量必须与数据长度中的值相符。

6)校验和是取记录中从数据长度到数据域最后一个字节的所有字节总和的2的补码。

根据以上说明,必须在程序中对接收到的Inter hex文件进行解码,获取数据以及数据地址,并对收到的数据进行校验,然后将接收正确的数据编程到Flash相应的地址上。

4.3 Bootloader设计思路

单片机收到启动信号后,重新启动程序。启动的时候首先执行Boot代码,Boot代码检查是否收到执行升级信号。如果需要升级程序,则通过串口或者其他通信接口接收新的应用程序,loader程序向单片机Flash中写入新的应用程序代码。最后通过检查校验位检测程序是否有效。如果有效,则 Bootloader将CPUMCU控制权交给应用程序。整个升级过程完成。Bootloader执行过程如图6所示。

 

需要注意的是Bootloader自身的更新和应用程序的更新还需区别处理。通过辨别接收到数据的编程地址来判断是Bootloader更新还是应用程序更新。若编程地址从0000H开始,则为Bootloader更新。Bootloader更新则需要执行引导交换(boot swap)功能;若为应用程序更新,自编程结束后,直接将CPU交给应用程序。

5 结束语

本文探讨了 78KO/FC2系列μPD78F0881单片机的自编程功能以及Bootloader的设计方法。具体描述了通过单片机串口对相应的应用程序通过 Bootloader进行升级。此版本的Bootloader使用晶振20 MHz,通过串口Uart60,设置波特率为115 200,在μPD78F0881单片机上成功实现了用户应用程序的升级更新。在接下来的工作中,Bootloader的设计应当面向更多的通信接口。例如,通过CAN总线接口升级,通过USB接口升级等等。Bootloader技术的开发和广泛应用,必将成为嵌入式产品开发的重要部分,为网络化产品的应用和开发,特别是后期维护、升级带来极大的便利。

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

LED驱动电源的输入包括高压工频交流(即市电)、低压直流、高压直流、低压高频交流(如电子变压器的输出)等。

关键字: 驱动电源

在工业自动化蓬勃发展的当下,工业电机作为核心动力设备,其驱动电源的性能直接关系到整个系统的稳定性和可靠性。其中,反电动势抑制与过流保护是驱动电源设计中至关重要的两个环节,集成化方案的设计成为提升电机驱动性能的关键。

关键字: 工业电机 驱动电源

LED 驱动电源作为 LED 照明系统的 “心脏”,其稳定性直接决定了整个照明设备的使用寿命。然而,在实际应用中,LED 驱动电源易损坏的问题却十分常见,不仅增加了维护成本,还影响了用户体验。要解决这一问题,需从设计、生...

关键字: 驱动电源 照明系统 散热

根据LED驱动电源的公式,电感内电流波动大小和电感值成反比,输出纹波和输出电容值成反比。所以加大电感值和输出电容值可以减小纹波。

关键字: LED 设计 驱动电源

电动汽车(EV)作为新能源汽车的重要代表,正逐渐成为全球汽车产业的重要发展方向。电动汽车的核心技术之一是电机驱动控制系统,而绝缘栅双极型晶体管(IGBT)作为电机驱动系统中的关键元件,其性能直接影响到电动汽车的动力性能和...

关键字: 电动汽车 新能源 驱动电源

在现代城市建设中,街道及停车场照明作为基础设施的重要组成部分,其质量和效率直接关系到城市的公共安全、居民生活质量和能源利用效率。随着科技的进步,高亮度白光发光二极管(LED)因其独特的优势逐渐取代传统光源,成为大功率区域...

关键字: 发光二极管 驱动电源 LED

LED通用照明设计工程师会遇到许多挑战,如功率密度、功率因数校正(PFC)、空间受限和可靠性等。

关键字: LED 驱动电源 功率因数校正

在LED照明技术日益普及的今天,LED驱动电源的电磁干扰(EMI)问题成为了一个不可忽视的挑战。电磁干扰不仅会影响LED灯具的正常工作,还可能对周围电子设备造成不利影响,甚至引发系统故障。因此,采取有效的硬件措施来解决L...

关键字: LED照明技术 电磁干扰 驱动电源

开关电源具有效率高的特性,而且开关电源的变压器体积比串联稳压型电源的要小得多,电源电路比较整洁,整机重量也有所下降,所以,现在的LED驱动电源

关键字: LED 驱动电源 开关电源

LED驱动电源是把电源供应转换为特定的电压电流以驱动LED发光的电压转换器,通常情况下:LED驱动电源的输入包括高压工频交流(即市电)、低压直流、高压直流、低压高频交流(如电子变压器的输出)等。

关键字: LED 隧道灯 驱动电源
关闭