Skip to content

LdleFlowersLand/Embedded-System

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

2 Commits
 
 

Repository files navigation

Embedded-System

嵌入式系统笔记

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

ARM指令与汇编程序设计

The Principle of Embedded System

ARM寻址方式

寻址方式

微处理器根据指令中由操作数(地址码字段)给出的地址信息,来寻找真实操作数地址的方式。

ARM的8种寻址方式:

  1. 寄存器寻址
  2. 立即寻址
  3. 寄存器偏移寻址
  4. 寄存器间接寻址
  5. 基址寻址
  6. 多寄存器寻址
  7. 堆栈寻址
  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指令:
  • 分支指令
  • 数据处理指令
  • 乘法指令
  • 存储器访问指令
  • 杂项指令
  • 伪指令

ARM指令的基本格式

$$ {}{S}\space,{,} $$

注:<>号内是必须的,{}号内的项是可选的。

条件码cond

ARM指令都可以有条件执行,Thumb指令只有B指令(跳转)具有条件执行功能。

image-20220512195916826

ARM支持的移位操作

指令 说明
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等

Bank

以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的访问周期可编程设定;

Bank0

数据总线的宽度在第一次访问之前设定为16位或32位。

  • 由S3C2440芯片的OM(operation mode)引脚决定。
OM1 OM0 数据宽度
0 0 NAND Flash
0 1 16位
1 0 30位
1 1 测试模式

Bank1~7

  • 数据总线宽度设定位8位,16位或32位。
  • 外接SRAM类型的存储器或者具有SDRAM接口特性的ROM存储器。且Bank6~Bank7还可以外接SDRAM类型的存储器。
  • Bank6,Bank7容量可以编程设定,且两者必须相等。

不同外部存储器引导ROM的启动流程

NOR Flash和NAND Flash均可以作为引导ROM,在S3C2440中有NOR Flash作为引导, 在S3C6A10中没有,并由NAND Flash取而代之。

使用NOR Flash为引导ROM的启动流程

  • 微处理器直接访问NOR Flash,作为引导ROM。
  • NAND Flash通过**External RAM(SDRAM)**访问。

使用NAND Flash为引导ROM的启动流程

  • 存放在NAND Flash的Boot Loader程序(4KB)由NAND Flash控制器送入内部RAM(4KB)(Stepping Stone),再由嵌入式微处理器中的执行部件访问内部RAM。
  • 存放在NAND Flash中的主程序,先放入External RAM再由嵌入式微处理器执行部件访问。

外部存储器芯片连接

常见的外部存储器芯片

8位,16位,32位存储器芯片

微处理器芯片于外部存储器芯片的连接

本质上是三种总线的连接

未命名绘图.drawio

数据总线的连接

将存储器芯片的数据引脚于微处理器芯片的数据引脚顺序连接。

控制总线的连接

将存储器芯片的控制引脚(读/写/片选等)与微处理器芯片对应的控制引脚连接。

地址总线的连接

与系统数据总线的宽度(位数)有关。

存储器芯片的地址引脚 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中)

Nor Flash存储器芯片

特点:

  • 读取速度快,具有**XIP1**的特性。
  • 写入速度慢,容量小,价格高。
  • 带有SRAM接口,与微处理器连接方便,便于数据存取。
  • 通常配置到Bank0。当系统上电或复位后从其内获取指令并开始执行。

Nor Flash存储芯片——SST39VF1606

单片存储容量为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 - 接地

NAND Flash存储器芯片

特点:

  • 写入和擦除速度很快,价格相对便宜。

  • 使用时需要复杂的I/P接口电路(专用控制器)和存储管理操作:

    以页(Page)为最小单位进行读写;以块(Block)为最小单位进行擦除。

  • 适用于存储大量的用户数据。

  • 支持自启动引导。

Nor Flash存储芯片——SST39VF1606

有效容量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}$$表示其各字节单元地址。

NAND Flash地址计算

$$ 物理地址=块编号\times块大小\times+页编号\times页大小+页内偏移地址 $$

例如:访问第1500个块中的第25页中的第200个存储单元: $$ 物理地址=1499\times32\times512+24\times512+199=0x176F0C7 $$

$$ A_{0}\sim A_{7}=0xC7 $$

$$ A_{8}=0(对应命令码0x00) $$

$$ A_{9}\sim A_{16}=0x78 $$

$$ A_{17}\sim A_{24}=0xBB $$

$$ A_{25}=0 $$

NAND Flash存储器读写操作

读取数据时,分为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存储器的参数信息。

描述 引脚
NAND Flash存储器选择位 NCON
NAND Flash存储器页容量选择位 GPG13
NAND Flash存储器地址周期选择位 GPG14
NAND Flash存储器总线宽度选择位 GPG15

NAND Flash存储器的两种工作模式

自动引导模式:S3C2440的OM1,OM0均接为低电平时,系统处于NAND Flash自动引导模式。

普通闪存模式:支持数据读,写,擦除操作。

image-20220510135504006

存储器控制寄存器

存储器系统组织的途径

集成在微处理器芯片内部的存储器控制器和NAND Flash控制器,提供了访问存储器所需的全部控制信号。

通过其内的一组功能寄存器SFR,可以实现对存储器系统相关参数的设定以及芯片引脚状态的读取。

外围设备及接口

The Principle of Embedded System

通用输出端口(GPIO)

S3C2440总共有289根管脚,其中130根可以作为GPIO使用。

用途

  • GPIO(General Purpose I/O)——通用输入输出端口
  • 用于连接各种IO设备

image-20220510141117963

构成

  • 130各GPIO管脚分成9组,分别是GPA~GPJ。

    image-20220510141539011

  • 每个端口具有多种功能,具体哪一种可在主程序运行之前编程设置对应的控制寄存器。

  • 如果某个GPIO管脚不用于特定功能,则其可设置为普通的输入输出管脚。

端口A

  • 23个管脚。
  • 两种功能:
    1. ​ 普通输出口;
    2. ​ 用于输出外接存储器的地址信号和存储块的选择信号。

端口B

  • 11个管脚。

  • 两种功能:

    1. 普通输入/输出口;

    2. 用于DMA和总线请求和应答信号及各种时钟信号。

端口F

  • 8个管脚。

  • 两种功能:

    1. 普通输入/输出口;

    2. 用于中断请求信号——常用。

.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) $$

$$ p=(PDIV+2) $$

$$ S=SDIV $$

Footnotes

  1. 芯片内执行,即嵌入式微处理器能直接访问。

About

嵌入式系统笔记

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published