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

ARM如何读写Flash

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

没有问题。 你说呢?

29.

CheckFlash

MOV a2,#0x90

ADD a2,a2,#0x900000

MOV a1,#0

STR a2,[a1,#0]

如果在flash中执行,那么这一句之后,程序代码就读不到了,也就是程序飞掉了.

MOV a2,#0

ADD a3,pc,#L000198-.-8

B LCDDrawStr

L000198

DCB "Unkn"

DCB "ow F"

DCB "LASH"

DCB " DEV"

DCB "ICE\0"

如果你的LCD显示是正常的.你试试在这段程序开头的地方把PC的值显示出来,看看是不是在flash中运行.

30.

MID = *addr;

if( MID == 0x00B000B0 )

{

你在这里用串口先显示一下PC的值,看他是在Flash还是

sdram里面,最好然后延时一会,看看效果

//display Manufacture ID

我怀疑调用你的显示函数时候,回到Flash里面去了,如果可以,

在你的显示函数里面,也从串口输出PC的值,看看是在flash

还是sdram里面

}

31.

我不知道你的编译器,不过象gcc的,c的函数名通常在汇编中看到的是加前缀_的c函数名. 象Move_Program的c函数,在汇编中是看不到的。在gcc中是在Move_Program前加asmlinkage。

32.

我调试过,我用LCD显示出PC. 请看:

在这个语句"*addr = 0x00900090" 之前, PC都正常。显示结果为SRAM里面的地址(0x60000278), 但是如果一执行这个语句之后,PC 无法显示出来了(就是我调用了显示函数,但没有显示)。但是好像又能跑!因为LED在闪烁。(注意在这条语句之后,我加了LED 闪烁功能,以证明程序在跑 ) 很奇怪。

33.

那就是你的显示函数有问题啦,不是程序跑飞了。

你再仔细查查看具体的错误出现在什么位置上吧。

你不是有指示灯吗,在显示函数的入口处加入PC的检查代码,看看PC是在什么范围,比如,在sram就熄灭指示灯,在flash中就点亮指示灯。

34.

谢谢各位! 我明白了。 哈哈~~~~~~~

原来是那些全局变量(字库)的地址还没有变。怪不得,在我写0x00000000之前,程序仍然访问的是Flash里面的ROM DATA. 然后在写0x00000000后, 此时Flash的读写状态发生变化,可是程序仍然要访问Flash里面的ROM DATA. 这个时候问题就出来了。因为这个时候Flash可能无法正确读出ROM DATA. 所以LCD Driver无法正确拿到字库,因此无法正确显示。因此可能作如下修改就可以拉:

LCD Driver在使用绝对地址(就是 0x60000000 + 偏移 )

但是这样的话如果全局变量很多的话,或者有静态变量的话,就非常麻烦了。 有什么办法解决吗??

有劳各位了。 真的非常感谢各位。 给了很多提示和启发。

再次谢谢。 :-)

35.

但是这样的话如果全局变量很多的话,或者有静态变量的话,就非常麻烦了。 有什么办法解决吗??

可以用PIC,也就是动态连接库使用的技术,我记得ppcboot用这种方法实现从Flash搬到RAM后,只要作简单的修补(Fixup),就可以在RAM中执行。

更简单的方法是把全局变量放到一个结构中,程序移动后调整结构指针就可以了。

36.

1.尽量用局部变量。

2.改写ld的参数(一般在makefile中,或者有一个单独的ldscript),把代码的起始地址改成你将要把它复制过去的那个sram中的地址。

37.

OK. Very good.

我测试过了。可以改 -ro-base xxxxxx。

成功。

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

网站地图

Top