标题:
LPC21XX的BootLoader的实现
[打印本页]
作者:
yuyang911220
时间:
2014-10-26 12:05
标题:
LPC21XX的BootLoader的实现
由于工作需要,用到
ARM7
的芯片
LPC2132
的
IAP
,初次接触
ARM7
,历时
2
天时间,终于成功完成
BootLoader
的编写,下面和大家分享一下使用心得,方便大家的使用。
要完成
BootLoader
,首先得实现
IAP
。
LPC21XX
的
IAP
使用比较简单,芯片手册上有具体介绍,我就不多说了。主要用到以下几个函数。
以下是一些定义:
#define IAP_ENTER_ADR
0x7FFFFFF1
// IAP
入口地址定义
/*
*
定义
IAP
命令字
*/
#define IAP_Prepare
50
#define IAP_RAMTOFLASH
51
#define IAP_ERASESECTOR
52
#define IAP_BLANKCHK
53
#define IAP_READPARTID
54
#define IAP_BOOTCODEID
55
#define IAP_COMPARE
56
/*
*
定义
IAP
返回状态字
*/
#define CMD_SUCCESS
0
#define INVALID_COMMAND
1
#define SRC_ADDR_ERROR
2
#define DST_ADDR_ERROR
3
#define SRC_ADDR_NOT_MAPPED
4
#define DST_ADDR_NOT_MAPPED
5
#define COUNT_ERROR
6
#define INVALID_SECTOR
7
#define SECTOR_NOT_BLANK
8
#defineSECTOR_NOT_PREPARED_FOR_WRITE_OPERATION
9
#define COMPARE_ERROR
10
#define BUSY
11
/*
*
定义
CCLK
值大小,单位为
KHz
*/
#define IAP_FCCLK
(60000)
/*
此频率值必须同主频相同
*/
#define EEPROM_STARTSEC
4
#define EEPROM_ENDSEC
8
#define EE_SUUCEESS
0
#define IAP_ERROR
1
#define PARA_BANK_ERROR
2
#define PARA_SRCADDR_ERROR
3
#define PARA_OVERFLOW_ERROR
4
//IAP
写入字节数
typedef enum
{
MODE0 = 256,
MODE1 = 512,
MODE2= 1024,
MODE3 = 4096,
}IAPWRITEMODE;
//IAP
擦除的扇区
typedef enum
{
SECTOR0,
SECTOR1,
SECTOR2,
SECTOR3,
SECTOR4,
SECTOR5,
SECTOR6,
SECTOR7,
SECTOR8,
}IAPCHANNEL;
IAP
函数实现:
/*
*
定义函数指针
*/
void (*IAP_Entry) (unsigned longulParam_tab[], unsigned long ulPesult_tab[]) = (void(*)())IAP_ENTER_ADR;
unsigned long
GulParamin[8]; /* IAP
入口参数缓冲区
*/
unsigned long
GulParamout[8];
/*
IAP
出口参数缓冲区
*/
/*********************************************************************************************************
** Function name:
sectorPrepare
** Descriptions:
IAP
操作扇区选择,命令代码
50
** input parameters:
ucSec1:
起始扇区
**
ucSec2:
终止扇区
** output parameters:
GulParamout[0]:
IAP
操作状态码
,IAP
返回值
** Returned value:
GulParamout[0]:
IAP
操作状态码
,IAP
返回值
*********************************************************************************************************/
unsigned long
sectorPrepare (unsigned char
ucSec1, unsigned char
ucSec2)
{
GulParamin[0] = IAP_Prepare; /*
设置命令字
*/
GulParamin[1] = ucSec1; /*
设置参数
*/
GulParamin[2] = ucSec2;
(*IAP_Entry)(GulParamin, GulParamout); /*
调用
IAP
服务程序
*/
return (GulParamout[0]); /*
返回状态码
*/
}
/*********************************************************************************************************
** Function name:
ramCopy
** Descriptions:
复制
RAM
的数据到
FLASH
,命令代码
51
** input parameters:
ulDst:
目标地址,即
FLASH
起始地址。以
512
字节为分界
**
ulSrc:
源地址,即
RAM
地址。地址必须字对齐
**
ulNo:
复制字节个数,为
512/1024/4096/8192
** output parameters:
GulParamout[0]:
IAP
操作状态码
,IAP
返回值
** Returned value:
GulParamout[0]:
IAP
操作状态码
,IAP
返回值
*********************************************************************************************************/
unsigned long
ramCopy (unsigned long
ulDst, unsigned long
ulSrc, unsigned long
ulNo)
{
GulParamin[0] = IAP_RAMTOFLASH; /*
设置命令字
*/
GulParamin[1] = ulDst; /*
设置参数
*/
GulParamin[2] = ulSrc;
GulParamin[3] = ulNo;
GulParamin[4] = IAP_FCCLK;
(*IAP_Entry)(GulParamin, GulParamout); /*
调用
IAP
服务程序
*/
return (GulParamout[0]); /*
返回状态码
*/
}
/*********************************************************************************************************
** Function name:
sectorErase
** Descriptions:
扇区擦除,命令代码
52
** input parameters:
ucSec1
起始扇区
**
ucSec2
终止扇区
92
** output parameters:
GulParamout[0]:
IAP
操作状态码
,IAP
返回值
** Returned value:
GulParamout[0]:
IAP
操作状态码
,IAP
返回值
*********************************************************************************************************/
unsigned long
sectorErase (unsigned char ucSec1, unsignedchar
ucSec2)
{
GulParamin[0] = IAP_ERASESECTOR; /*
设置命令字
*/
GulParamin[1] = ucSec1; /*
设置参数
*/
GulParamin[2] = ucSec2;
GulParamin[3] = IAP_FCCLK;
(*IAP_Entry)(GulParamin, GulParamout); /*
调用
IAP
服务程序
*/
return (GulParamout[0]); /*
返回状态码
*/
}
欢迎光临 电子技术论坛_中国专业的电子工程师学习交流社区-中电网技术论坛 (http://bbs.eccn.com/)
Powered by Discuz! 7.0.0