ARM如何读写Flash
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的那部分注释掉了。
从这个代码看,好像也
ARM读写Flas 相关文章:
- Windows CE 进程、线程和内存管理(11-09)
- RedHatLinux新手入门教程(5)(11-12)
- uClinux介绍(11-09)
- openwebmailV1.60安装教学(11-12)
- Linux嵌入式系统开发平台选型探讨(11-09)
- Windows CE 进程、线程和内存管理(二)(11-09)