打印
[ZLG-ARM]

请问下,我想指定一个地址给一个全局数组,该怎么写?

[复制链接]
1729|6
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
liuyu305|  楼主 | 2008-3-12 14:36 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
 SelSector(8,8);                                         // 选择扇区8
 RamToFlash((0x00008000+flag[3]*256),(uint32)dd, 256);   // 写数据到扇区8
err = Compare((0x00008000+flag[3]*256), (uint32)dd, 256);    // 比较数据

我没有设置dd这个数组的地址,运行的时候比较数据是对的

uint8 *p = ((uint8*)0x00008000);
while (1)                       //读取FLASH,并通过UART0发送到上位机
        {
        uart0_sendstr( p ,1 );
        p++;
        }


我用上面的程序读FLASH,结果发现出来的全是FF,

有哪位大哥,大姐熟悉IAP的。。。给指点下啊
        

相关帖子

沙发
zlgarm| | 2008-3-12 16:16 | 只看该作者

IAP

LIUYU305 您好!
    1、RamToFlash(uint32 dst,uint32 src,uint32 no);其中dst为Flash扇区的起始地址,如果再加(flag[3]*256)就非起始地址了
    2、在对Flash操作之前首先执行擦除操作
                         By zlgarm_lijintao

使用特权

评论回复
板凳
liuyu305|  楼主 | 2008-3-12 17:09 | 只看该作者

回ZLGARM

非常感谢ZLGARM的解答。


我在《深入潜出》的书上看到的是
其中dst为要写入数据字节的目标FLASH地址,
因为我每次采集数据的为256字节,那么我要连续存储的时候就需要步进个地址了,所以我才加了(flag[3]*256)。我的flag[]起始是0,而且我也把(flag[3]*256)给去掉,结果发现读出来的还是FF。

我在对Flash操作之前已经对扇区8擦除了,(我用的是2142)很奇怪的是,我用了比较校准的操作了,返回的也是成功的。

我现在怀疑的问题是
1。SRC要求字对准,我的(uint32)dd指针没有设置,也许在编译的时候没字对准,但是效验返回的是成功。
2。我的读FLASH的函数是错误的。

谢谢ZLGARM的解答。希望知道我错误地方的大哥大姐,小弟想占用您几分钟,请您帮我指出来。。。

谢谢

使用特权

评论回复
地板
liuyu305|  楼主 | 2008-3-13 10:03 | 只看该作者

回LS

我现在用的是LPC2142,ADS1。2用的是在网上找的LPC214X的模板

使用特权

评论回复
5
zlgarm| | 2008-3-13 10:06 | 只看该作者

to liuyu305

liuyu305,您好!
    您的程序没错,刚才我做了同样的实验,UART串口波特率设置为115200bps,看到的也是0xFF,主要是读Flash的速度太快了,一下就把您有用的数据读完,等您反应过来,已经读到无效数据了,当然是0xFF了。建议您把波特率改小点,例如1200bps,就可以通过串口调试软件观察到。你也可以通过设置一个数组,把读Flash的数据放在数组中,单步调试,观察起来更明显。
                                  By zlgarm_wuzhijian

使用特权

评论回复
6
liuyu305|  楼主 | 2008-3-13 12:55 | 只看该作者

回ZLGARM

谢谢zlgarm_wuzhijian,您的验证。让我放心了很多,对于我的程序。

我现在找到错误的地方了,现在发现不是波特率的问题,而是我程序初始化部分的问题,我在main初始化的部分加了对扇区的擦除和查空的语句,结果发现是这个语句导致的错误,我现在把这几个语句给去掉,就是可以正确读出我存的数据了。


uint8 i;
uint8 *p = ((uint8 *)0x00008000);
IAP_Entry = (void(*)())IAP_ENTER_ADR;           // 初始化函数指针IAP_Entry
SelSector(8,8);                                 // 在对FLASH进行擦除或者写入前必须先选择扇区,选择扇区8
EraseSector(8,8);                               // 擦除扇区8
BlankCHK(8,8) ;                                 // 查空扇区8
PINSEL0 = 0x00000025;       //设置UART,CAP0.0
PINSEL1 = 0x1A040000;       //设置AD0.3,AD0.4,CAP0.2,CAP0.3

上面的就是那部分的。现在我还是不知道为什么这个就会错误,不过我可以把这几个语句转移到其他地方,应该就可以解决了。

再次感谢您的回答,让我解决了问题。谢谢

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

108

主题

1889

帖子

6

粉丝