【ARM裸板】内存控制器、SDRAM基础与代码重定位

示例代码下载

1.CPU如何控制外设?

  • CPU控制相应外设的寄存器,有外设控制器发出特定的波形

2.CPU如何选择寄存器?

  • CPU通过内存控制器选择
发出地址addr
根据地址选择不同的模块
CPU
内存控制器
读写数据

3.外设共用地址、数据总线,如何互不干扰?

  • 通过片选CS引脚,选择不同的外设

4.谁控制片选引脚

发出地址addr
根据地址发出片选信号
CPU
内存控制器
使能相应的外设

  • 由芯片手册得知:当CPU发出地址是0x00000000时 nGCS0为低电平选择(有效)
    在这里插入图片描述

5.CPU如何读写数据的方向?

  • 通过外设芯片的读写引脚控制

6.CPU不同位宽设备如何连接并读取数据【内存控制器】

6.1 连接方式

  • 8bit ROM (从A0开始对应连接)
    在这里插入图片描述

  • 16bit ROM (A0不接,从A1开始)
    在这里插入图片描述

  • 32bit ROM(A0、A1不接,从A2开始)
    在这里插入图片描述

6.2 CPU读取ROM数据1个字节

  • 例如在 地址3上读取一个字节数据
mov R0.#3
LDRB R1,[R0]

过程 CPU发出的地址 ROM接收到的地址 ROM返回的数据 内存控制器挑出指定字节送给CPU
8bit 000011 000011 第3个byte 第3个byte
16bit 000011 00001 第1个16bit 根据A0=1,挑出16bit中的第1个byte给CPU(从0byte开始)
32bit 000011 00000 第0个32bit 根据A0 A1=11挑出第3个byte给CPU(从0byte开始)
  • 综上,也就是所有的地址线都会用到,内存控制器根据未接的地址线状态判断挑出指定的byte

6.3 CPU读取ROM数据4个字节

mov R0,#4
LDR R1,[R0]  ;从地址4上取出4个字节

过程 CPU发出的地址 内存控制器转发给ROM的地址 ROM返回的数据 内存控制器组装数据返回给CPU
8bit 000100 000100、000101、000110、000111(共四次) 得到地址4、5、6、7上的byte 组装给一个32bit数据给CPU
16bit 000100 00010、00011(共两次) 得到第2、3个16bit 组装给一个32bit数据给CPU
32bit 000100 0001(共一次) 得到第1个32bit 直接发送给CPU

7.如何根据原理图确定芯片访问地址

7.1 方法

7.2 Nor Flash确定访问地址

  • 例如Nor Flash芯片:用到A20~A021条线
  • 地址线21:即可访问2M内存,0x1FFFFF
  • 根据它片选信号为nGCS0可以得到基地址BASE = 0x00000000
  • 其范围为BASE+0x0000 0000 ~ BASE+0x001F FFFF,即0x0000 0000 ~ 0x001F FFFF

在这里插入图片描述

7.3 Net芯片确定访问地址

  • 例如网卡net芯片:只连接了A2,但是其A0是用来确定16bit(网卡数据线为16位)中的高8位还是低8位,因此A2 A0
  • 根据其片选引脚为nGCS4,可以得到基地址BASE = 0x2000 0000
  • 其范围为BASE+0x0000 0000 ~ BASE+0x0000 0101,即0x2000 0000 ~ 0x2000 0005
    在这里插入图片描述

8. Nor Flash时序分析

8.1 MX29LV160 读数据时序

在这里插入图片描述

在这里插入图片描述

  • Taa:发出地址信号之后多长时间数据有效
  • Tce:发出片选信号之后多长时间数据有效
  • Toe:发出读信号之后多长时间数据有效
  • Toh:数据保持时间
  • Tdf:数据浮动时间
  • Trc:读取周期时间(70ns,即读取速率最大为70ns)

8.2 S3C2440 可编程访问周期时序

  • 为了方便,使得Addr、CS、OE信号同时拉低使能,然后确保Tacc>=70ns,即可满足Nor Flash的时序
  • 则当HCLK=100M,内存控制器周期为T=10ns,Tacc = 8T即可
    在这里插入图片描述

在这里插入图片描述

9.代码重定位

1.Nand启动时,一上电,硬件会把前4K数据复制到SRAM
2.CPU从0地址运行

如果程序大于4K,前4K的代码需要把整个程序读取出来放到SDRAM重定位:重新确定程序地址】

9.1 Nor Flash特点

  • 可以像内存一样的读取
  • 不可以像内存一样直接写入(写入有保护)

9.2 Nor直接写入的结果

  • 程序中含有需要修改(写入)的变量,写在Nor上,直接修改变量是无效的
  • 因此需要重定位,放到SDRAM上

9.3 实验

  • 以Nor Flash 启动,修改一变量,改变量并不会被修改,即无效

  • 以Nand Flash 启动,修改一变量,改变量会被修改

9.4 程序包含哪几部分

代码段text 代码
数据段data (一般的全局变量)
只读数据段rodata const 全局变量
bss 初值为0或无初值的全局变量 不保存在bin文件中
comment 注释 不保存在bin文件中
  • bss:是“Block Started bySymbol”的缩写,意为“以符号开始的块”。 BSS是Unix链接器产生的未初始化数据段。
    • bss段与注释段不保存在bin文件中
char g_Char = 'A'; //定义全局变量
const char g_Char2 = 'B'; //只读全局变量
int g_A = 0; //初值为0的全局变量
int g_B; //未定义初值的全局变量

发布了42 篇原创文章 · 获赞 176 · 访问量 4万+

猜你喜欢

转载自blog.csdn.net/qq_39492932/article/details/104007852