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

2020-03-06来源: eefocus关键字: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 方法

1.根据片选引脚确定基地址,见4.谁控制片选引脚

2.根据芯片所接地址线确定范围


7.2 Nor Flash确定访问地址

例如Nor Flash芯片:用到A20~A0共21条线

地址线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; //未定义初值的全局变量

关键字:ARM裸板  内存控制器  SDRAM  代码重定位 编辑:什么鱼 引用地址:http://news.eeworld.com.cn/mcu/ic490740.html 本网站转载的所有的文章、图片、音频视频文件等资料的版权归版权所有人所有,本站采用的非本站原创文章及图片等内容无法一一联系确认版权者。如果本网所选内容的文章作者及编辑认为其作品不宜公开自由传播,或不应无偿使用,请及时通过电子邮件或电话通知我们,以迅速采取适当措施,避免给双方造成不必要的经济损失。

上一篇:【ARM裸板】ARM模式、异常与状态
下一篇:【ARM裸板】S3C2440 时钟设置与分析

关注eeworld公众号 快捷获取更多信息
关注eeworld公众号
快捷获取更多信息
关注eeworld服务号 享受更多官方福利
关注eeworld服务号
享受更多官方福利

推荐阅读

ARM裸板实现LCD显示
的项目,如下:all: start.o sdram_init.o interrupt.o nand_flash.o main.o  led.o uart.o   execption.o  timer.o lib1funcs.o my_printf.o  string_utils.o lcd.o  arm-linux-ld -T lcd.lds  $^ libgcc.a -o lcd.elf arm-linux-objcopy -O binary -S lcd.elf lcd.bin arm-linux-objdump -D lcd.elf >
发表于 2020-05-04
ARM裸板实现LCD显示
ARM裸板程序的开发和编译(以点亮LED灯为例)
从这两个地方启动。具体就是把代码烧写到Nor flash或者Nand flash处,如果在Nand flash,启动时硬件会自动拷贝代码到4KB的内部RAM。GT2440开发板nGCS0接的是Norflash。无论哪种模式启动,上电后CPU跳转到0地址处开始执行。如果在片内内存中,我们必须用4KB的代码完成Nand flash,内存控制器的初始化,并且把代码搬运到片外内存中。如果在Nor flash中,我们同样需要初始化内存控制器。由于裸板程序较小,不会超过4KB,因此我们暂时不需要做这些操作(如果在Norflash中我们可直接运行的代码量更大)。此外,ARM处理器还有多种异常。系统上电和看门狗超时都会产生复位异常,跳转到0地址处执行
发表于 2020-04-11
ARM裸板程序的开发和编译(以点亮LED灯为例)
linux系统学习1-8:第1个ARM裸板程序及引申
为1),GPF4配置为输出设置GPFDAT[4]=1:输出高电平,led熄灭设置GPFDAT[4]=0:输出低电平,led点亮S3C2440框架与启动过程:S3C2440框架图: 启动过程:大多数ARM芯片从0地址启动Nor启动时候,Nor Flash基地址为0;片内RAM地址为0x4000,0000 cpu读出Nor上第一个指令(前4字节),执行,cpu继续读出其他指令执行。Nand启动,片内4kRAM基地址为0; Nor Flash不可以访问 2440硬件把Nand前4k内容复制到片内RAM,然后cpu从0地址取出第一条指令执行。第003节:编写第一个程序点亮LED怎么让GPF4输出1/0的方法:先
发表于 2020-03-28
linux系统学习1-8:第1个ARM裸板程序及引申
第008课 第1个ARM裸板程序及引申(点亮LED灯)
led_on.S    arm-linux-ld -Ttext 0 led_on.o -o led_on.elf    arm-linux-objcopy -O binary -S led_on.elf led_on.binclean:    rm *.bin *.o *.elf  以后只需要 使用 make 命令进行编译, make clean 命令进行清理。最后烧写到开发板上,即可看到只有一个LED亮,符合我们预期。第004节_汇编与机器码前面介绍过伪指令,伪指令是实际不存在的ARM命令,编译器在编译时转换成存在的ARM指令。我们代码中的ldr r1
发表于 2020-03-20
第008课 第1个ARM裸板程序及引申(点亮LED灯)
ARM裸板程序及引申_点亮LED
*.elf以后只需要 使用 make 命令进行编译, make clean 命令进行清理。最后烧写到开发板上,即可看到只有一个LED亮,符合我们预期。第004节_汇编与机器码:前面介绍过伪指令,伪指令是实际不存在的ARM命令,编译器在编译时转换成存在的ARM指令。我们代码中的ldr r1, =0x56000050这条伪指令的真实指令时什么呢?我们可以通过反汇编来查看。生成的led_on.dis就是反汇编文件。led_on.dis如下:led_on.elf:     file format elf32-littlearmDisassembly of section .text:00000000 <
发表于 2020-03-16
ARM裸板程序及引申_点亮LED
ARM裸板调用流程
一、汇编mdk软件会选择用户添加到工程文件里面的汇编文件执行(例startup_stm32f10x_md.s),对基本内容进行初始化比如栈空间,这个文件通常由芯片厂家提供,用户使用选择调用即可。二、跳转main函数在汇编执行初始化之后,最终在下面圈红的地方跳转到main函数。__main可以修改成其他名字比如smain,对应main函数名改成smain,也可以完成跳转
发表于 2020-03-11
ARM裸板调用流程
小广播
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号 电信业务审批[2006]字第258号函 京公海网安备110108001534 Copyright © 2005-2020 EEWORLD.com.cn, Inc. All rights reserved