关于ARM7 LPC2138芯片的IAP应用,碰到棘手难题,
发布时间:2010-06-14 15:56:49 文章来源:www.iduyao.cn 采编人员:星星草
关于ARM7 LPC2138芯片的IAP应用,碰到棘手难题,求助!
typedef struct
{
uint32 Num;
uint32 Data;
} DNum,*pIDNum;
#define IAP_ENTER_ADR 0x7FFFFFF1 // IAP入口地址定义
#define FLASHLOCATION 0x0001000 //FLASH空闲地址 0x00010000H:十进制65536,65536/1024/4(每4K一个扇区)=第16扇区
DNum DNumRam; //RAM中的结构体变量
FlashToRam 第一个问题,这是一个将FLASH内容提取到RAM中的函数,请问可存在问题?
uint32 FlashToRam(void)
{uint32 resut;
resut=DNumRam.Num;
return resut;
}
uint32 RamToFlash(uint32 dst, uint32 src, uint32 no)
{
paramin[0] = IAP_RAMTOFLASH; // 设置命令字
paramin[1] = dst; // 设置参数
paramin[2] = src;
paramin[3] = no;
paramin[4] = IAP_FCCLK;
(*IAP_Entry)(paramin, paramout); // 调用IAP服务程序
return(paramout[0]); // 返回状态码
}
/*
RamToFlash(0x00007000, (uint32)SendData, 512); // 写数据到扇区1
*/
uint32 WrFlash(uint8 beginSQ,uint8 endSQ,uint32 FlashAdd,uint32 RamAdd,uint32 bytLen)
{ uint32 result;
ReadParID(); // 读器件ID
BootCodeID(); // 读Boot版本号
SelSector(beginSQ,endSQ); // 选择扇区1
EraseSector(beginSQ,endSQ); // 擦除扇区1
BlankCHK(beginSQ,endSQ) ; // 查空扇区1
SelSector(beginSQ,endSQ); // 选择扇区1
RamToFlash(FlashAdd, RamAdd, bytLen); // 写数据到扇区1
if(Compare(FlashAdd, RamAdd, bytLen) == CMD_SUCCESS)
{
result=TRUE;
}
else
{
result=FALSE;
}
return result;
}
第二个问题:为什么总是出现写入数据命令执行不成功????请问LPC2138的IAP具体应该怎么做啊?
急疯了,我!!!
if(WrFlash(1,1,FLASHLOCATION, (uint32)RamLocation, 256)==TRUE)
{ IO1CLR = LEDS8 & (1 << (18+2)); // 点亮LED4
for (i=0; i<0x1FFFFF; i++);
IO0SET=LEDS8 & (1 << (18+2));
}
else
{
IO1CLR = LEDS8 & (1 << (18+2)); // 点亮LED4
for (i=0; i<0x2FFFFF; i++);
IO1SET = LEDS8 & (0xFF << (18));// 熄灭所有LED
for (i=0; i<0x4FFFFF; i++);
IO1CLR = LEDS8 & (1 << (18+2)); // 点亮LED4
for (i=0; i<0x2FFFFF; i++);
IO1SET = LEDS8 & (0xFF << (18));// 熄灭所有LED
}
------解决方案--------------------
楼主可以去NXP的官网,有关于这方面的应用设计,可以参考下。
楼主好好看看下下面两个文档吧:
Using IAP for LPC2000 ARM devices (2004-10-25):
http://www.nxp.com/documents/application_note/AN10256.pdf
LPC2000 secondary bootloader for code update using IAP (2009-05-26):
http://www.cn.nxp.com/documents/application_note/AN10835.pdf
------解决方案--------------------
请问楼主是否用ADS?
记得IAP在www.zlgmcu.com上面有技术文档,你可以使用网站搜索功能,有文档和例程。
你需要调整分散加载,预留出RAM的前32个字节,这个用分散加载实现。
其实ADS需要设置C和汇编混合编程,否则是写不进FLASH的。
还有你写的扇区要确保里面没有执行代码。
uint32 FlashToRam(void)
{uint32 resut;
resut=DNumRam.Num;
return resut;
}
这个函数我怎么觉得是一条赋值语句啊,ZLG网站的资料您好好阅读,虽然不是2138但是NXP的几乎雷同只要扇区分布不同而已,而且还有例程,如果您找不到可以留言给我。
我年前做了一个用SD卡自动更新程序的功能,用过IAP
------解决方案--------------------
还有,存进FLASH里面的数据元素怎样提取出到RAM里来?
----------
给个地址直接读就可以. 比如你想读0x100000处的一个字,可以像这样
unsigned int word32;
word32 = *((unsigned int *)0x100000);
友情提示:
信息收集于互联网,如果您发现错误或造成侵权,请及时通知本站更正或删除,具体联系方式见页面底部联系我们,谢谢。
其他相似内容:
-
c51串口求助!
串口接收程序如下
void rec_gps(void) interrupt 4 {
uchar str;
uint i,k;
k=0;
i=0;...
-
win7运行CodeWarrior IDE出错
我的本安装了CodeWarrior IDE,一运行就会出现提示:
IDE 4.1 Build 0622 已停止工作。
或者提示:
Unha...
-
关于AT指令控制GSM短信猫的问题
C/C++ code
打开串口
BOOL CComm::OpenComm(const char* pPort,
int nBaudRa...
-
关于51中断求教
各位大虾,我现在要做一个GPS授时的小程序,遇到如下困惑,求大虾们解答:
1 线路板上带有时钟芯片,平时显示时间是...
-
atd指令拨号,如何判断电话状态
在网上找了许久,终于找到一位仁心解决方案,这个指令是可以得到手机当时的状态,但是不管是空号、欠费、...
-
知道在哪跑飞,跑飞的详细原因有谁能解释一下。
今天出现这样的问题:
将这个中断函数注释掉:
#pragma vector=USCI_B2_VECTOR
__in...
-
51程序移植到2051
大牛们,我想吧一个51的程序移植到2051中,用NXP的89V51芯片时用到的I/O口只有P1.0 P1.1 P1.2 3三个,我现在移植到AT...
-
一道课程设计题:基于单片机的波形发生器的设计
设计要求:
1.能产生正弦波、方波、三角波、锯齿波等4种周期性波形,并且可通过调节变...
-
解析单片机最小系统及相关电路
原文出自:电子发烧友论坛——单片机论坛[color=#FF0000][/color]
单片机最小系统单片机最小系统介...
-
单片机学习书籍大全推荐
在电子发烧友论坛里看到了单片机学习资料汇总,特地搜罗了过来,不知道大家看过几本,也希望让需要学习的人 都...