基于IAP和Keil MDK的远程升级设计
内 Flash 存储器的一个或多个扇区。boot 扇区不能由该命令擦除。要擦除单个扇区可将起始和结束扇区号设定为相同值。 扇区查空53该命令用于对片内 Flash 存储器的一个或多个扇区进行查空。要查空单个扇区可将起始和结束扇区号设定为相同值。 读器件ID54该命令用于读取器件的 ID 号。 读Boot版本55该命令用于读取 boot 代码版本号。 IAP比较56该命令用来比较两个地址单元的存储器内容。当源或目标地址包含从地址0 开始的前64字节中的任意一个时,比较的结果不一定正确。前64字节重新映射到Flash boot 扇区。 2.3 IAP 编程函数接口 IAP 功能可用下面的C 代码来调用。 定义 IAP 程序的入口地址。由于IAP 地址的第0 位是1,因此,当程序计数器转移到该地址时会引起Thumb 指令集的变化。 #define IAP_LOCATION 0x7ffffff1 定义数据结构或指针,将IAP 命令表和结果表传递给IAP 函数 unsigned long command[5]; unsigned long result[2]; 定义函数类型指针,函数包含2 个参数,无返回值。注意: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升级实现过程 由于在升级程序软件设计中,分散加载机制、中断向量的重映射、软中断等的实现还与所使用的编译器紧密相关,因此,本文结合Keil MDK(V4.10)编译工具,来详细阐述升级程序的实现过程。 3.1 总体思路 分站上电后,首先运行位于Flash 0x000~0x3FF中的跳转程序。跳转程序会读取位于14扇区的当前程序运行标志,如果该扇区的最低四个字节为0x00010000,表示当前程序运行在高区,跳转程序会跳转到Flash的0x00010000处执行用户程序;如果该标志区的最低四个字节为0x00008000,表示当前程序运行在低区,跳转程序会跳转到Flash的0x00002000处执行用户程序。用户程序正常执行后,会按照设计进行正常的程序采集、数据处理传送。当接收到升级命令后,用户程序会跳转到Flash的0x00000400处的Bootloader处进行升级的一些操作。当升级成功后,Bootloader程序更新当前程序运行区标志,程序跳转到新程序处运行,如果升级不成功,返回升级前的程序。 流程图如下所示: 3.2 跳转程序的设计 跳转程序是分站上电后最先运行的程序,根据当前程序运行区标志,跳转到相应的用户程序区执行。本段程序占用Flash的最低1K字节空间,与Bootloader同在第0扇区。 跳转程序的启动代码仅初始化堆栈,不使用PLL和存储加速功能。代码1描述了跳转程序的主要启动代码。 ; Enter User Mode and set its Stack Pointer MSR CPSR_c, #Mode_USR MOV SP, R0 SUB SL, SP, #USR_Stack_Size ; Enter the C code IMPORT __main LDR R0, =__main BX R0 代码1:跳转程序启动代码 当跳转程序确定要跳转到高区用户程序或者低区用户程序后,使用函数指针跳转到0x00010000处(高区用户函数入口地址)或0x00002000处(低区用户函数入口地址)。 定义函数指针: void (*UserProgram)() ; 指定入口地址: UserProgram = (void (*)()) (0x00010000); UserProgram = (void (*)()) (0x00002000); 实现跳转: (*UserProgram)() ; 要将用户代码精确定位到Flash的0x00010000处(高区用户函数入口地址)或0x00002000处(低区用户函数入口地址),需要使用编译器的分散加载机制,将在Bootloader中详细描述实现过程。 另外,跳转程序还在烧录代码的同时初始化当前程序运行区标志,即对Flash的0x0001C000地址处写入0x00008000,表示当前用户程序在低区。主要使用了编译器的__at关键字:精确定位变量。需要注意的是,使用该关键字必须包含头文件absacc.h。 const uint32 x __at(0x0001C
- MSP43F149系列单片机的IAP功能设计(09-08)
- 基于IAP的STM32程序更新技术(01-23)
- STM32 IAP 无法运行用户程序的解决方法(12-03)
- STC单片机 EEPROM/IAP 功能测试程序演示(12-01)
- 9G-STM32 简易BOOT及XMODEM串口IAP移植过程简介(11-29)
- STC IAP片子的仿真功能(11-28)