首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

单片机自编程及Bootloader设计(4)

单片机自编程及Bootloader设计(4)

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接口升级等等。
继承事业,薪火相传
返回列表