arm7 lpc21XX系列的IAP应用实例
来源:互联网 发布:易语言access sql查询 编辑:程序博客网 时间:2024/05/16 10:48
/****************************************************************************
基于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应用实例
- 基于Proteus的ARM7 LPC21XX学习笔记三、GPIO输出实例
- 周立功lpc21xx/lpc22xx系列ARM7启动代码分析
- 周立功lpc21xx/lpc22xx系列ARM7启动代码分析
- LPC21XX系列ARM7驱动RTC RX8025(I/O模拟IIC)
- 基于Proteus的ARM7 LPC21XX学习笔记一、在Realview MDK 4.12下新建一个项目文件
- 基于Proteus的ARM7 LPC21XX学习笔记二、在proteus 7.7 sp2下新建一个电路仿真文件
- ARM7系列LPC2214芯片的调试报告
- STM32F030的IAP应用简介
- LPC21XX系列ARM微处理器ISP升级程序设计
- LPC21XX系列ARM微处理器ISP升级程序设计
- IAP一个实例---LPC2214的IAP实现方案
- ARM7 LPC2378 远程升级----ISP与IAP
- ARM7 LPC2378 远程升级----IAP函数
- 关于proteus仿真arm7实例出现错误的问题
- Spring系列之简单的应用实例
- iOS应用内支付(IAP)的注意事项
- iOS应用内支付(IAP)的注意事项
- CSS元素的定位属性position
- jQuery Form Plugin( ajax表单提交 )
- 根据IP地址获取对应的MAC地址
- redis配置文件redis.conf的详细说明
- Python lambda介绍
- arm7 lpc21XX系列的IAP应用实例
- 一篇好文章带你走出阴霾
- 协调多个对象之间的交互——中介者模式(三)
- 静态库与动态库区别
- poj 3298 数状数组
- 福布斯:谷歌应拆分为三家公司吗?
- C3P0数据库连接池【JAVA】-oracle数据库为例
- 第一周
- 金士顿推出1TB闪存式U盘 达到USB 3.0标准