历史上的今天
今天是:2025年03月06日(星期四)
2020年03月06日 | 【ARM裸板】内存控制器、SDRAM基础与代码重定位
2020-03-06 来源:eefocus
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; //未定义初值的全局变量
史海拾趣
|
..\\Release\\blit_mmx.obj : fatal error LNK1112: module machine type \'X86\' conflicts with target machine type \'THUMB\' 其中blit_mmx.obj是由blit_mmx.asm 生成的,此文件编译命令行为: yasm -f win32 -o \"$(IntDir)/$(InputName).ob ...… 查看全部问答> |
|
wince6.0 作为复合设备识别(compositefn)问题 我在作wince6.0的驱动,用的是6410开发板。我想在pc端让板子被识别为一个串口和一个u盘。现在已经把PUBLIC\\DRIVER\\USBFN\\CLASS\\COMPOSITEFN驱动编成了compositefn.DLL,并且能够当做流驱动,在系统启动的时候加载成功了。 但是主机端设备管理 ...… 查看全部问答> |
|
板子是研杨的4310,带44pin的LCD接口,接口定义如下: 01. +12 VDC 02. +12 VDC 03. GND 04. GND 05. +5 VDC &nbs ...… 查看全部问答> |
|
看了Cortex-M3技术参考手册后,感觉对异常处理中堆栈的操作理解还是不清晰.1.在Thread mode下,发生异常或中断,处理器自动将xPSR,PC,LR,R12,R3,R2,R1,R0进行压栈,当ISR返回时,又自动将上述寄存器出栈.这个没问题.2.当抢先优先级不同时,优先 ...… 查看全部问答> |
|
本帖最后由 paulhyde 于 2014-9-15 03:34 编辑 今天电赛的证书拿到手里了,我是队长+所有自购原件的买单者+电路绝大部分的设计制作者,为什么名字被放在三个人最后啊????????????????????????我们组是两个大三的带一个大 ...… 查看全部问答> |
|
LPC2104_flash.icf或者LPC2104_ram.icf文件 最近在做ARM7LPC系列芯片的开发,在用IAR开发环境时缺少LPC2104_flash.icf或者LPC2104_ram.icf文件,哪位大侠有类似的配置文件?本人不胜感激。… 查看全部问答> |





