关于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);