ARM如何读写Flash
我在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
ARM读写Flas 相关文章:
- Windows CE 进程、线程和内存管理(11-09)
- RedHatLinux新手入门教程(5)(11-12)
- uClinux介绍(11-09)
- openwebmailV1.60安装教学(11-12)
- Linux嵌入式系统开发平台选型探讨(11-09)
- Windows CE 进程、线程和内存管理(二)(11-09)