|
关于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
}
|
|