arm7 lpc21XX系列的IAP应用实例
2013-01-08 21:36
204 查看
/****************************************************************************
基于arm7 lpc21XX系列的IAP应用实例
* 文件名:IAPTEST.C
* 功能:LPC2100的IAP功能测试。
* 说明:调用IAP服务程序,完成FLASH编程操作。
* 将paramout添加到Watch窗口,观察返回值。
****************************************************************************/
#include "config.h"
#include "stdio.h"
#define BEEP (1 << 22)
/* 定义IAP命令字 */
#define IAP_SELSECTOR 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
#define SECTOR_NOT_PREPARED_FOR_WRITE_OPERATION 9
#define COMPARE_ERROR 10
#define BUSY 11
#define PARAM_ERROR 12 /* Insufficient number of parameters */
#define ADDR_ERROR 13 /* Address not on word boundary */
#define ADDR_NOT_MAPPED 14
#define CMD_LOCKED 15 /* Command is locked */
#define INVALID_CODE 16 /* Unlock code is invalid */
#define INVALID_BAUD_RATE 17
#define INVALID_STOP_BIT 18
uint32 paramin[8]; // IAP入口参数缓冲区
uint32 paramout[8]; // IAP出口参数缓冲区
struct jilu
{
uint32 data;
};
struct jilu Buffer={0};
struct jilu source[10];
/****************************************************************************
* 名称:SelSector()
* 功能:IAP操作扇区选择,命令代码50。
* 入口参数:sec1 起始扇区
* sec2 终止扇区
* 出口参数:IAP返回值(paramout缓冲区)
****************************************************************************/
uint32 SelSector(uint8 sec1, uint8 sec2)
{ paramin[0] = IAP_SELSECTOR; // 设置命令字
paramin[1] = sec1; // 设置参数
paramin[2] = sec2;
iap_entry(paramin, paramout); // 调用IAP服务程序
return(paramout[0]);
}
/****************************************************************************
* 名称:RamToFlash()
* 功能:复制RAM的数据到FLASH,命令代码51。
* 入口参数:dst 目标地址,即FLASH起始地址。以512字节为分界
* src 源地址,即RAM地址。地址必须字对齐
* no 复制字节个数,为512/1024/4096/8192
* 出口参数:IAP返回值(paramout缓冲区)
****************************************************************************/
uint32 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服务程序
return(paramout[0]);
}
/****************************************************************************
* 名称:EraseSector()
* 功能:扇区擦除,命令代码52。
* 入口参数:sec1 起始扇区
* sec2 终止扇区
* 出口参数:IAP返回值(paramout缓冲区)
****************************************************************************/
uint32 EraseSector(uint8 sec1, uint8 sec2)
{ paramin[0] = IAP_ERASESECTOR; // 设置命令字
paramin[1] = sec1; // 设置参数
paramin[2] = sec2;
paramin[3] = Fosc/1000; // 当不使用PLL功能时,Fcclk=Fosc
iap_entry(paramin, paramout); // 调用IAP服务程序
return(paramout[0]);
}
/****************************************************************************
* 名称:BlankCHK()
* 功能:扇区查空,命令代码53。
* 入口参数:sec1 起始扇区
* sec2 终止扇区
* 出口参数:IAP返回值(paramout缓冲区)
****************************************************************************/
uint32 BlankCHK(uint8 sec1, uint8 sec2)
{ paramin[0] = IAP_BLANKCHK; // 设置命令字
paramin[1] = sec1; // 设置参数
paramin[2] = sec2;
iap_entry(paramin, paramout); // 调用IAP服务程序
return(paramout[0]);
}
/****************************************************************************
* 名称:ReadParID()
* 功能:扇区查空,命令代码53。
* 入口参数:无
* 出口参数:IAP返回值(paramout缓冲区)
****************************************************************************/
uint32 ReadParID(void)
{ paramin[0] = IAP_READPARTID; // 设置命令字
iap_entry(paramin, paramout); // 调用IAP服务程序
return(paramout[0]);
}
/****************************************************************************
* 名称:BootCodeID()
* 功能:读取boot代码版本号,命令代码55。
* 入口参数:无
* 出口参数:IAP返回值(paramout缓冲区)
****************************************************************************/
uint32 BootCodeID(void)
{ paramin[0] = IAP_BOOTCODEID; // 设置命令字
iap_entry(paramin, paramout); // 调用IAP服务程序
return(paramout[0]);
}
/****************************************************************************
* 名称:Compare()
* 功能:校验数据,命令代码56。
* 入口参数:dst 目标地址,即RAM/FLASH起始地址。地址必须字对齐
* src 源地址,即FLASH/RAM地址。地址必须字对齐
* no 复制字节个数,必须能被4整除
* 出口参数:IAP返回值(paramout缓冲区)
****************************************************************************/
uint32 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服务程序
return(paramout[0]);
}
//====================================================================
// 名称:void Stor(void)
// 功能: 存储当前的记录
// 入口参数: 无
// 出口参数: 无
//===================================================================
uint8 Stor(void)
{ uint32 j,i,err;
uint32 *p1,*p2;
struct jilu *p ;
struct jilu *pttab0=(struct jilu *)0x0001c000;
p=source;
source[0]=Buffer; //把当前的值
//读回Flash中的前9的记录
p1=(uint32 *)source;
p2=(uint32 *)pttab0;
i=(uint32)sizeof(struct jilu);
for(j=0;j<9*i;j++)
{ *(p1+i/4)=*p2;
p1++;
p2++;
}
//把10个记录回写到FLASH中
ReadParID(); // 读器件ID
BootCodeID(); // 读Boot版本号
SelSector(14,14); // 选择扇区7
EraseSector(14,14); // 擦除扇区7
BlankCHK(14,14); // 查空扇区7
SelSector(14,14); // 选择扇区7
err=RamToFlash(0x0001c000,(uint32)p, 512);
return err;
}
//----------------------------------------------------------------------------
//名称:FlashToRAM()
//功能: 把Flash中的数据放在source[]中
//入口参数: 无
//出口参数: 无
//----------------------------------------------------------------------------
void FlashToRAM(void)
{
uint32 j,i;
uint32 *p1,*p2;
struct jilu *pttab0=(struct jilu *)0x0001c000;
//读回Flash中的10个记录
p1=(uint32 *)source;
p2=(uint32 *)pttab0;
i=(uint32)sizeof(struct jilu);
for(j=0;j<9*i;j++)
{ *p1=*p2;
p1++;
p2++;
}
}
/*
int main (void)
{ uint8 i;
PINSEL0 = 0x00000000; // 设置所有管脚连接GPIO
PINSEL1 = 0x00000000;
for(i=0;i<10;i++)
{
Buffer.data=i;
Stor();
}
FlashToRAM();
while(1);
return 0;
}
*/
提供一个参考版的代码,项目中的代码不提供,谢绝索取,这个够用了。
基于arm7 lpc21XX系列的IAP应用实例
* 文件名:IAPTEST.C
* 功能:LPC2100的IAP功能测试。
* 说明:调用IAP服务程序,完成FLASH编程操作。
* 将paramout添加到Watch窗口,观察返回值。
****************************************************************************/
#include "config.h"
#include "stdio.h"
#define BEEP (1 << 22)
/* 定义IAP命令字 */
#define IAP_SELSECTOR 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
#define SECTOR_NOT_PREPARED_FOR_WRITE_OPERATION 9
#define COMPARE_ERROR 10
#define BUSY 11
#define PARAM_ERROR 12 /* Insufficient number of parameters */
#define ADDR_ERROR 13 /* Address not on word boundary */
#define ADDR_NOT_MAPPED 14
#define CMD_LOCKED 15 /* Command is locked */
#define INVALID_CODE 16 /* Unlock code is invalid */
#define INVALID_BAUD_RATE 17
#define INVALID_STOP_BIT 18
uint32 paramin[8]; // IAP入口参数缓冲区
uint32 paramout[8]; // IAP出口参数缓冲区
struct jilu
{
uint32 data;
};
struct jilu Buffer={0};
struct jilu source[10];
/****************************************************************************
* 名称:SelSector()
* 功能:IAP操作扇区选择,命令代码50。
* 入口参数:sec1 起始扇区
* sec2 终止扇区
* 出口参数:IAP返回值(paramout缓冲区)
****************************************************************************/
uint32 SelSector(uint8 sec1, uint8 sec2)
{ paramin[0] = IAP_SELSECTOR; // 设置命令字
paramin[1] = sec1; // 设置参数
paramin[2] = sec2;
iap_entry(paramin, paramout); // 调用IAP服务程序
return(paramout[0]);
}
/****************************************************************************
* 名称:RamToFlash()
* 功能:复制RAM的数据到FLASH,命令代码51。
* 入口参数:dst 目标地址,即FLASH起始地址。以512字节为分界
* src 源地址,即RAM地址。地址必须字对齐
* no 复制字节个数,为512/1024/4096/8192
* 出口参数:IAP返回值(paramout缓冲区)
****************************************************************************/
uint32 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服务程序
return(paramout[0]);
}
/****************************************************************************
* 名称:EraseSector()
* 功能:扇区擦除,命令代码52。
* 入口参数:sec1 起始扇区
* sec2 终止扇区
* 出口参数:IAP返回值(paramout缓冲区)
****************************************************************************/
uint32 EraseSector(uint8 sec1, uint8 sec2)
{ paramin[0] = IAP_ERASESECTOR; // 设置命令字
paramin[1] = sec1; // 设置参数
paramin[2] = sec2;
paramin[3] = Fosc/1000; // 当不使用PLL功能时,Fcclk=Fosc
iap_entry(paramin, paramout); // 调用IAP服务程序
return(paramout[0]);
}
/****************************************************************************
* 名称:BlankCHK()
* 功能:扇区查空,命令代码53。
* 入口参数:sec1 起始扇区
* sec2 终止扇区
* 出口参数:IAP返回值(paramout缓冲区)
****************************************************************************/
uint32 BlankCHK(uint8 sec1, uint8 sec2)
{ paramin[0] = IAP_BLANKCHK; // 设置命令字
paramin[1] = sec1; // 设置参数
paramin[2] = sec2;
iap_entry(paramin, paramout); // 调用IAP服务程序
return(paramout[0]);
}
/****************************************************************************
* 名称:ReadParID()
* 功能:扇区查空,命令代码53。
* 入口参数:无
* 出口参数:IAP返回值(paramout缓冲区)
****************************************************************************/
uint32 ReadParID(void)
{ paramin[0] = IAP_READPARTID; // 设置命令字
iap_entry(paramin, paramout); // 调用IAP服务程序
return(paramout[0]);
}
/****************************************************************************
* 名称:BootCodeID()
* 功能:读取boot代码版本号,命令代码55。
* 入口参数:无
* 出口参数:IAP返回值(paramout缓冲区)
****************************************************************************/
uint32 BootCodeID(void)
{ paramin[0] = IAP_BOOTCODEID; // 设置命令字
iap_entry(paramin, paramout); // 调用IAP服务程序
return(paramout[0]);
}
/****************************************************************************
* 名称:Compare()
* 功能:校验数据,命令代码56。
* 入口参数:dst 目标地址,即RAM/FLASH起始地址。地址必须字对齐
* src 源地址,即FLASH/RAM地址。地址必须字对齐
* no 复制字节个数,必须能被4整除
* 出口参数:IAP返回值(paramout缓冲区)
****************************************************************************/
uint32 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服务程序
return(paramout[0]);
}
//====================================================================
// 名称:void Stor(void)
// 功能: 存储当前的记录
// 入口参数: 无
// 出口参数: 无
//===================================================================
uint8 Stor(void)
{ uint32 j,i,err;
uint32 *p1,*p2;
struct jilu *p ;
struct jilu *pttab0=(struct jilu *)0x0001c000;
p=source;
source[0]=Buffer; //把当前的值
//读回Flash中的前9的记录
p1=(uint32 *)source;
p2=(uint32 *)pttab0;
i=(uint32)sizeof(struct jilu);
for(j=0;j<9*i;j++)
{ *(p1+i/4)=*p2;
p1++;
p2++;
}
//把10个记录回写到FLASH中
ReadParID(); // 读器件ID
BootCodeID(); // 读Boot版本号
SelSector(14,14); // 选择扇区7
EraseSector(14,14); // 擦除扇区7
BlankCHK(14,14); // 查空扇区7
SelSector(14,14); // 选择扇区7
err=RamToFlash(0x0001c000,(uint32)p, 512);
return err;
}
//----------------------------------------------------------------------------
//名称:FlashToRAM()
//功能: 把Flash中的数据放在source[]中
//入口参数: 无
//出口参数: 无
//----------------------------------------------------------------------------
void FlashToRAM(void)
{
uint32 j,i;
uint32 *p1,*p2;
struct jilu *pttab0=(struct jilu *)0x0001c000;
//读回Flash中的10个记录
p1=(uint32 *)source;
p2=(uint32 *)pttab0;
i=(uint32)sizeof(struct jilu);
for(j=0;j<9*i;j++)
{ *p1=*p2;
p1++;
p2++;
}
}
/*
int main (void)
{ uint8 i;
PINSEL0 = 0x00000000; // 设置所有管脚连接GPIO
PINSEL1 = 0x00000000;
for(i=0;i<10;i++)
{
Buffer.data=i;
Stor();
}
FlashToRAM();
while(1);
return 0;
}
*/
提供一个参考版的代码,项目中的代码不提供,谢绝索取,这个够用了。
相关文章推荐
- 进程间通信系列 之 命名管道FIFO及其应用实例
- 大话西游之Office应用实例系列!<目录>
- MsChart教程系列之实例操作数据绑定(交叉表)应用
- Spring系列之简单的应用实例
- Android深入浅出系列之实例应用—手机页面之间的跳转
- Silverlight实用窍门系列:25.Silverlight多线程技术Timer的应用,模拟心电图、模拟CPU、内存状态图【附带源码实例】
- [WCF安全系列]实例演示:TLS/SSL在WCF中的应用[HTTPS]
- 进程间通信系列 之 命名管道FIFO及其应用实例
- Windows 8 Store应用开发XAML实例教程系列汇总
- S3C2416裸机开发系列九_GCC启动代码工程应用实例
- angularJS系列之指令directive应用实例
- 大话西游之Office应用实例系列! <19>
- Android深入浅出系列之实例应用—手机页面之间的跳转
- Android深入浅出系列之实例应用—开机就运行自定义的程序BroadcastReceiver和intent-filter的用法
- GEF入门系列(三、应用实例)
- Android深入浅出系列之实例应用—如何在一个Activity里调用另外一个Activity?
- Android深入浅出系列之实例应用—具有自动提示的菜单应用AutoCompleteTextView和ArrayAdapter的使用
- Android深入浅出系列之实例应用—如何在一个Activity里调用另外一个Activity?
- Silverlight,Windows 8应用开发实例教程系列汇总
- Android深入浅出系列之实例应用—弹出消息Toast对象的使用纯文本方式(一)