文章目录
示例代码下载
1.CPU如何控制外设?
- CPU控制相应外设的寄存器,有外设控制器发出特定的波形
2.CPU如何选择寄存器?
- CPU通过内存控制器选择
3.外设共用地址、数据总线,如何互不干扰?
- 通过片选CS引脚,选择不同的外设
4.谁控制片选引脚
- 由芯片手册得知:当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; //未定义初值的全局变量