微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > ARM如何读写Flash

ARM如何读写Flash

时间:11-11 来源:互联网 点击:

x00900090;

MID = *addr;

if( MID == 0x00B0000B )

{

//display Manufacture ID

}

addr+=2;

DeviceID = *addr;

if( DeviceID == 0x00D000D0 )

{

// display "Device ID"

}

}

下面的代码是复制程序到 SRAM.

void Move_Program(void)

{

unsigned long* rom_adr=(unsigned long*)0x00000000;

unsigned long* ram_adr=(unsigned long*)0x60000000;

int i;

int rom_size;

rom_size = (int)(rom_data_base-0x00000000);

for( i=0; i

{

*ram_adr++ = *rom_adr++;

}

}

18.

BL Move_Program

這句可是要返回到flash中的

--------------

这条指令( BL Move_Program ) 当然回到Flash. 他的下条指令 : ldr pc, =0x600000b8 才是真正转到SRAM里面去执行。

-------------

19.

你在进入c代码后到读flash之前都做了那些事?

另外你可以试试能不能从flash中直接读数据?

20.

在读flash前,我做了LCD的初始化和相关的测试。 另外我可以直接读flash中的数据(包括程序代码等等)。

21.

MID = *addr;

if( MID == 0x00B0000B )

{

//display Manufacture ID

}

上面这段能显示出来吗?(应该可以吧)

addr+=2;

这里,地址+2,好象不对吧,你的可是32位数据总线

DeviceID = *addr;

if( DeviceID == 0x00D000D0 )

{

// display "Device ID"

}

}

我想这里就飞了吧

给你一段读的代码

WRITE_FLASH(0x00000000,0x00980098);

OffSet=0x10<2;

ReadData=READ_FLASH(0x0+OffSet);

//属性Q

OffSet=0x11<2;

ReadData=READ_FLASH(0x0+OffSet);

//属性“R“

OffSet=0x12<2;

ReadData=READ_FLASH(0x0+OffSet);

//属性"Y“

22.

MID = *addr;

if( MID == 0x00B000B0 )

{

//display Manufacture ID

}

到这儿根本无法显示!!

下面这个你说得对。

可以改成 : addr++; addr++;

23.

你用的什么编译器?

unsigned long是多少位的?

还有,你确定你的CPU的MID是0x00B000B0?

最后,你用什么显示ID的,最好用串口,如果是LCD的话,

可能是显示语句造成的错误

---------------------------

我用ARM SDT 2.50.

unsigned long 是32Bit. unsigned int 也是 32Bit.

不是CPU 的MID. 是Flash的 Manufacture ID . 我确信 它是:

0x00B000B0

我用LCD显示ID. 显示驱动是我自己写的。能正常显示。

24.

把check_flash的汇编代码贴出来。c程序里面看不出具体有了什么跳转方式。

举个例子:(用的是伪代码)

jump 0x00000300

这样一句语句不管你把它拷贝到哪里,他都一定会执行到0x300这个地址去的.如果你的程序中有这样的跳转,因为编译的时候编译器不知道你会把它拷贝到别的地方,必然填充的是当前程序段内的地址.而这个地址不会随着你的代码的搬移而改变.那么执行到这一句的时候就又跳回去了.

代码本身是没错的,错就错在它是不可移动的.

25.

我的Check_flash本来就是用C写的。 因为我只是想简单测试一下在我把ROM CODE搬到SRAM区后,能否操作Flash.

所以就那么简单。

我想在编译连接阶段不会把具体的段地此也放在最后的代码中。它总是在运行的时候把所在段的地址和它相加就是了。如果真的像你所说,那么我前面的代码(在操作Flash之前)一定不能运行。但是实际情况正像我所料。我的LCD能工作。我的蜂鸣器能响。我的LED能闪烁。

26.

你还是没有懂我的意思.

只要你的sram中能运行程序,它就可以写flash.

如果不能,一定是你的程序出了问题.最常见的就是真正的"自己写自己".因为编程时,flash的状态不是普通的读状态,所以处理器读不到程序代码,当然就出错了.

如果你做的都是对的,那么为什么会出错呢?

你说过,你是在没有操作系统的裸机上运行的,那么你的代码一定不是一个可执行程序,而是真正的机器代码段.除了程序自己,没有人会帮他设置什么运行时的段地址的.

没有绝对跳转的程序是可以移动的,有绝对跳转的程序是不可移动的.

27.

你的意思是怀疑我的程序是否真的在SRAM里面运行? 还是怀疑我的Check_Flash有问题?

1)。 在Flash里面运行程序和在SRAM运行程序的速度是有很大差别的。 可以从运行的情况可以看出来。这点基本可以确定程序真的在SRAM运行。(否则也无法逾越这条指令:

ldr pc, =0x600000b8 )

2)。Check_Flash 真的有问题吗? 我真的是用C写的。

我再检查他编译以后的汇编代码看看。

28.

那,下面就是用armcc 编译产生的asm代码。

====================================

CheckFlash

MOV a2,#0x90

ADD a2,a2,#0x900000

MOV a1,#0

STR a2,[a1,#0]

MOV a2,#0

ADD a3,pc,#L000198-.-8

B LCDDrawStr

L000198

DCB "Unkn"

DCB "ow F"

DCB "LASH"

DCB " DEV"

DCB "ICE\0"

===================================

注意。我把检查设备ID的那部分注释掉了。

从这个代码看,好像也

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top