嵌入式
返回首页

使用IAP在应用编程轻松更新固件

2018-02-08 来源:ZLG致远电子

在电子产品出厂前,可以通过离线烧录器,烧录夹具,或者用在线烧录器通过预留的烧录接口轻松将应用代码下载到MCU中。但是,如果产品已售出或不在研发端,又要怎样升级程序呢?今天,这里就给大家介绍通过IAP的在线升级方法。


先来理解两个概念ISP和IAP:


1、ISP(In-System Programming)在系统可编程,指电路板上的空白器件可以编程写入最终用户代码, 而不需要从电路板上取下器件,已经编程的器件也可以用ISP方式擦除或再编程;


2、IAP(In-Application Programming) 指MCU可以在系统中获取新代码并对自己重新编程,即可用程序来改变程序。

blob.png

IAP编程的实现办法


实现IAP功能,需要在设计产品的时候编写两个程序,第一部分程序是不执行正常的功能的,只是通过某种通信方式(如USB、Uart)接收固件或新的应用程序,执行对第二部分代码的更新,我们称之为Bootloader;第二部分代码是用户的应用代码,实现产品的真正功能。第一部分代码必须事先烧写(通过烧录器或仿真器)到单片机内,第二部分代码可以通过烧录器或仿真器烧录,也可以使用第一部分的IAP功能烧录。当芯片上电后,首先运行第一部分代码,如果不需要更新,则跳转到第二部分代码执行;如果检测到需要更新,则执行更新程序,更新完成后跳转到第二部分代码执行。以STM32为例,如下图:


blob.png

如上图例子,Bootloader的起始地址存放在0x08000000(也是STM32芯片Flash的起始地址),程序由此执行后,跳转至复位中断入口向量地址,随后跳转到Bootloader的main函数入口, 当检测到需要升级程序,执行更新第二部分应用程序代码到地址为0x08000000 + N的Flash区域,更新完成后,跳转至第二部分应用程序的复位中断向量地址(0x08000004 + N +M), 随后跳转至第二部分应用程序的main函数,在main函数的运行过程中,如果CPU遇到一个中断请求,PC指针强制跳转至Bootloader的中断向量表(上图中0x08000004),而不是第二部分的中断向量表,程序再根据我们设置的中断向量表偏移量,跳转到对应中断源新的中断服务程序中执行,执行完成后返回第二部分应用程序的main函数。


需要注意的地方是:第一部分程序(Bootloader)跳转的地址和第二部分应用程序的起始地址必须要保持一致,相应的中断向量表也要修改,否则程序无法正确运行。


通过IAP在应用编程,在一些产品发布后可以方便地通过预留的通信口(如USB,串口,网络端口或无线传输)对产品中的固件程序进行更新升级。在使用IAP功能之前,芯片必须先通过烧录工具将实现IAP功能的Bootloader烧录到单片机内。如果Bootloader程序被破坏,产品必须返厂才能重新烧写程序,这是很麻烦并且非常耗费时间和金钱的。针对这样的需求,STM32在对Flash区域实行读保护的同时,自动地对用户Flash区的开始4页设置为写保护,这样可以有效地保证IAP程序区域不会被意外地破坏。


ZLG致远电子的P800isp是一款多通道在线脱机烧录器,用户只需将产品的烧录接口预留出来,使用P800isp即可轻松对程序进行一次烧录、二次更新,即使产品Bootloader被破坏,也能轻松解决更新问题

blob.png


进入嵌入式查看更多内容>>
IAP
相关视频
  • PX4固件二次开发课程

  • RISC-V嵌入式系统开发

  • NuttX Workshop 2024

  • 自己动手写操作系统

  • SOC系统级芯片设计实验

  • 自己动手做一台计算机

精选电路图
  • PIC单片机控制的遥控防盗报警器电路

  • 红外线探测报警器

  • 短波AM发射器电路设计图

  • 使用ESP8266从NTP服务器获取时间并在OLED显示器上显示

  • 开关电源的基本组成及工作原理

  • 用NE555制作定时器

    相关电子头条文章