首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 嵌入开发 > 单片机 >

关于ARM7 LPC2138芯片的IAP应用,碰到棘手难题,

2012-02-25 
关于ARM7 LPC2138芯片的IAP应用,碰到棘手难题,求助!typedef struct{uint32Numuint32Data} DNum,*pIDNum

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

热点排行