嵌入式开发<单片机软件升级>


前言

   本人从事单片机软件设计工作多年,既从事过裸机系统的设计,也在小型嵌入式实时操作系统下进行过设计。在这些年的开发工作中,对产品设计逐步形成了一定的认识,并进行了较多的总结。因此,一直以来,都想整理这些东西,希望对有需要的人能提供一些帮助或参考。
   在诸多的想法中进行系统的整理其实还是有一定的难度。之前本人已经对一些较普通的驱动进行了整理,并进行了优化,感兴趣的朋友可以前去看看(其中包含完整代码并已经调试通过)。
   其实,在产品设计中涉及到诸多方面,比如产品的信息与参数,产品的调试信息与运行状态数据(甚至形成关键日志),产品的软件升级方法等等。这些东西应该形成一个统一的规范,便于公司及开发同事形成共同的方法,对于设计与维护都会有益。关于产品的信息与参数这方面的内容,我在之前的嵌入式调试工具(串口调试工具与网络调试工具中有详细说明)。
   当然,这些东西太多,肯定不会一股脑的写出来。这次的主题是软件升级,而在这里主要讲的是单片机在线升级,其可用于本地升级也可以用于远程升级。软件升级不仅解决其本身问题,也要解决软件升级安全性等一系列问题。


一、单片机软件升级方式

   对于这个,从大的原则来讲,应该就是两种方式:ISP升级与IAP升级。
   ISP升级主要完成整个软件从起始地址开始的擦除及写入,并且一般会提供开机的boot模式设置,然后利用官方或第三方的专用软件,执行升级操作。这种方式的缺点显而易见,就是只能在本地且在启动时升级,不能完成远程升级功能。并且,这种升级方式一般提供UART接口,同时与之有相同功能的是使用ST-LINK或JLINK工具进行升级。
   IAP升级属于本文重点需要讲解的一种升级方式。其特点是软件升级发生在应用程序执行过程中,并且在应用中检测到软件升级,然后执行文件接收与写入。这种升级方式可以通过多种接口进行,既可以使用UART接口,也可以使用网口、GPRS网络、无线网络、SD卡、USB等等。其使用的接口其实没有任何限制,只要能与应用程序进行通信即可。
   这里首先作一个说明,凡是你使用的MCU具备IAP功能的,也就是能够在代码里操作FLASH的读写与擦除的,基本都可以做IAP升级功能。另外,有些MCU具有通过寄存器对中断向量进行修改,如ARM M3/M4内核的MCU,还有一些不能通过寄存器修改中断向量,如ARM的M0及一些51 MCU。如此,就有两种设计方法,这里首先对第一种进行说明(大部分都是这类的方式),最后在第六章节中介绍第二种。

二、IAP升级原理

   IAP升级被称为在应用升级,其原理是利用一个区域的BOOT完成对另外一个区域的APP代码写入。要完成一个IAP升级的设计,需要涉及到几个方面,下面依次说明。

1.FLASH区域划分

   要设计IAP升级,首先需要规划FLASH区域的划分,这里提供3种划分方法,分别介绍如下
  1) BOOT区、APP区、存储区
  A. BOOT区是以MCU复位后的地址开始,指定的一片区域,其大小要能完成BOOT代码的存储即可;
  B. APP区则是应用软件运行区域,其代码大小应该是整个FLASH减去BOOT大小后除以2。当然一般不能整除,只需要取整数即可;
  C. 存储区则是除应用软件外剩余的区域;
  2) BOOT区、APP1区、APP2区
  其区域划分与第一种相同,只是APP1与APP2两个区域均可运行应用软件;
  3) BOOT区、APP区
  这里实际上就是没有存储区,以这种方式划分,主要是FLASH大小不够,只能全部分给APP区域;

2. FLASH各个区域作用

  以上区域的划分中,归纳起来则只有3部分,即BOOT区/APP区/存储区,以下分别说明其功能作用。
  1) BOOT区
  在其中存储BOOT代码,主要完成升级文件的接收(可选)、APP区代码擦除、APP区代码写入等操作。并对写入代码进行验证,最后执行APP运行代码的跳入;
  2) APP区域
  在其中存储的是应用程序代码,其执行需要依赖于BOOT程序,并且其执行也由BOOT程序跳入。另外,为了能正确执行代码,在应用开始执行时,应该改写中断向量(ARM MCU除M0内核外);
  对于此区域被称为APP1以及存储区被称为APP2的情况有些不同。应用层程序应该能识别其所运行的区域,以便在修改中断向量时可以根据自己运行的区域进行修改,否则会出现有一个区域的运行不正常;
  3) 存储区
  这个区域主要用来存储在应用中接收通信传输过来的升级软件代码。并在接收存储完成后,进入BOOT进行升级文件写入APP区;

三、IAP软件BOOT设计

  如何设计BOOT代码呢,这得从BOOT代码的作用说起。原则上来说,软件运行首先进入的是BOOT代码,而BOOT代码要完成两个工作,一个是等待用户升级,另一个是跳转到应用程序中。而如何等待用户升级呢,我见到过有两种设计。

1. 第一种设计方法

  BOOT运行时,检测一个I/O口,如果I/O口符合要求,则跳转到升级代码部分,执行升级功能;否则跳转到APP区域运行应用程序。这种方法,需要人为的去设置I/O口,最为常见的应该就是设置跳冒。这种方法其实无异于ISP,使用IAP设计就是画蛇添足,除非官方没有提供ISP方法,仅能使用ST-LINK或JLINKÿ

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值