您的位置 首页 测评

PIC18系列单片机中运用BootLoader

引言PIC单片机的BootLoader属于需要自己写程序的那种,可以根据自己的需要写出各种功能的BootLoader程序来。目前,比较常见的BootLoa…

引 言

  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程序使用到实践体系中。

  (2) 对HI-TECH的BootLoader程序的改善
  针对上麵说到的问题,对HI-TECH的BootLoader作了一些修正,删除了部分很少用到的功用和不安全的功用,一同修正了进入BootLoader状况的判别条件。除了运用增强的串口数据辨认办法外,还添加了电平检测的办法,用来判别是否进入BootLoader状况。
   ① 针对上麵榜首项中的问题,修正为辨认特定字符串才干够进入BootLoader的晋级状况。特定字符串的内容和长度能够由用户自己界说(长度不能超越12字节。在一般状况下,12字节的辨认字符串应当满足长了)。能够运用任何数据(包含0)。
   ② 添加了特定引脚电平判别办法,在BootLoader程序运转后,判别某个特定的引脚上的电压是否是预订的电压,由此决议是否需求进入BootLoader晋级状况。引脚和预订电压(高/低)能够自在设置。这种办法比较安全,可是不太适合于长途晋级。
   ③ 添加了看门狗选项,能够设置运用/不运用看门狗。一般设置看门狗的溢出时刻在0.5~2s比较适宜。
   ④ 添加了编程呼应。在每成功接纳到一行HEX数据后,宣布一个回应字节,用于编程时的过错检测。PC端的下载程序能够依据这个字节来判别下载进程中是否犯错。
   ⑤ 针对上麵3(1)中③的问题,能够这样处理。将编译后的HEX文件手艺稍作修正,将0x200~0x220(假定用户程序是从0x200开端的)地址段的数据从文件的最初移动到文件的结束。这样0x200处的代码会在终究才写入单片机中。假如写入进程中呈现毛病,複位后即便BootLoader发动了用户程序,也会由于这段区域没有代码而从头複位,而不会去运转部分被写入的用户程序。不过这种办法需求对HEX文件的结构有必定的了解才行。一个简略判别HEX数据地址的办法是,HEX文件的每一行榜首个字符是冒号“:”,冒号后的第3、4、5、6这四个数字就表明这一行数据的地址,是以十六进制表明的。如:“:100200…”就表明地址是0x200。在正常状况下,编译后的HEX文件数据是地址从低到高的顺序排列的。
  改善后的程序添加了一部分参数,它们是:
  BOOT_SIGNAL——运用单片机引脚电平触发办法进入BootLoader;
  BOOT_SIGNAL_PORT——界说电平触发发动办法检测用的引脚;
  BOOT_SIGNAL_LEVEL——界说检测电平1=高电平触发,0=低电平触发;
  BOOT_TIME_DELAY——运用超时办法进入BootLoader,这个参数和上麵的BOOT_SIGNAL不能一同?运用;
  USE_EXTEND_HEX——是否接纳扩展的HEX代码,不运用能够节约代码,主张不必;
  USEWDT——是否在BootLoader中运用看门狗,主张运用;
  CONFIRM_TIME——联机同步字节数,在超时办法中运用多字节进行同步;
  CONFIRM_DATA——用户可界说的联机数据;
  USE_ECHOBACK——编程时是否回应,运用能够添加下载时的安全性,主张运用。
  运用了BOOT_SIGNAL办法后,与超时办法相关的部分都不复兴效果。这时能够界说运用恣意引脚来断定是否需求进入BootLoader。在运用BOOT_TIME_DELAY(超时办法)时,添加了一些与之相关的内容,如CONFIRM_DATA,能够运用任何特定的字符串来承认是否需求进入BootLoader状况,添加了BootLoader程序的安全性,防止遭到搅扰而误进入程序晋级状况。

  (3) 其他改善的主张和办法
   ① HI-TECH的BootLoader程序接纳的是标準的HEX文件。这在许多时分是不行安全的,不利于程序的加密,简单被反彙编和破解。能够对HEX进行加密处理,变成不能直接检查的数据。
   ② 运用超级终端进行程序下载速度比较慢,一同,假如下载中呈现过错,超级终端程序不能及时发现中止下来,而是一直把文件发送完才干停下来。这时BootLoader程序会反複进入BootLoader状况,对单片机有必定的损害。最好是自行编写一个计算机端的专用下载程序,不光能够进步下载的速度,也能够进步下载的成功率。
   ③ 运用RS422/485办法。有些时分,运用的并不是RS232串口,而是RS422/RS485串口。它们实践是相似的,只是在接口办法上有些差异。RS422/RS485需求操控发送,所以在BootLoader程序中添加一个发送操控就能够了。
   ④ 在BootLoader中,将波特率设置得很高并没有太大的用途,它并不能够进步下载全体的速度,而只能加速数据传输的速度。由于整个下载分为数据通讯(数据传输)和Flash写入/擦除(数据等候)两个部分。程序代码Flash空间的擦除和写入速度是比较慢的(典型值是3~?4 ms),太快了反而简单丢掉数据,形成下载失利。运用9600 bps的波特率时,传输1字节的数据大约是1 ms,接纳一个缓衝区8字节大约需求8 ms,大于写入延时,所以不需求延时;当通讯速率超越9600 bps时,接纳8字节缓衝区的时刻或许会小于写入时刻,需求在通讯中延时。实践运用的测验成果是:运用9600 bps比运用14 400 bps时慢50%,运用57 600 bps比9600 bps快一倍,而运用115 200 bps时与57 600 bps几乎没有任何差异。假如运用超级终端下载,就更没有必要设置高波特率了。由于在运用最常用的三线办法通讯时(没有操控信号),超级终端采用了比较保存的办法发送数据,自身就比较慢。
 
结语
  一个杰出的BootLoader程序应该具有杰出的可维护性并能够正确处理异常状况,不会由于意外状况引起体系的损坏和溃散。
  能够在http://shaoziyang.logchina.com/blog/article_156363.936124.html处下载改善后的BootLoader程序(这个程序现已在实践工程中运用了较长时刻,很安稳),以及一个替换超级终端的PIC18专用下载程序(这个程序的下载速度比超级终端快许多,能够自行界说波特率和联机的字符串,具有BootLoader区代码维护功用和下载过错检测功用)。

  (编者注:本文为期刊缩写版,全文请见本刊网站www.dpj.com.cn。)

参考文献

1 Microchip.PIC18F1220/1320/2320/6620/6621数据手册
2 Microchip使用阐明AN851:A Flash Bootloader for PIC16 and PIC18 Devices
3 HI-TECH的P%&&&&&%C18(ver8.35pl2)软件的BootLoader程序代码和程序阐明

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/ceping/266002.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部