1.Nor Flash电路详情
补充说明:
1。 一般来说,ARM处理器内部要设置相应的寄存器,告诉处理器外部扩展的FLASH的位宽(8-BIT/16-BIT/32-BIT) 。这样,处理器才知道在访问的时候如何从FLASH正确的读取数据。
2。 有些ARM处理器内部可以设置地址的错位。对于支持软件选择地址错位的处理器,在连接16-BIT FLASH的时候,硬件上可以不需要把地址线错位。读者设计的时候,请参考MCU的数据手册,以手册为准,以免造成不必要的麻烦。
3。 如果处理器支持内部设置地址错位,在实际访问的时候,送出的地址实际上是在MCU内部做了错位处理,其作用是等效于硬件连接上的错位的。
下面两个例子不错:
例子 1:ARM处理器需要从地址 0x0 读取一个 BYTE
1 - ARM处理器在地址线An-A0上送出信号0x0;
2 – 16-BIT FLASH在自己的地址信号An-A0上看到的地址是0x0,然后将地址0x0对应的16-BIT数据单元输出到D15-D0上;
3 – ARM处理器知道访问的是16-BIT的FLASH,从D7-D0上读取所需要的一个BYTE的数据;
例子 2:ARM处理器需要从地址 0x1 读取一个 BYTE
1 - ARM处理器在地址线An-A0上送出信号0x1;
2 – 16-BIT FLASH在自己的地址信号An-A0上看到的地址依然是0x0, 然后将地址0x0对应的16-BIT数据单元输出到D15-D0上;
3 –ARM处理器知道访问的是16-BIT的FLASH,从D15-D8 上读取所需要的一个BYTE 的数据;
2.下面从两个阶段解剖Nor Flash驱动
/*
*************************************************************************
*
* Jump vector table as in table 3.1 in [1]
* 1.set SVC mode
* 2.关看门狗
* 3.屏蔽所有中断
* 4.初始化SDRAM
* 5.设置堆栈
* 6.设置时钟
* 7.将代码从nor flash拷贝到SDRAM
* 8.跳转到start_armboot
*************************************************************************
*/
这是uboot启动汇编代码过程,在第7步骤之前,代码都是在nor flash里边执行的,当然nor flash支持代码执行,不用将程序复制到RAM里边。
#define __arch_getb(a) (*(volatile unsigned char *)(a))//读
#define __arch_getw(a) (*(volatile unsigned short *)(a))
#define __arch_getl(a) (*(volatile unsigned int *)(a))
#define __arch_putb(v,a) (*(volatile unsigned char *)(a) = (v))//写
#define __arch_putw(v,a) (*(volatile unsigned short *)(a) = (v))
#define __arch_putl(v,a) (*(volatile unsigned int *)(a) = (v))