微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > 基于IAP和Keil MDK的远程升级设计

基于IAP和Keil MDK的远程升级设计

时间:12-19 来源:互联网 点击:

内 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

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top