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

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

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

MD_SUCCESS,SRC_ADDR_ERROR,DST_ADDR_ERROR,

SRC_ADDR_NOT_MAPPED,DST_ADDR_NOT_MAPPED,COUNT_ERROR,BUSY,未选择扇区

********************************************************************/

void RamToFlash(uint32 dst, uint32 src, uint32 no)

{ paramin[0] = IAP_RAMTOFLASH; // 设置命令字

paramin[1] = dst; // 设置参数

paramin[2] = src;

paramin[3] = no;

paramin[4] = Fosc/1000; // 当不使用PLL功能时,Fcclk=Fosc

iap_entry(paramin, paramout); // 调用IAP服务程序

}

代码3-4 编程扇区

3.3.1.5 比较数据

通过这个函数,可以检查写入Flash中的数据和RAM中的是否相同。

注意源地址、目标地址和字节数必须是4的倍数。可使用Keil MDK提供的关键字__align(n) 来指定n字节对齐。

/********************************************************************

* 名称:Compare()

* 功能:校验数据,命令代码56。

* 入口参数:dst 目标地址,即RAM/FLASH起始地址。地址必须字对齐

* src 源地址,即FLASH/RAM地址。地址必须字对齐

* no 复制字节个数,必须能被4整除

* 出口参数:IAP返回值(paramout缓冲区) CMD_SUCCESS,COMPARE_ERROR,ADDR_ERROR

******************************************************************/

void Compare(uint32 dst, uint32 src, uint32 no)

{ paramin[0] = IAP_COMPARE; // 设置命令字

paramin[1] = dst; // 设置参数

paramin[2] = src;

paramin[3] = no;

iap_entry(paramin, paramout); // 调用IAP服务程序

代码3-5 比较数据

3.3.2 IAP编程期间的中断管理

LPC2114片上Flash在擦除/编程期间绝不可被中断打断。但Bootloader中定时和串口接收又使用了中断,因此必须在擦除/编程之前禁止总中断,待操作完成后再使能总中断。Bootloader运行在用户模式下,不具有禁止/使能中断的权力,所以在本设计中使用软中断禁止/使能总中断。Keil MDK提供了关键字__svc来触发软中断。

软中断函数声明:

__svc(0x00) void EnableIrq(void); //使能中断,软中断0

__svc(0x01) void DisableIrq(void); //禁止中断,软中断1

软中断函数代码:

/*

*********************************************************************

* 功 能:禁止中断

* 描 述:利用软中断实现在用户模式下调用函数关中断

*********************************************************************/

void DisableIrqFunc(void)

{

int temp;

__asm

{

MRS temp,SPSR

ORR temp,temp,#0x80

MSR SPSR_c,temp

}

}

/*

********************************************************************

* 功 能:使能中断

* 描 述:利用软中断实现在用户模式下调用函数开中断

********************************************************************

*/

void EnableIrqFunc(void)

{

int temp;

__asm

{

MRS temp,SPSR

BIC temp,temp,#0x80

MSR SPSR_c,temp

}

}

代码3-6 禁止/使能总中断

更改启动代码,挂接软中断入口:

;软中断入口

EXPORT SWI_Handler

extern EnableIrq1

extern DisableIrq1

SWI_Handler

STMFD SP!, {R0,R12,LR} ;入栈

LDR R0, [LR,#-4] ;取软中断指令,软中断号就包含其中

BIC R0,R0,#0xFF000000

CMP R0,#0 ;判断是否软中断0

BLEQ EnableIrqFunc

BLNE DisableIrqFunc

LDMFD SP!,{R0,R12,PC}^

代码3-7 挂接软中断入口

在程序中,如果想禁止中断,只需使用DisableIrq();若是能中断,只需使用EnableIrq()。

3.3.3 使用分散加载机制精确定位入口地址

应用程序接收到升级指令后,会跳转到0x00000400处执行Bootloader升级程序。因此Bootloader程序的入口地址必须精确定位到0x00000400处。这可以使用Keil MDK提供的分散加载机制来完成。

分散加载代码见代码3-8.

; *************************************************************

; *** Scatter-Loading Description File generated by uVision ***

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

网站地图

Top