摘要:介绍在PIC18系列 单片机 使用BootLoader的原理、方法及优点;介绍HI-TECH公司使用C语言实现BootLoader的程序,给出详细的使用方法和参数配置方法;针对程序中存在的问题进行探讨和修改,使修改后的程序实用、可靠。另外,探讨对程序数据进行加密、加快下载速度、在RS485/RS422中使用BootLoader的方法和思路。根据此方法,读者可以编写出适合自己使用的BootLoader程序。
关键词:BootLoader PIC18 IAP 在线升级
引 言
PIC 单片机 的BootLoader属于需要自己写程序的那种,可以根据自己的需要写出各种功能的BootLoader程序来。目前,比较常见的BootLoader程序有MicroChip公司的C18版本和著名的PICC编译器厂商HI-TECH公司(以下简称HI-TECH)的PICC18版本。它们的相似之处在于都占用了系统的0x00~0x1FF的程序空间。Microchip的版本是用纯汇编写的,而HI-TECH的版本是用C语言编写的。
在PIC系列 单片机 中,只有PIC18系列和PIC16F87X系列的单片机才有IAP功能,才能够使用BootLoader功能。下面只介绍PIC18的BootLoader,PIC16F87X的BootLoader与它类似。
1 BootLoader程序的工作原理
BootLoader是一段引导程序,在 单片机 上电/复位后在用户程序之前先运行。运行后判断当前是否需要进入升级状态。如果不需要升级,就直接运行Flash中原有的程序;如果需要升级,首先擦除旧的程序,然后从串口接收用户程序,同时写入Flash中。接收数据时,需要进行校验,保证接收到的数据是正确的,避免将错误的程序写入到芯片中。
PIC18 单片机 只有一块Flash,可以在Flash的任何位置擦写(甚至可以将BootLoader自身擦除);而51单片机一般都是两块Flash,只能够从一块Flash上擦写另一块Flash,而不能擦写自身。
BootLoader程序原则上是可以放在整个程序空间中的任何位置的,但是为了简单方便、具有通用性和尽量减少对用户程序的影响,使用了从0x00开始的一段程序空间。
BootLoader程序可以多种方式获取数据,包括串口、并口、I2C、SPI、USB等;但是从实际使用来看,使用串口无疑是最方便的。
为了使得用户程序可以获得最大的程序空间,就需要BootLoader程序尽可能的简短。在这里,Microchip和HI-TECH都将BootLoader程序设计为小于200H个字节(100H个字)。使用0x00~0x1FF这个区域还有一个重要原因是,这个地址的空间有特殊的写保护特性。
PIC18 单片机 虽然有多个中断源,但只支持两级中断,有两个中断向量,分别位于0x08和0x18;而BootLoader程序占用了0x00~0x1FF的空间,这意味着需要重新定位中断向量,使新的中断向量指向用户的中断程序,这样才能保证正常运行用户程序的中断程序。
2 程序的使用方法
(1) HI-TECH的BootLoader程序
在HI-TECH的PICC18编译器的examples文件夹下,有一个Bootldr子文件夹,里面就是HI-TECH的BootLoader程序。这是一个完整的程序,可以直接进行编译,编译后的HEX可以用编程器下载到芯片中。
(2) 用户系统的要求
如果需要使用BootLoader,要求用户系统中有一个RS232串口可以和计算机进行通信。
(3) 程序的配置
下面是程序的主要参数,如果它们设置得不正确,会影响程序的使用。
VERB0:冗余模式,有更多的提示,但是会占用更多的程序空间,建议不用。
BOOT_TIMEOUT:等待超时的时间,0~9s(再长了也没有意义),默认为5s。
BAUD:串口通信的波特率,默认是9 600。
FOSC:用户系统的时钟频率,默认是4 MHz。
NINE:通信是否使用第9位数据位,默认不使用。
FILL_BYTE:程序空间擦除时使用的填充数据,默认值是0xFF。
PROG_START:用户程序的起始位置,默认是0x200。
其他的参数可以先不用管,在需要时再修改,它们不影响通信和下载。
(4) 程序的编译
有两种方法对BootLoader程序进行编译:
① 命令行方式。使用命令行时,典型的用法是:
picc18 -8f452 bootldr.c -o -zg -noerrata
上面的最后一个参数 -noerrata是PIC18Fxx2系列 单片机 需要的,若是其他型号,就不用加入;而参数 -18f452是指定单片机的型号,如果是其他型号,就修改为实际使用的型号。
② 使用MPLAB IDE。使用MPLAB IDE时,首先按照正常方式建立一个新的工程文件,选择工程文件目录,然后加入HI-TECH的Samples\Bootldr目录下文件bootldr.c和bootldr.h。建立工程文件时,选择MCU的型号为实际使用的型号,选择C编译器为HI-TECH的PICC18编译器。
(5) 用户程序的配置
使用HI-TECH版本的BootLoader,对用户程序的修改是非常少和简单的,只需要修改用户程序的偏移量就可以了,而不需要修改任何程序代码或进行任何特殊的配置。因为BootLoader程序需要占用0~1FFH的空间,所以用户程序需要从200H处开始运行,即设置程序的偏移量为200H。方法是在MPLAB IDE中,从菜单中选择Project→Build Options...→Project,在PICC-18 Linker页标下的Specify offset for ROM(ROM代码偏移量)中输入偏移量200(注意这里输入的已经是十六进制了,不用再转换),如图1所示。
图 1
(6) 程序配置字
对于每个PIC 单片机 的芯片,都需要设置正确的程序配置字后才能正常运行。虽然在BootLoader中是可以修改配置字的,但是这样并不安全,也不方便。一般情况下,程序配置字设定后是不需要修改的,所以配置字在烧写BootLoader程序时就一起写入单片机芯片,以后就只使用BootLoader来升级(烧写)程序,这样不会破坏芯片的配置字。
(7) 调试用户程序
平时,在编写和调试用户程序时,还是和正常方式一样, 单片机 中不包含BootLoader程序,也不设置偏移量(或者设置为0),以方便使用ICD2等仿真器进行程序仿真。等程序调试好后,再修改程序的偏移量为200H,并重新编译程序,产生最终的用户HEX代码。这样编译好的程序才可以使用BootLoader进行下载。
(8) 下载用户程序
使用HI-TECH的BootLoader程序,在下载用户程序到 单片机 中时,可以不需要特殊的下载程序,只需要使用Windows自带的超级终端程序就可以了。超级终端的通信参数需要设置成和BootLoader程序的一样,包括波特率、校验、数据位、停止位等。
首先连接好串口线,再启动超级终端程序,然后复位 单片机 (单片机中应当已经写入了BootLoader程序)。这时,在超级终端的窗口中会显示出一个倒计时的计数器,计数器的初始值就是上面的BOOT_TIMEOUT参数。计数器每秒钟刷新一次。当计数器为0时,就会运行以前的程序。如果这期间从超级终端输入任意数据(就是随便按一个键,或者说单片机从串口上接收任意数据),计数器就会停止计数,进入升级状态。这时BootLoader程序会首先擦除旧的程序空间,然后屏幕上会显示出一个冒号“:”,提示等待下载用户程序。这时就可以从超级终端的菜单中选取传送→发送文本文件,选择编译好的HEX文件即可。如果下载成功,超级终端的窗口中会显示出一个小括号“)”,提示下载已经完成,同时用户程序会自动开始运行。使用BootLoader下载时,因为串口的速度相对比较慢(与编程器相比),所以需要等待一会儿。具体时间与用户程序的大小有关。如果下载中出现错误,单片机会自动复位,进入倒计数状态,重复上面的过程。使用超级终端比较简单,不需要特殊的下载软件;但是缺乏交互性,没有进程指示,如果下载过程中出现错误也不能停止下来。
3 BootLoader程序的改进
(1) HI-TECH的BootLoader程序中存在的缺陷
虽然HI-TECH版本的BootLoader程序已经很方便了,具备了所有必需的基本要素;但是程序中存在着一些缺陷,甚至是很重大的隐患,不太适合于直接使用在实际工程中。下面是主要存在的几个问题
①BootLoader是以从串口上接收任何数据为标志进入BootLoader状态的。进入BootLoader状态后,BootLoader程序做的第一件事情就是擦除以前程序的空间。如果在实际使用中, 单片机 因为某种意外原因被复位,而且复位后运行BootLoader时在串口上有任何数据(如干扰信号或者系统正处于串口通信状态),就会造成用户程序的丢失。
② BootLoader程序中没有使用看门狗。如果升级失败或者升级过程中程序死机,将不能恢复到初始的升级状态。这对于直接串口连接的方式问题不大,但是需要使用远程升级时是一个致命的问题。
③ 在写入用户程序过程中如果出现数据错误,就会复位,而这时用户程序已经被部分写入了。如果复位后运行BootLoader程序没有收到信号时,会启动用户程序。这样残缺的用户程序就可能会造成运行故障和不可预料的结果。如果看门狗是在用户程序中打开的,这时就有可能出现看门狗没有被启动而死机的现象,这是远程升级中一个严重的问题。
④ BootLoader程序中允许写EEPROM和芯片配置字。虽然这样增加了灵活性,但是这样是不安全的。如果配置字不小心设置错了,下载后会使整个芯片不能正常运行。这时需要重新用编程器修改配置字才行。
本文关键字:单片机 BootLoader PIC单片机,单片机-工控设备 - PIC单片机