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

ARM如何读写Flash

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

我在ARM上裸机。 不使用任何嵌入式操作系统

我的引导程序把我的程序放在 0x00000000,(这个地方是Flash) 在初始化的时候,我把代码区的所有代码copy到SDRAM里面去。然后跳到SDRAM( 0xc0000000 )里面去运行。此时我能否往 0x00000000及其后的address里面写数据?

2.

不可以,在Flash 中执行的代码不可以改写Flash的内容,你可以在SDRAM中写FLASH的内容。参考bolb和intel strongarm的dm 程序

3.

应该这样说,flash由于本身的技术原因,擦写过程中不能同时读。所以,你不能在运行(读代码)的同时去改写同一个flash芯片中的内容。但你说的跳到sdram中去运行并改写flash应该是可以的。

还有,flash的写操作不同于ram,是需要通过一系列的特定操作才完成的。这个你可以仔细看看flash芯片的手册,不同的芯片可能会有区别。blob中可以找到具体的程序例子参考。

4.

我就是要擦除Flash. 然后写Flash. 我现在是把代码全部copy到SDRAM里面去。然后跳到SDRAM里面去运行。我现在也已经这样做了。 但是我在SDRAM里面运行,而且要写Flash(包括读ID ) 的时候。系统运行就乱了。 可能产生了异常。我不知道这个怎么解决?

5.

如果你确认程序能够正确进入sdram运行了,最可能出问题的就是这段程序中的跳转语句。你的跳转是相对跳转还是绝对跳转?如果是绝对跳转,编译的时候编译器不会知道你以后会把程序挪地方,跳转的目的地址还是在flash中。这样就出错了

6.

Sorry, 前面说错了。是跳到SRAM里面。 不过差不多。

跳转到SRAM里面后,如果不操作Flash. 到目前为止,好像没有什么问题。都能正常运行。 但是只要操作Flash,就会死!

什么是相对跳转?? 什么是绝对跳转??

我用的指令是:

;;这儿是copy_rom_data

bl copy_romdata_to_sram

;; 这儿是跳转到sram 里面去。

ldr pc, =0x600000ac

7.

机器级b和bl指令有一个限制:跳转的范围在当前指令的+/-32Mb范围内。为什么?因为跳转的目的地是以当前的指令为起点的。这就是相对(于当前地址)的跳转。绝对跳转就是直接指定目的地址的跳转,比如你直接给pc赋一个立即数值,就是绝对跳转。你也可以用bx/blx Rm来实现绝对跳转。

我其实对arm指令不熟,你自己琢磨一下吧。我只是说明了一种容易出现的错误,希望对你有帮助。

8.

设置tlb表了么?

在打开mmu之前,把00000000物理地址映射到另外一个地址例如e0000000,然后打开mmu,对e0000000操作,就是对flash操作

9.

没有。 怎么设置TLB表? 能否给我一个sample code ?

10.

操作死机原因可能是:

1.在系统开始时,将Flash ROM 的映射属性设置为uncache和unbuffer.参考Windows CE的Source Code

2.连接时的数据段,代码段的地址是否正确.参考blob

3.数据段和bss段是已经初始化正确.参考blob

4.如果还是失败,初始化代码用Multi ICE 拷贝到 SDRAM中直接调试运行。

注意:

1.最好不要使用ARM 提供的集成开发环境

2.再看一边L7205的参考手册。

3.看原理图

4.看flash rom 的资料,如sst 、amd的源代码

11.

你的中断向量怎么处理的?有没有把中断向量映射到你的SRAM中去?

12.

因为程序运行中我不修改任何中断向量. 我需要映射到SRAM去吗?

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

不是说你是否修改中断向量,而是说在你的代码工作过程中会不会产生中断

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

我的代码在工作过程中 不产生中断。因为我屏蔽了!

如果产生中断会怎么样?

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

如果发生中断,那么cpu会去中断向量表中访问相应的中断向量并执行,而此时你的Flash处于写状态

13.

只要写Flash. 程序就不知道跑到什么地方去了。 我用的是Sharp的Flash. 读厂家的ID 命令是 0x90. 写这个命令时,就发生错误了。表现为程序没有继续运行下去。因为Flash位于0x0000000。

14.

你是否使用L7200或是L7205,如果是请注意,SRAM的大小和你的代码大小

15.

我用的是Cirrus Logic EP7312. 我的代码大小没有超过SRAM的大小不到5K

16.

她的看法跟我一样,你很可能有绝对跳转的指令,使得你的程序运行到中途又跳回到flash中去了。

把你的代码贴出来看看。应该不长吧。

你用了blob吗?

17.

中途跳转到Flash中去了??? 但是如果我把读Flash ID这段代码注释掉. 程序运行很正常阿!? 看看我这段代码:

下面这段是初始化中的程序片断:

。。。。。。。。。。

IMPORT Move_Program

BL Move_Program

ldr pc, =0x600000b8 ; 跳到C的入口处。

.........................

下面一段代码是读Flahs的ID的函数:

void CheckFlash(void)

{

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

unsigned long MID;

unsigned long DeviceID;

*addr = 0

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

网站地图

Top