基于IAP的远程升级设计

上传人:平*** 文档编号:14602633 上传时间:2017-11-01 格式:DOC 页数:21 大小:128.66KB
返回 下载 相关 举报
基于IAP的远程升级设计_第1页
第1页 / 共21页
基于IAP的远程升级设计_第2页
第2页 / 共21页
基于IAP的远程升级设计_第3页
第3页 / 共21页
基于IAP的远程升级设计_第4页
第4页 / 共21页
基于IAP的远程升级设计_第5页
第5页 / 共21页
点击查看更多>>
资源描述

《基于IAP的远程升级设计》由会员分享,可在线阅读,更多相关《基于IAP的远程升级设计(21页珍藏版)》请在金锄头文库上搜索。

1、基于 IAP 的远程升级设计写在前面:三个周之前,我突然想写一个远程升级的程序。那个时候我只是大概知道 IAP的意思是在应用编程,但怎么编,我还一无所知。我给自己定下一个个阶段目标,从最基础的代码一点点写起,解决一个又一个的问题。三个周之后,我用自己设计的方法实验了50 多次,无一例升级失败。三个周来,遇到了很多的不解、困惑,甚至是想放弃,但我现在想说的是:很多未知的困难会挡在我们面前,我们会感觉毫无头绪甚至觉得毫无出路忍不住要放弃,但多坚持一下,那些困难不但能烟消云散还能带给我们进步。本设计是基于 LPC2114 和 Keil MDK(V4.10 ) ,但所有支持 IAP 的处理器都可借鉴本

2、方案,重要的是思想,而不是用什么。0 引言在应用编程(IAP)技术为系统在线升级和远程升级提供了良好的解决方案,也为数据存储和现场固件的升级都带来了极大的灵活性。通常可利用芯片的串行口接到计算机的 RS232 口、通过现有的 Internet 或、无线网络或者其他通信方式很方便地实现在线以及远程升级和维护。本文以 NXP 的 LPC2114 ARM 微处理器为平台,以 Keil MDK 为开发工具,阐述 IAP 的原理、Flash 的划分、分散加载机制、中断重映射以及在线升级的实现方案及其优化。本方案使用多种校验技术,最大限度的保障传输数据的正确性;使用 bootloader 机制,即使因意外

3、事件(断电,编程 Flash 失败等)造成升级失败后,程序也能返回到升级前的状态。1 LPC2114 的 Flash 规划1.1 扇区描述LPC2114 共有 128KB 片内 Flash,共分为 16 个扇区,分别为 0 扇区15 扇区,每个扇区为 8KB 存储空间。其中第 15 扇区出厂时被固化为 Boot Block 区,控制复位后的初始化操作,并提供实现 Flash 编程的方法。所以用户可用的 Flash 空间只有 120KB。IAP 程序固化于 Boot Block 中,IAP 操作是以扇区为单位,并占用片内 RAM 的高 32 字节。下表列出LPC2114 器件所包含的扇区数和存储

4、器地址.表 1.1 LPC2114 Flash 器件中的扇区 1.2 Flash 的扇区划分本设计将 Flash 划分为四个区,扇区 0 存放跳转程序和升级引导程序(Bootloader) 。分站上电后执行跳转程序,跳转到用户程序处。用户程序运行过程中,如果接收到升级指令,会从用户程序跳转到引导程序区(Bootloader) ,接收新程序数据包,完成 Flash 编程并跳转到新程序区执行程序。扇区 1扇区 7 为程序存储低区;扇区 8扇区 13 为程序存储高区;扇区 14 存放当前程序运行区域标志,如果当前程序运行在高区,该标志区的最低四个字节为 0x00010000,如果当前程序运行在低区,

5、该标志区的最低四个字节为 0x00008000。2 IAP 的原理与软件设计2.1 IAP 的原理IAP 函数是固化在微处理器内部 flash 上的一些函数代码,最终的用户程序可以直接通过调用这些函数来对内部 flash 进行擦除和编程操作。LPC2114 微处理器的内部 flash 有一个块称为 Boot Block,位于 flash 的顶端,可供调用的 IAP 函数就位于该块中。上电后 Boot Block 被映射到内部地址空间的顶端,同样 IAP 函数人口地址也被映射到地址 0x7ffffff0 处。用户可通过跳转到该地址来调用相应的 lAP 函数。2.2 IAP 命令对于在应用编程来说

6、,应当通过寄存器 r0 中的字指针指向存储器(RAM)包含的命令代码和参数来调用 IAP 程序。IAP 命令的结果返回到寄存器 r1 所指向的返回表。用户可通过传递寄存器 r0 和 r1 中的相同指针重用命令表来得到结果。参数表应当大到足够保存所有的结果以防结果的数目大于参数的数目。参数传递见图 2-1。参数和结果的数目根据 IAP 命令而有所不同。参数的最大数目为 5,由“将 RAM 内容复制到 Flash”命令传递。结果的最大数目为 2,由“扇区查空”命令返回。命令处理程序在接收到一个未定义的命令时发送状态代码 INVALID_COMMAND。IAP 程序是 thumb 代码,位于地址 0

7、x7FFFFFF0。图 2-1 IAP 的参数传递表 2-1 描述了 IAP 的命令。表 2-1 IAP 命令汇总 IAP 命令2.3 IAP 编程函数接口IAP 功能可用下面的 C 代码来调用。定义 IAP 程序的入口地址。由于 IAP 地址的第 0 位是 1,因此,当程序计数器转移到该地址时会引起 Thumb 指令集的变化。#define IAP_LOCATION 0x7ffffff1定义数据结构或指针,将 IAP 命令表和结果表传递给 IAP 函数unsigned long command5;unsigned long result2;定义函数类型指针,函数包含 2 个参数,无返回值。注

