5178|9

58

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

关于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
}
此帖出自ARM技术论坛

最新回复

你好,小弟还有问题,C中,怎样将 内存变量按指定地址存储? 比如存储  uint8 a=6;按地址为0x4000ff00;存储。  详情 回复 发表于 2010-4-13 23:13
点赞 关注
 

回复
举报

79

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
1.  将flash的数据读取到RAM中,指定地址直接读就可以了,与IAP无关
2.  如何判断写入不成功?选择扇区成功了么?擦除扇区成功了么?
    出现问题一步一步调试吧,找到具体出错的位置就很容易解决了
此帖出自ARM技术论坛
 
 
 

回复

72

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
楼主可以去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
此帖出自ARM技术论坛
 
 
 

回复

56

帖子

0

TA的资源

一粒金砂(初级)

4
 
请问楼主是否用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
此帖出自ARM技术论坛
 
 
 

回复

82

帖子

0

TA的资源

一粒金砂(初级)

5
 
谢谢 大家,我先登陆周立功网站找点资料看看先,等再碰到问题,继续跟高手们请教。
此帖出自ARM技术论坛
 
 
 

回复

74

帖子

0

TA的资源

一粒金砂(初级)

6
 
尊敬的各位高手,我还是没有搞定啊。
dsoyy,LPC2138片子到底哪个地址空间是我可以用的?
还有,存进FLASH里面的数据元素怎样提取出到RAM里来?
我一直没搞好。
求帮忙解决。感谢!
此帖出自ARM技术论坛
 
 
 

回复

82

帖子

0

TA的资源

一粒金砂(初级)

7
 
还有,存进FLASH里面的数据元素怎样提取出到RAM里来?
----------
给个地址直接读就可以. 比如你想读0x100000处的一个字,可以像这样
unsigned int word32;
word32 = *((unsigned int *)0x100000);
此帖出自ARM技术论坛
 
 
 

回复

78

帖子

0

TA的资源

一粒金砂(初级)

8
 
可是问题我安LPC2138片内最后一个地址写入的,可总是回馈出写入失败。。。
此帖出自ARM技术论坛
 
 
 

回复

86

帖子

0

TA的资源

一粒金砂(初级)

9
 
请高手给个实例代码可以吗?
在这里公布或者发到我的邮件 hanbing086@163.com里。
此帖出自ARM技术论坛
 
 
 

回复

75

帖子

0

TA的资源

一粒金砂(初级)

10
 
你好,小弟还有问题,C中,怎样将 内存变量按指定地址存储?
比如存储  uint8 a=6;按地址为0x4000ff00;存储。
此帖出自ARM技术论坛
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表