嵌入式系统笔记
N | Z | C | V | ... | I | F | T | M4 | M3 | M2 | M1 | M0 |
---|---|---|---|---|---|---|---|---|---|---|---|---|
Negative | Zero | Carry | Overflow | (reserved) | IRQ disable | FIQ disable | State bit | |||||
\ | \ | \ | \ | \ | 1禁止 | 1禁止 | 1:Thumb |
The Principle of Embedded System
微处理器根据指令中由操作数(地址码字段)给出的地址信息,来寻找真实操作数地址的方式。
ARM的8种寻址方式:
- 寄存器寻址
- 立即寻址
- 寄存器偏移寻址
- 寄存器间接寻址
- 基址寻址
- 多寄存器寻址
- 堆栈寻址
- 相对寻址
指令中操作数给出的是寄存器编号,指令执行时直接取出寄存器的值来操作。
MOV R1,R2
SUB R0,R1,R2 ;R0=R1-R2
指令中操作数是数据本身,即数据包含在指令中,取出地址指令也就取出了可以立即使用的数
SUBS R0,R0,#1 ;R0=R0-1,且影响标志位
MOV R0,#0xff000 ;将立即数0xFF000装入R0寄存器中
指令中操作数在使用前,首先执行移位操作。
MOV R0,R2,LSL #3 ;R2的值左移3位,结果放入R0中,即R0=R2*8
ADDS R1,R1,R2,LSL R3 ;R2的值左移R3位,然后和R1相“与”,结果放入R1中
指令操作数给出的是通用寄存器的编号,真正的数据保存在寄存器指定的存储单元中,即寄存器为操作数的地址指针。
LDR R0,[R2] ;将R2指向的存储单元内容读出,放入R0中
SWP R1,R1,[R2] ;将寄存器R1的值和R2指向的存储单元内容交换
注:SWP的指令格式如下
SWP{cond} Rd,Rn1,[Rn2]
SWP{条件} 目标寄存器,来源寄存器1,[来源寄存器2]
功能
- 将来源寄存器2指向的内存中的数据送入目标寄存器中
- 将来源寄存器1中的数据送入来源寄存器2指向的内存
将基址寄存器中的内容与指令中给出的偏移量相加,形成操作数的有效地址。
LDR R2,[R3,#0x0C] ;读取R3+0x0C所指向的存储单元内容,放入R2中
STR R1,[R0.#-4]! ;把R1的值保存到R0-4指向的存储单元中
一次可以传送多个寄存器值。允许一条指令传送不超过16个寄存器。
LDMIA R1!,{R2-R4,R6} ;将R1指向的顺序存储单元中的数据读出到R2~R4,R6中,每读取一次R1自动加4
注:IA是LDM的一种模式,各种模式及说明如下:
模式 | 描述 | 说明 |
---|---|---|
IA | Increase After | 每次传送后地址加4 |
IB | Increase Before | 每次传送前地址加4 |
DA | Decrease After | 每次传送后地址减4 |
DB | Decrease Before | 每次传送前地址减4 |
STMFD SP!,{R4-R7,LR}
LDMFA SP!,{R4-R7,PC}
注:SP为堆栈指针,LR为程序链接器,PC为程序计数器
是基址寻址的一种变通。由程序计数器PC提供基准地址,指令中的操作数作为偏移量,两者相加得到的地址即为有效地址EA。
BL SUBR1 ;调用SUBR1子程序
...
SUBR1
MOV PC,R14 ;返回
- 常见的ARM指令:
- 分支指令
- 数据处理指令
- 乘法指令
- 存储器访问指令
- 杂项指令
- 伪指令
注:<>号内是必须的,{}号内的项是可选的。
ARM指令都可以有条件执行,Thumb指令只有B指令(跳转)具有条件执行功能。
指令 | 说明 |
---|---|
LSL | 逻辑左移 |
LSR | 逻辑右移 |
ASR | 算数右移 |
ROR | 循环右移 |
RRX | 带进位的循环右移 |
用于实现程序流程的跳转。
实现程序跳转的两种方法:
- 使用专门的跳转指令——可以实现在向前或向后的32MB地址空间的跳转
- 直接向程序计数器PC中写入跳转的地址值。——可以实现在4GB地址空间跳转。
注:在跳转之前使用指令MOV LR,PC
保存返回的地址值。
分类:
- 数据传送指令
- 算数/逻辑运算指令
- 比较指令
特点:
- 只能对寄存器进行操作,不能对存储器进行操作。
- 可选用S后缀,并影响标志位。
位清除指令BIC Rd,Rn,operand2
功能:
- operand2某位为1,则对应的Rd中的位为0。
- operand2某位为0,则对应的Rd中的为取Rn中对应的位。
The Principle of Embedded System
用来存放正在执行或经常使用的程序代码和数据
用来存放暂时不使用的程序代码和数据。
特点:
- 位于主板外
- 存取速度慢,微处理器不能直接访问
- 容量大,成本低,能修改
- 半导体
- 光盘存储器
- 磁表面存储器
(其中打勾的表示当前嵌入式芯片正在使用的)
-
RAM
-
SAM
-
DAM
-
ROM
-
Flash Memory
Nor Flash存储器:主要用于存储程序(用来替换ROM,相当于通用计算机的用于存放BIOS的存储器)
Nand Flash存储器:主要用于数据的存储(相当于通用计算机的硬盘)
嵌入式微处理器芯片 | 存储器芯片 |
---|---|
Cache(供OS使用的) | External RAM |
TCM(供用户使用的) | Nor Flash(非必须) |
Internal RAM and Internal ROM | NAND Flash等 |
以S3C2442微处理器为例
可寻址外部存储空间为1GB。(嵌入式芯片内部占用一部分:包括内部SRAM和外设寄存器) PS:外设寄存器不同于通用寄存器,外设寄存器具有地址编号。
被分成8个Bank(Bank0~Bank7),每个Bank为128MB。
Bank0的数据位宽只能是16或者32位(由引脚电平决定),其它Bank可以编程设定位8,16,32位。
- Bank0~Bank5可以外接ROM,SRAM类型存储器;
- Bank6和Bank7可以外接ROM,SRAM,SDRAM类型的存储器;
- Bank6和Bank7的大小可以编程设定;
- Bank6~Bank7有固定的起始地址;
- Bank7的起始地址=Bank6的末地址+1;
- 所有Bank的访问周期可编程设定;
数据总线的宽度在第一次访问之前设定为16位或32位。
- 由S3C2440芯片的OM(operation mode)引脚决定。
OM1 | OM0 | 数据宽度 |
---|---|---|
0 | 0 | NAND Flash |
0 | 1 | 16位 |
1 | 0 | 30位 |
1 | 1 | 测试模式 |
- 数据总线宽度设定位8位,16位或32位。
- 外接SRAM类型的存储器或者具有SDRAM接口特性的ROM存储器。且Bank6~Bank7还可以外接SDRAM类型的存储器。
- Bank6,Bank7容量可以编程设定,且两者必须相等。
NOR Flash和NAND Flash均可以作为引导ROM,在S3C2440中有NOR Flash作为引导, 在S3C6A10中没有,并由NAND Flash取而代之。
- 微处理器直接访问NOR Flash,作为引导ROM。
- NAND Flash通过**External RAM(SDRAM)**访问。
- 存放在NAND Flash的Boot Loader程序(4KB)由NAND Flash控制器送入内部RAM(4KB)(Stepping Stone),再由嵌入式微处理器中的执行部件访问内部RAM。
- 存放在NAND Flash中的主程序,先放入External RAM再由嵌入式微处理器执行部件访问。
8位,16位,32位存储器芯片
本质上是三种总线的连接
将存储器芯片的数据引脚于微处理器芯片的数据引脚顺序连接。
将存储器芯片的控制引脚(读/写/片选等)与微处理器芯片对应的控制引脚连接。
与系统数据总线的宽度(位数)有关。
存储器芯片的地址引脚 | 8位数据总线 | 16位数据总线(A0=0) | 32位数据总线(A0=0,A1=0) |
---|---|---|---|
A0 | A0 | A1 | A2 |
A1 | A1 | A2 | A3 |
... | ... | ... | ... |
两片8位存储器芯片并联构成16位存储器系统
数据线:
-
低8位存储器DQ0~DQ7与低8位数据总线DATA0~DATA7相连。
-
高8位存储器DQ0~DQ7与高8位数据总线DATA8~DATA15相连。
地址线:
-
地址线A0,A1.....与S3C2440的地址总线ADDR1,ADDR2......相连。
控制线:
-
两片存储器的允许输出信号nOE端都接S3C2440的nOE引脚。
-
低8位存储器的写信号nWE端接nWE0引脚。
-
高7位存储器的写信号nWE端接nWE0引脚。
-
两片存储器的片选信号nCE端都接S3C2440的nGCSn引脚。(作为整体配置到同一Bank中)
特点:
- 读取速度快,具有**XIP1**的特性。
- 写入速度慢,容量小,价格高。
- 带有SRAM接口,与微处理器连接方便,便于数据存取。
- 通常配置到Bank0。当系统上电或复位后从其内获取指令并开始执行。
单片存储容量为2MB。以半字(16位数据宽度)方式工作。
采用48脚TSOP封装或48脚TFBG封装。
引脚 | 类型 | 描述 |
---|---|---|
A[19:0] | I | 20根地址总线A19~A0 |
DQ[15:0] | I/O | 数据总线,在读/写操作时提供16位数据宽度 |
/CE | I | 片选信号 |
/OE | I | 允许输出使能 |
/WE | I | 写使能,低电平有效 |
VDD | - | 3.3v电源 |
VSS | - | 接地 |
特点:
-
写入和擦除速度很快,价格相对便宜。
-
使用时需要复杂的I/P接口电路(专用控制器)和存储管理操作:
以页(Page)为最小单位进行读写;以块(Block)为最小单位进行擦除。
-
适用于存储大量的用户数据。
-
支持自启动引导。
有效容量64MB:被分为4096块,每块32页,每页528字节(前512字节用于存放有效数据,后16字节作为存放ECC代码,坏块信息和文件系统代码等辅助数据 )
没有对外的地址线,但芯片内部使用地址线$$A_{25}A_{24}...A_{14}A_{13}...A_{9}A_{8}A_{7}...A_{1}A_{0}$$表示其各字节单元地址。
例如:访问第1500个块中的第25页中的第200个存储单元: $$ 物理地址=1499\times32\times512+24\times512+199=0x176F0C7 $$
读取数据时,分为2个半页进行读取。
-
读取1st Half Page使用命令0x00代替$$A_{8}$$=0;读取2nd Half Page使用命令0x01$$A_{8}$$=1。
-
发送地址信号时按字节分别为$$A_{0}$$~$$A_{7}$$,$$A_{9}$$~$$A_{16}$$,$$A_{17}$$~$$A_{24}$$,$$A_{25}$$,即采用四部寻址法。
NAND Flash控制器通过一些输入引脚上的电平状态,获取所连接的NAND Flash存储器的参数信息。
描述 | 引脚 |
---|---|
NAND Flash存储器选择位 | NCON |
NAND Flash存储器页容量选择位 | GPG13 |
NAND Flash存储器地址周期选择位 | GPG14 |
NAND Flash存储器总线宽度选择位 | GPG15 |
自动引导模式:S3C2440的OM1,OM0均接为低电平时,系统处于NAND Flash自动引导模式。
普通闪存模式:支持数据读,写,擦除操作。
集成在微处理器芯片内部的存储器控制器和NAND Flash控制器,提供了访问存储器所需的全部控制信号。
通过其内的一组功能寄存器SFR,可以实现对存储器系统相关参数的设定以及芯片引脚状态的读取。
The Principle of Embedded System
S3C2440总共有289根管脚,其中130根可以作为GPIO使用。
- GPIO(General Purpose I/O)——通用输入输出端口
- 用于连接各种IO设备
-
130各GPIO管脚分成9组,分别是GPA~GPJ。
-
每个端口具有多种功能,具体哪一种可在主程序运行之前编程设置对应的控制寄存器。
-
如果某个GPIO管脚不用于特定功能,则其可设置为普通的输入输出管脚。
- 23个管脚。
- 两种功能:
- 普通输出口;
- 用于输出外接存储器的地址信号和存储块的选择信号。
-
11个管脚。
-
两种功能:
-
普通输入/输出口;
-
用于DMA和总线请求和应答信号及各种时钟信号。
-
-
8个管脚。
-
两种功能:
-
普通输入/输出口;
-
用于中断请求信号——常用。
-
.test
.global _start
_start:
LDR R0,=0X56000050 ;端口F的配置寄存器地址
LDR R1,[R0]
BIC R1,R1,#0x3F00
ORR R1,R1,#0x1500
STR R1,[R0]
LDR R0,=0x56000054 ;端口F的数据寄存器地址
LDR R1,[R0]
BIC R1,R1,#0x70 ;GPF4~6输出为低电平
STR R1,[R0]
WAIT:
B WAIT
时钟频率计算公式: $$ FLCK=F_{OUT}=2MFin/(p*2^{S}) $$
- Fin:输入时钟源的频率。
- m,p,s:分频控制参数,分别由锁相环配置寄存器MPLLCON中的MDIV,PDIV和SDIV的值确定。
M/U PLLCON | 位 | 描述 | 初始状态 |
---|---|---|---|
MDIV | [19:12] | 主分频器 分频系数m的值 | 0x96/0x4d |
PDIV | [9:4] | 预分频器 分频系数p的值 | 0x03/0x03 |
SDIV | [1:0] | 后分频器控制 分频系数s的值 | 0x0/0x0 |
分频参数: $$ m=(MDIV+8) $$
Footnotes
-
芯片内执行,即嵌入式微处理器能直接访问。 ↩