8、意: IAP 将函数结果和 R1 中的表格基址一同返回。typedef void (*IAP) (unsigned int , unsigned int );IAP iap_entry;设置函数指针iap_entry=(IAP) IAP_LOCATION;使用下面的语句来调用 IAP。iap_entry (command , result);Flash 存储器在写或擦除操作过程中不可被访问。执行 Flash 写/擦除操作的 IAP 命令使用片内 RAM 顶端的 32 个字节空间。如果应用程序中允许 IAP 编程,那么用户程序不应使用该空间。3 LPC2114 升级实现过程由于在升级程序软件设计

9、中,分散加载机制、中断向量的重映射、软中断等的实现还与所使用的编译器紧密相关,因此,本文结合 Keil MDK(V4.10)编译工具,来详细阐述升级程序的实现过程。3.1 总体思路分站上电后,首先运行位于 Flash 0x0000x3FF 中的跳转程序。跳转程序会读取位于 14 扇区的当前程序运行标志,如果该扇区的最低四个字节为 0x00010000,表示当前程序运行在高区,跳转程序会跳转到 Flash 的 0x00010000 处执行用户程序;如果该标志区的最低四个字节为 0x00008000,表示当前程序运行在低区,跳转程序会跳转到 Flash 的 0x00002000 处执行用户程序。用

10、户程序正常执行后,会按照设计进行正常的程序采集、数据处理传送。当接收到升级命令后,用户程序会跳转到 Flash 的 0x00000400 处的 Bootloader 处进行升级的一些操作。当升级成功后,Bootloader 程序更新当前程序运行区标志,程序跳转到新程序处运行,如果升级不成功,返回升级前的程序。流程图如下所示:3.2 跳转程序的设计跳转程序是分站上电后最先运行的程序,根据当前程序运行区标志,跳转到相应的用户程序区执行。本段程序占用 Flash 的最低 1K 字节空间,与 Bootloader 同在第 0 扇区。跳转程序的启动代码仅初始化堆栈,不使用 PLL 和存储加速功能。代码

11、1 描述了跳转程序的主要启动代码。 ; Enter User Mode and set its Stack PointerMSR CPSR_c, #Mode_USRMOV SP, R0SUB SL, SP, #USR_Stack_Size; Enter the C codeIMPORT _mainLDR R0, =_mainBX R0代码 1:跳转程序启动代码当跳转程序确定要跳转到高区用户程序或者低区用户程序后,使用函数指针跳转到0x00010000 处(高区用户函数入口地址)或 0x00002000 处(低区用户函数入口地址) 。定义函数指针:void (*UserProgram)() ;指

12、定入口地址:UserProgram = (void (*)() (0x00010000);UserProgram = (void (*)() (0x00002000);实现跳转:(*UserProgram)() ;要将用户代码精确定位到 Flash 的 0x00010000 处(高区用户函数入口地址)或 0x00002000处(低区用户函数入口地址) ,需要使用编译器的分散加载机制,将在 Bootloader 中详细描述实现过程。另外,跳转程序还在烧录代码的同时初始化当前程序运行区标志,即对 Flash 的0x0001C000 地址处写入 0x00008000,表示当前用户程序在低区。主要使用

13、了编译器的_at关键字:精确定位变量。需要注意的是,使用该关键字必须包含头文件 absacc.h。const uint32 x _at(0x0001C000)=0x00008000; /初始化用户程序标志区,默认运行低区3.3 升级程序 Bootloader 的设计升级程序的好坏,在很大程度上取决于 Bootloader 设计的好坏。一个优秀的 IAP 升级 Bootloader,必须做好升级中出现故障等异常的处理。保证系统不会崩溃,即使升级失败,也能返回升级前的程序。 有升级指令,进行初始化工作(串口、定时器、看门狗) 接收升级数据包,检测帧头、长度、帧号、数据区校验,最大程度的保证升级数据

14、的完整性、正确性。 实时检测接收状态, 10 S 内没有接收到数据或接收到的数据包都是错的,则退出升级,返回原程序。 接收的数据按照 512 字节一组写入 Flash,写入后再读出与原数据进行对比校验,校验成功后,本次编程 Flash 成功。允许连续 3 次编程 Flash,三次都不成功,退出升级程序,执行原程序。 升级成功后,更新当前程序运行区标志,跳转到新程序,同时原程序保存。本设计的 Bootload 位于 Flash 的 0x400 开始的扇区 0 存储区内,使用分散加载机制,将程序的入口地址定位到 0x00000400 处。当用户程序接收到升级指令后,就会使用函数指针跳转到这个入口处

15、。3.3.1 使用 IAP图 3-1 描述了使用 IAP 编程 Flash 所必须的步骤。3.3.1.1 定义系统参数在使用 IAP 前,需要定义一些系统参数,比如系统时钟、IAP 中断入口、输入输出缓存。 #define IAP_CLK 11059200UL#define IAP_LOCATION 0x7FFFFFF1typedef void(*IAP)(uint32 ,uint32 ); /定义函数类型指针IAP iap_entry=(IAP)IAP_LOCATION; /设置函数指针unsigned long command5 = 0,0,0,0,0;unsigned long result2= 0,0; 代码 3-1:定义系统参数3.3.1.2 选择扇区在任何擦除和编程 Flash 之前,必须选中扇区,可以选中一个或多个。 /* 名称:SelSector()* 功能:IAP 操作扇区选择,命令代码 50。* 入口参数:sec1 起始扇区* sec2 终止扇区* 出口参数:IAP 返回值(paramout 缓冲区) CMD_SUCCESS,BUSY,INVALID_SECTOR*/void SelSector(uint8 sec1, uint8 sec2)paramin0 = IAP_SELSECTOR; / 设置命令字par

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 行业资料 > 其它行业文档

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号