ARM汇编笔记

本文是对老师上课笔记的整理汇总,请勿转载

嵌入式系统基础

定义

嵌入到 对象体系中的专用计算机系 统。嵌入性专用性计算机系统是嵌入式系统的三个基本要素。对象系统则是指嵌入式系统所嵌入的宿主系统。
凡是与产品结合在一起的具有嵌入式特点的控制系统都可以叫嵌入式系统。

组成

包括硬件和软件两部分。硬件部分是整个系统的物理基础,它提供软件运行平台和通信接口;软件部分实际控制系统的运行。

嵌入式系统的硬件是嵌入式软件 运行的物理平台的通信接口,它的存在使嵌入式系统的优越性得以实现。嵌入式操作系统 和 嵌入式应用软件控制着整个系统的运行,提供人机交互等。 两者缺一不可,相辅相成。

嵌入式系统硬件部分

嵌入式系统的硬件包括:核心处理器外围电路外部设备三部分。

①核心处理器

嵌入式系统的硬件层的核心是嵌入式微处理器。
可以采用冯.诺依曼体系结构和哈佛体系结构;指令系统可以采用精简指令集系统和复杂指令集系统。

冯.诺依曼结构也称为普林斯顿结构,是一种将程序指令存储器和数据存储器合并在一起的存储器结构。 指令和数据的宽度相同。

哈佛结构:是一种将程序指令存储和数据存储分开的存储器结构。 程序指令存储和数据存储分开,可以使指令和数据有不同的数据宽度。

RISC和CISC之间主要的差别

指标RISCCISC
指令集一个周期执行一条指令,通过简单指令的组合实现复杂操作,指令长度固定。指令长度不固 定,执行需要多个周期。
流水线流水线每周期前进一步指令的执行需要调用一段微程序
寄存器更多通用寄存器用于特定目的的专用寄存器
Load/Store结构独立的Load/Store 指令完成数据在寄存器和外部存储器之间的传输处理器能够直 接处理存储器中的数据
②外围电路
外围电路包括:嵌入式系统的存储器、 I/O端口、复位电路、模数转换器/数模转换器(ADC/DAC)和电源。
③外部设备
外部设备指嵌入式系统与真实环境交互的各种设备,包括:通用串行总线 (USB)、存储设备、键盘、鼠标、液晶显示器(LCD)、红外数据传输(IrDA)和打印设备等。

嵌入式系统软件部分

由嵌入式操作系统和嵌入式应用软件两大部分组成。 嵌入式系统软件 一般包含四个层面:实际应用程序、应用程序接口 API、 实时操作系统 RTOS、设备驱动层。

特点

嵌入式系统的核心是嵌入式微处理器。 嵌入式微处理器一般具备以下四个特点: (1)对实时任务有很强的支持能力,能 完成多任务并且有较短的中断相应时间, 从而使内部的代码和实时内核的执行时间 减少到最低限度; (2)具有功能很强的存储区保护功能; (3)可扩展的处理器结构,能最迅速的开 发出满足应用的最高性能的嵌入式处理器; (4)嵌入式微处理器必须功耗很低。 嵌入式系统 同 PC系统 相比有以下特点: (1)嵌入式系统功耗低、体积小、专用性强; (2)为了提高执行速度和系统可靠性,嵌 入式系统中软件一般都固化在存储器芯片或单片机中; (3)嵌入式系统的 硬件 和 软件都必须高效地设计,系统要精简; (4)对软件代码质量要求很高,应该尽最大可能避免 “死机” 的发生; (5)嵌入式系统开发需要专门的 开发工具 和 开发环境。

分类

按照系统组成

嵌入式系统硬件 嵌入式系统软件

按照系统应用

①消费类电子产品; ②智能仪器、仪表类; ③通信信息类产品; ④ 过程控制类; ⑤ 国防武器设备; ⑥ 生物微电子。

按照系统实时性

①硬实时系统——指系统要确保在最坏情况下的服务时间,即对于事件响应时间的截止期限必须要得到满足; ②软实时系统——从统计的角度来说,是一个任务能够得到确保的处理时间,到达系统的事件也能够在截止前得到处理。但违反截止期限并不会带来致命的错误,像实时多媒体系统等。

嵌入式处理器分类

**(1)嵌入式微处理器(MPU) ** **(2)嵌入式微控制器(MCU) ** **(3)嵌入式DSP处理器 ** **(4)SOC片上系统 **

开发环境

(1)开发工具的选择 嵌入式系统的开发工具可以分为: 硬件开发工具 和 软件开发工具。 硬件开发工具包括:在线实时仿真 器 和 其他检测工具,如示波器等。 软件开发工具包括:编辑、交叉编 译、链接、定位软件 和 调试软件等。 在选择开发工具时要考虑:系统调 试器的功能,特别是远程调试的功能, 还有该工具支持的库函数。 还要考虑开发工具的后续升级支持, 支持的文件格式 和 符号格式等。 (2)硬件调试工具的选择 ①实时在线仿真器(ICE); ②逻辑分析仪; ③ROM仿真器; ④源程序模拟器。 (3)软件组件的选择 ①交叉环境; ②指令模拟器; ③电路开发板。

嵌入式操作系统

EOS 是相对于一般操作系统而言的, 它除具备了一般操作系统最基本的功能 如:任务调度、同步机制、中断处理、 文件功能等外,还有以下特点: (1)可装卸性; (2)强实时性; (3)统一的接口; (4)操作方便、简单,提供友好的图形 GUI、图形界面,追求易学易用; (5)提供强大的网络功能,支持 TCP/IP 协议及其他协议; (6)强稳定性,弱交互性; (7)固化代码; (8)更好的硬件适应性,也就是良好的 移植性。

实时操作系统的特征:

(1)多任务; (2)有线程优先级; (3)多种中断级别。

ARM处理器

ARM微处理器中支持字节( 8 位)、半 字(16位)、字(32位)三种数据类型。

工作状态

(1)ARM状态 执行32位的字对齐的ARM指令。 (2)Thumb状态 执行16位的、半字对齐的Thumb指令

运行模式

**(1)用户模式(USR) ** **(2)快速中断模式(FIQ) ** **(3)外部中断模式(IRQ) ** **(4)管理模式(SVC) ** **(5)数据访问终止模式(ABT) ** **(6)系统模式(SYS) ** **(7)未定义指令中止模式(UND) ** 除用户模式外的其它 6种处理器模式称为特权模式(Privileged Modes)。在特权模式下,程序可以访问所有的系统资源,也可以任意的进行处理器模式切换。 **在用户模式下,不能直接进行处理器模式的切换**,当需要进行处理器模式切换时,应用程序可以**产生异常处理**,在异常处理过程中进行处理器模式切换。这种体系结构可以使操作系统控制整个系统资源的使用。

寄存器

寄存器

ARM处理器有如下37个32位的寄存器。
(1)30 个通用寄存器;
(2)6 个状态寄存器:1 个CPSR、5 个 SPSR;
(3)1 个PC。
ARM 处理器共有 7 种运行模式,在每一种处理器模式中都有一组相应的寄存器。

在ARM状态下,任一时刻都可 以访问到 15个 通用寄存器和1~2 个状态寄存器。

特权模式除系统模式外,还可以存取相应的 SPSR、SP、LR。(5*3 = 15个寄存器)
快中断还可以存取对应的R8-R12。(5个寄存器)
所有模式公用的R0-R7、PC和CPSR,以及除快中断模式以外的其他模式公用的R8-R12。(8 + 1 + 1 + 5 = 15个寄存器)
最后是用户模式和系统模式公用的SP和LR。(2个寄存器)

通用寄存器根据其分组与否可分为以下两类: (1)未分组寄存器,包括 R0~R7;
(2)分组寄存器,包括 R8~R14。

CPSR

当前程序状态寄存器(CPSR)可以 在任何处理器模式下被访问,它包含下列内容: (1)ALU 状态标志的备份; **N[31] Z[30] C[29] V[28]** (2)当前的处理器模式; **MODE[4:0]**
[4:0]处理器模式可以访问的寄存器
0b10000UserPC,R14~R0,CPSR
0b10001FIQPC,R14_fiq~R8_fiq,R7~R0,CPSR,SPSR_fiq
0b10010IRQPC,R14_irq~R13_irq,R12~R0,CPSR,SPSR_irq
0b10011SupervisorPC,R14_svc~R13_svc,R12~R0,CPSR,SPSR_svc
0b10111AbortPC,R14_abt~R13_abt,R12~R0,CPSR,SPSR_abt
0b11011UndefinedPC,R14_und~R13_und,R12~R0,CPSR,SPSR_und
0b11111SystemPC,R14~R0,CPSR(ARMV4及更高版本)
0b10110Secure monitorPC,R14_mon~R13_mon,R12~R0,CPSR,SPSR_mon
(3)中断使能标志; **IF[7:6]** (4)设置处理器的状态。 **T[5]**

SPSR

每一种处理器模式下都有一个专用的物理寄存器做备份程序状态寄存器 (SPSR)。当特定的异常中断发生时,这个物理寄存器负责存放当前程序状态寄存 器的内容。当异常处理程序返回时,再将其内容恢复到当前程序状态寄存器。

中断

为了对处理器可以接收中断源的 数目 进行 扩充 及对中断进行必要的 管理,在 中断源 和 处理器 之间还配 有如下图所示的 中断控制器。 为了与外部事件引起的中断相区别,人们把这种由内部事件引起的中断叫做异常

中断类型

ARM处理器可以响应的中断(异常) 有:**中断**、**快中断**、**复位中断**、**软中断异常**、**预取指令中止异常**、**数据中止异常** 和 **未定义指令异常** 7 种。
I位值F位值禁止的异常/中断中断优先级
11复位(RESET)中断1
1-未定义指令(UNDEF)异常6
1-软中断(SWI)6
1-预取指令中止(PABT)异常5
1-数据中止(DABT)异常2
1-中断(IRQ)4
11快中断(FIQ)3
中断(异常)向量表的保留项 在实际应用系统中,常常会需要 多个中断(异常)向量表,这时就需 要利用这个 保留项 中数据来对这多个向量表进行 区别。 处理器响应中断(异常)后所进入的模式如下表所示:
中断(异常)进入的模式
复位(RESET)管理模式(SVC)
未定义指令(UNDEF)未定义指令中止模式(UND)
软中断(SWI)管理模式(SVC)
预取指令中止(PABT)中止模式(ABT)

中断优先级

处理器通常只有一个可屏蔽中断请求输入端。对于具有多个中断源的系统来说, 当有两个或两个以上中断源同时发生中断 请求时就会出现所谓的竞争。 具体实现方法有两种:硬件实现方法 和 软件实现方法。
(1)硬件实现方法
就是为计算机系统配备一套能按 优先等级对中断源进行**排队的硬件电路** ,以保证级别高的中断能先于级别低的中断被处理器响应。 一般情况下,这个优先排队机构可能在处理器中有一套,在中断控制器中也有一套,甚至在接口电路中也会有一套。
(2)软件实现方法
就是把所有中断源的中断请求信号分成两路,其中一路经 “或” 逻 辑送到处理器的中断请求输入端,而另一路则送入中断接口电路经数据总线送入处理器。

中断服务程序

中断服务程序与普通子程序的重要差别在于: **中断服务程序要对中断嵌套进行必要的管理**。即中断服务程序要根据需要,对程序状态寄存器中的中断允许标志进行相应的设置。 为了与普通子程序的首地址进行区分,中断服务程序的首地址通常被叫做 中断向量,或 中断矢量。 以后还会看到,凡是能直接或间接指向中断服务程序的都叫中断向量。 各种处理器如何来调用中断服务子程序的方法不尽相同,通常有两种方法: **调用方法** 和 **转移方法**。
调用方法
是在处理器收到中断请求之后, 由 中断系统硬件执行一条**子程序调用指令**来调用中断服务程序。
转移方法
是由中断系统硬件执行 一条**转移指令**来转向中断服务程序。 所有的中断向量都必须存放在一个固定的存储区域,这个集中存放了 中断向量或与中断向量相关信息的存储区域就叫做 中断向量表。

中断的处理过程

处理器响应中断的主要条件:

(1)处理器程序状态寄存器的中断屏蔽标志处于非屏蔽状态; (2)没有更高级的中断请求正在响应或正在发出、正挂起; (3)处理器在现行指令执行结束后。

中断(异常)的响应过程

当处理器响应中断(异常)请求后, 系统的硬件电路一般需要先做四项 准备工作: (1)把与程序计数器(PC)中的当前地址相关的一个值保存到(中断对应的模式的)连接寄存器LR中; (除复位中断) (2)把当前程序状态寄存器(CPSR)中 的内容保护到(中断对应的)模式私有寄存器SPSR中; (3)**将寄存器CPSR中的MODE域设置为中断(异常)应进入的运行模式**; (在此之后还应切换工作状态到ARM状态) (4)对CPSR的I位和F位进行相应的设置,以防止再次响应同一个中断请求。(7种中断,除FIQ中断和复位中断是禁止FIQ和IRQ中断外,其余都是禁止FIQ中断。) 接下来便到中断向量表中获取中断向量,转向用户所需编写的中断 (异常)服务程序。

中断(异常)处理的返回

异常/中断地址说明
复位(RESET)--
未定义指令(UNDEF)LR指向未定义指令的下一条指令
软中断(SWI)LR指向SWI指令的下一条指令
预取指令中止(PABT)LR-4指向导致预取指令中止 异常的那条指令
数据中止(DABT)LR-8指向导致数据中止异常 的那条指令
中断(IRQ)LR-4IRQ处理程序的返回地址
快中断(FIQ)LR-4FIQ处理程序的返回地址
异常处理完毕之后,ARM微处理器 会执行以下几步操作从 异常返回: (1)将连接寄存器 LR 的值减去相应的偏 移量后送到 PC 中; (2)**将 SPSR 复制回 CPSR 中**; (3)若在进入异常处理时设置了中断禁止位,则要在此清除。

快中断

(1)专门为快中断 FIQ **设置了一个 FIQ 模式**,并为这个模式**配置了 较多的私有寄存器**,从而可使中断服务程序有足够的寄存器来使用,而不必与被中断服务程序使 用同一组寄存器,这样就免去了因寄存器 冲突而必需的保护及恢复现场工作。 (2)ARM把 FIQ 的中断向量放在了中断 (异常)向量表末尾 0X0000001C 处,因此它后面没有其它中断向量,允许用户将 **中断服务程序直接放在中断向量表末尾**。

ARM汇编指令:

condition: EQ Z=1 相等 NE Z=0 不相等 CS/HS C=1 无符号数大于或等于 CC/LO C=0 无符号数小于 MI N=1 负数 PL N=0 正数或零 VS V=1 溢出 VC V=0 未溢出 HI C=1且Z=0 无符号数大于 LS C=0且Z=1 无符号数小于或等于 GE N=1且V=1或N=0且V=0 带符号数大于或等于 LT N=1且V=0或N=0且V=1 带符号数小于 后缀: S,指令执行后程序状态寄存器的条件标志位将刷新。(有的指令不使用 S 后缀,也要刷新条件标志位,如CMP、CMN、TST等指令。) !,在指令的地址表达式中含有 !后缀时,指令执行后,基地址寄存器中的地址将会发生变化(回写)。 B,指令所涉及的数据是一个字节,不是一个字或半字。 T,指令在特权模式下对存储器的访问,将被存储器看作是用户模式的访问。 (1)前变址模式
LDR R1, [R2#0X5] 
(2)自动变址模式
LDR R0, [R1#4]!
R0=[R1+4], R1=R1+4
(3)后变址模式
LDR R0, [R1], #4
R0=[R1],R1=R1+4
前变址模式不会改变寄存器的值,自动变址模式和后变址模式会改变寄存器的值。 第二操作数: ①#immed_8r——8位常数表达式 ②Rm——寄存器方式 ③Rm,shift——寄存器移位方式
ASR #n;算数右移n位(1≤ n ≤32)
LSL #n;逻辑左移n位(0≤ n ≤31)
LSR #n;逻辑右移n位(1≤ n ≤32)
ROR #n;循环右移n位(1≤ n ≤31)
RRX ;带扩展的循环右移 1


ARM 指令可以分为:跳转指令、 数据处理指令、程序状态寄存器 (PSR)传输指令、Load/Store指令、 协处理器指令 和 异常中断产生指令六类。
ARM指令集可以分为:跳转指令、 数据处理指令、乘法指令与乘加指令、 程序状态寄存器访问指令、加载/存 指令、批量数据加载/存储指令、 数据交换指令、移位指令、协处理器 指令、异常产生指令等 10 大类。

跳转指令

B{<cond>}   <target>
BL{<cond>}  <target>    //PC->LR
BX{<cond>}  Rm          //0->Rm[0]
BLX         <target>    //PC->LR        ARM->Thumb
BLX{<cond>} Rm          //PC->LR        Rm[0]->T        0->Rm[0]

B 指令和 BL 指令都是以一个 24 位有符号数 signed_immed_24 间接提供目标地址,真正的目标地址是由处理器根据这个有符号数和当前的PC 值计算出来的。

数据处理指令

数据处理指令分为:算术操作指令、 按位逻辑操作指令、寄存器移位指令、 比较操作。

算术操作指令

ADD{<cond>}{S}  <Rd>, <Rn>, <operand2>  //加
SUB{<cond>}{S}  <Rd>, <Rn>, <operand2>  //减
ADC{<cond>}{S}  <Rd>, <Rn>, <operand2>  //带进位加
SBC{<cond>}{S}  <Rd>, <Rn>, <operand2>  //带借位减
RSB{<cond>}{S}  <Rd>, <Rn>, <operand2>  //逆向减
RSC{<cond>}{S}  <Rd>, <Rn>, <operand2>  //带借位逆向减

加法进位C置为1,否则置为0,减法借位C置为0,否则置为1

按位逻辑操作指令

AND{<cond>}{S}  <Rd>, <Rn>, <operand2>  //会将C置为0
ORR{<cond>}{S}  <Rd>, <Rn>, <operand2>
EOR{<cond>}{S}  <Rd>, <Rn>, <operand2>
BIC{<cond>}{S}  <Rd>, <Rn>, <operand2>

寄存器移位操作指令

MOV{<cond>}{S}  <Rd>, <operand2>
MVN{<cond>}{S}  <Rd>, <operand2>    //operand按位取反

两条指令均会影响C标志位,MOV会将C置为0
<operand2>是立即数时,限制较大,如果要往寄存器中写入一个较大的数字,如0x12345678这种,可以用伪指令的LDR,LDR <Rd>, =0x12345678

比较操作指令

CMP{<cond>} <Rd>, <operand2>    //减
CMN{<cond>} <Rd>, <operand2>    //operand2取反,不存储结果
TST{<cond>} <Rd>, <operand2>    //与
TEQ{<cond>} <Rd>, <operand2>    //异或

乘法指令与乘加指令

MUL{<cond>}{S}  <Rd>, <Rm>, <Rs>
MLA{<cond>}{S}  <Rd>, <Rm>, <Rs>, <Rn>  //Rm*Rs+Rn->Rd
SMULL{<cond>}{S}<RdLo>, <RdHi>, <Rm>, <Rs>//Rm*Rs,[0-31]->RdLo [32-63]->RdHi
SMLAL{<cond>}{S}<RdLo>, <RdHi>, <Rm>, <Rs>//Rm*Rs,[0-31]+RdLo->RdLo [32-63]+RdHi->RdHi
UMULL{<cond>}{S}<RdLo>, <RdHi>, <Rm>, <Rs>//无符号数
UMLAL{<cond>}{S}<RdLo>, <RdHi>, <Rm>, <Rs>//无符号数

标志位修改N、Z

程序状态寄存器访问指令

MRS {<cond>}    <Rd>, CPSR  //CPSR -> Rd
MRS {<cond>}    <Rd>, SPSR

MSR{<cond>}  CPSR_<fields>,<operand2>   //fields:f s x c,operand2->fields
MSR{<cond>}  SPSR_<fields>,<operand2>
fieldbitsname
f[31:24]条件标志域
s[23:16]状态位域
x[15:8]扩展位域
c[7:0]控制位域

加载/存储指令

LDR{<cond>} <Rd>, <address_mode>
LDR{cond}H  <Rd>, <address_mode>    //半字,高16位清零
LDR{cond}B  <Rd>, <address_mode>    //字节,高24位清零
STR{cond}   <Rd>, <address_mode>
STR{cond}H  <Rd>, <address_mode>
STR{cond}B  <Rd>, <address_mode>

<address_mode>可为label,,label必须是当前指令-4~4KB范围内

批量数据加载/存储指令

LDM{<cond>} {mode} <Rd>{!},<reglist>{^}
STM{<cond>} {mode} <Rd>{!},<reglist>{^}
mode作用RD
IA先传送数据,后基地址加4(Rd)
IB先基地址加4,后传送数据(Rd)+4
DA先传送数据,后基地址减4(Rd)
DB先基地址减4,后传送数据(Rd)-4
LDMIA R0,{R2R3R4R5}  //[R0]->R2 [R0+4]->R3 [R0+8]->R4 [R0+12]->R5

FA 递增满堆栈 LDMFA STMFA 对应LDMDA STMIB
FD 递减满堆栈 LDMFD STMFD 对应LDMIA STMDB
EA 递增空堆栈 LDMEA STMEA 对应LDMDB STMIA
ED 递减空堆栈 LDMED STMED 对应LDMIB STMDA

STMXX SP!,{R1-R7,LR}    XX:FD ED FA EA
LDMXX SP!,{R1-R7,LR}    XX:FD ED FA EA

“^” 为可选后缀。当指令为 LDM 且 寄存器列表中包含 R15(PC)时,选用该后缀表示除了正常的数据传送之外, 还将 SPSR 复制到 CPSR ;而当寄存器列表中不包含 R15(PC) 时,使用该后缀则表示在用户模式中进行寄存器与存储器的数据传递。在系统模式下禁用该后缀。

注意

LDR LDM中L都是Load,两者都是从存储器加载到寄存器,前者:第一参数是寄存器,第二参数是存储器地址,后者:第一参数是存储器地址,第二参数是寄存器。
同理,STR STM中S都是Store,两者都是store寄存器(到存储器),前者:第一参数是寄存器,第二参数是存储器地址,后者:第一参数是存储器地址,第二参数是寄存器。

数据交换指令

交换指令为原子操作

SWP{<cond>}     <Rd>, <Rm>, {<Rn>}  //[Rn]->Rd, Rm->[Rn]
SWPB{<cond>}    <Rd>, <Rm>, {<Rn>}  //字节

特殊情况的总结

除专用指令外会修改cpsr的指令

1.16-bit体系下(thumb),所有对pc进行修改并带s的指令,都会造成spsr->cpsr
2.ldm的寄存器列表中含pc,也会造成spsr->cpsr

伪代码

特征:(1)伪指令是一条指令; (2)伪指令没有指令代码。
伪指令的作用:(1)程序定位的作用; (2)为非指令代码进行定义; (3)为程序完整性做标注; (4)有条件的引导程序段。

ARM ASM中,伪代码要顶格书写。

MACRO 和 MEND 宏指令可以为一个程序段定义一个名称。
MACRO
标 号 宏 名 参数1, $参数2,…..
程序段(宏定义体)
MEND

MEXIT 用于从宏定义中跳转出去。

宏指令

ADR{cond}   <reg>, <expr>   //近地址读取宏指令 expr通常是地址标号。
ADRL{cond}  <reg>, <expr>   //远地址读取宏指令 Expr 为表达式,必须是 64KB 以内非字对齐地址,256KB 以内的字对齐地址。
LDR{cond}   <reg>, ={expr | label - expr}   //全范围地址读取宏指令

ADR,由于指令 ADD 或 SUB 中对 立即数的 限制,因此标号地址就不能距离当前指令 的地址(PC)过远。对于非字对齐地址来 说,其距离必须在 255 字节以内;而对于 字对齐地址来说,距离必须在 1020 字以 内。所以 ADR 叫做 近地址 读取指令。
ADRL,该指令只能在 ARM 状态下使用,在 Thumb 状态下不能使用。汇编时,ADRL 宏指令由汇编器替换成 两条合适的指令。
LDR,①当 expr 的值未超过 MOV 或 MVN 指令 所限定的取值范围时,汇编器用 ARM 的 MOV 或 MVN 指令来取代宏指令 LDR; ②当 expr 的值超过 MOV 或 MVN 指令所 限定的取值范围时,汇编器将常数 expr 放在由 LTORG 定义的文字缓冲池,同时用 一条 ARM 的装载指令 LDR 来取代宏指令 LDR ,而这条装载 LDR 指令则用 PC 加偏 移量的方法到文字缓冲池中把该常数读取到指令指定的寄存器。

为变量定义或赋值的伪指令

声明全局变量伪指令 GBLA、GBLL和GBLS,GBLA、GBLL 和 GBLS 伪指令用于定义一个 ARM 程序中的 全局变量,并将其初始化。
GBLA 定义一个 全局数字变量,其默认初值为 0 ;
GBLL 定义一个 全局逻辑变量 ,其默认初值为 FALSE(假);
GBLS 定义一个 全局字符串变量,其默认初值为 空 ;

声明 局部变量 伪指令 LCLA、LCLL和LCLS,LCLA、LCLL和LCLS 伪指令用于定义一个 ARM 程序中的 局部变量,并将其初始化。
LCLA 定义一个 局部数字变量,其默认初值为 0;
LCLL 定义一个 局部逻辑变量,其默认初值为 FALSE(假);
LCLS 定义一个 局部字符串变量,其默认初值为 空。

变量赋值伪指令 SETA、SETL和SETS
伪指令 SETA、SETL和SETS 用于给一个 已经定义 的 全局变量 或 局部变量 进行赋值。

定义寄存器列表伪指令

指令 LDM/STM 需要使用一个比较长的寄存器列表,使用伪指令 RLIST 可对一个列表定义一个统一的名称。

<name>  RLIST   <{list}>

数据定义伪指令

数据定义伪指令 LTORG
伪指令 LTORG 用来说明某个存储区域为一个用来暂存数据的数据缓冲区,也叫文字池 或 数据缓冲池。

 AREA example, CODE, READONLY
 Start  BL  Func1
             …
 Func1  LDR R1,=0x800
        MOV PC,LR
 LTORG  ;定义数据缓冲池的开始位置
 Date   SPACE  40 ;数据缓冲池有40个被初始化为0的字节
        END
MAP <expr>{,<baseregister>}
<label> FIEL    <expr>

MAP 通常和 FIELD 伪指令相配合来定义一个结构化的内存表。
MAP 用于定义一个结构化的内存表的首地址。
FIELD 伪指令用于定义一个结构化内存表中的数据域。

 MAP 0X100 ;定义结构化内存表首地址为 0X100
 A FIELD 16 ;定义A的长度为16字节,位置为 0X100
 B FIELD 32 ;定义B的长度为32字节,位置为 0X110
 S FIELD 256 ;定义S的长度为256字节,位置为 0X130

注意:MAP 和 FIELD 伪指令仅用 于定义数据结构,并不实际分配存储单元。 FIELD 也可用“#” 代替。

SPACE 伪指令用于分配一片连续的存储区域并初始化为 0。

<label>  SPACE  <expr>  //表达式为要分配的 字节数,SPACE 也可用“%” 代替。

DCB 伪指令用于分配一片连续的 以字节为单位 的存储区域,并用指定的表达式对其进行初始化。

{<label>}   DCB <expr>  //expr 为表达式,为从标号开始存放的数据。该表达式可以为 0~255 的数字或字符串。DCB 也可用“=” 代替 
Dat1 DCB 0x7E ;
Str DCB “ This is a test ! ” ;分配一片连续的字节存储单元并初始化。 

DCD(或DCDU)伪指令用于分配一片连续的字存储单元,并用伪指令中指定的表达式初始化。

<label> DCD(或DCDU)  <expr>  //表达式可以为 程序标号 或 数字表达式。用 DCD 分配的字存储单元是字对齐的,而用 DCDU 分配的字存储单元并不严格要求字对齐。DCD 也可用“&” 代替。

DCDO 用来为字分配一段字对准的内存单元,并用一个地址偏移量初始化,这个偏移量是 DCDO 定义的标号地址到 R9 指定的地址之间的差值。

{<label>}   DCDO    用来初始化的数值或标号

DCFD(或DCFDU)伪指令用于为双精度的浮点数分配一片连续的字存储单元,并用伪指令中指定的表达式初始化。每个双精度的浮点数占据 两个字单元。

<label> DCFD(或DCFDU)    <expr>  //用 DCFD 分配的字存储单元是字对齐的而用 DCFDU 分配的字存储单元并不严格字对齐。

DCFS(或DCFSU)伪指令用于为 单精度的浮点数 分配一片连续的字存储单元,并用伪指令中指定的表达式初始化。每个单精度浮点数占据 一个字单元。

<label> DCFS(或DCFSU)    <expr>  //用 DCFS 分配的字存储单元是字对齐的;而用 DCFSU 分配的字存储单元并不严格字对齐。

DCQ(或DCQU)伪指令用于分配一片以 8字节 为单位的连续存储区域,并用伪指令中指定的表达式初始化。

<label> DCQ(或DCQU)  <expr>  //用 DCQ 分配的存储单元是字对齐的,而用 DCQU 分配的字存储单元并不严格字对齐。

DCW(或DCWU)伪指令用于为数据分配一片连续的 半字 存储单元,并用表达式对其进行初始化。

<label> DCW(或DCWU)  <expr>  //用 DCW 分配的半字存储单元是严格按半字对齐的,而用 DCWU 分配的半字存储单元并不严格按半字对齐。

控制程序流向伪指令

IF、ELSE 和 ENDIF伪指令能根据条件的成立与否决定是否执行某个程序段。

IF 逻辑表达式
  程序段1
ELSE
  程序段2
ENDIF

WHILE 和 WEND 伪指令根据条件的成立与否决定是否重复汇编一个程序段。

WHILE  逻辑表达式
   程序段
WEND

其他伪指令

定义对齐方式伪指令 ALIGN
ALIGN=表达式 //对齐方式为2表达式的值。 使用 ALIGN 伪指令可用添加填充字节的方式,使当前位置实现某种对齐方式。在开发环境中看不到。

AREA Init, CODE, READONLY, ALIGN=3
  代码段
END

段定义伪指令

AREA <sectionname>,{<attr>}{,<attr>}…   //sectionname:段名,若段名以数字开头,则必须用符号“|”扩起来,如|1_test|。

attr:属性字段,多个属性字段用逗号分隔。
CODE 代码段 默认读/写属性为READONLY
DATA 数据段 默认读/写属性为READWRITE
READONLY 本段为只读
READWRITE 本段为可读可写
ALIGN表达式 ELF 的代码段和数据段为字对齐
COMMON 多源文件共享段

CODE16 和 CODE32
CODE16 用来表明其后的指令均为 16位Thumb 指令;CODE32 伪指令则表明其后面的指令均为 32位ARM 指令。

定义程序入口点伪指令 ENTRY

  AREA Init, CODE, READONLY
  ENTRY;
  …..

汇编结束伪指令 END
END 伪指令用于通知编译器汇编工作到此结束,不再往下汇编了。

外部可引用符号声明伪指令 EXPORT(或GLOBAL)
用伪指令 EXPORT 可以声明一个其他源文件可引用的符号,这种符号也叫做外部可引用符号。
EXPORT 符号 {[WEAK]} //EXPORT 可用 GLOBAL 代替。[WEAK]选项声明其他的同名符号优先于该符号被引用。

等效伪指令 EQU
EQU 伪指令用于为程序中的常量、标号等定义一个等效的字符名字,其作用类似于 C语言 中的 #define。
名称 EQU 表达式 {,类型} //由 EQU 伪指令定义的字符名称,当其表达式为 32位 常量时,可以指定表达式的数据类型,有以下三种类型:CODE16、CODE32 和 DATA。EQU 也可用“*” 代替。

IMPORT
当在一个源文件中需要使用另外一个源文件的外部可引用符号时,在被引用的符号前面必须使用伪指令 IMPORT 对其进行声明。
IMPORT 符号 {[WEAK]} //[WEAK] 选项表示当前所有的源文件都没有定义这样一个符号时,编译器也不报错,并在多数情况下将该符号置为 0 。但该符号被 B 或 BL 指令所引用时,则将 B 或 BL 指令置为 NOP 操作。

EXTERN
EXTERN 伪指令与 IMPORT 伪指令的功能基本相同,但如果当前源文件中的程序实际并未使用该指令,则该符号不会加入到当前源文件的符号表中。其它与 IMPORT 相同。

GET(INCLUDE)
GET 伪指令用于将一个源文件包含到当前的源文件中,并将被包含的源文件在当前位置进行汇编。
GET 文件名 //GET 伪指令只能用于包含 源文件,包含目标文件则需要使用 INCBIN 伪指令。可以使用 INCLUDE 代替 GET。

INCBIN
INCBIN 伪指令用于将一个 目标文件 或 数据文件 包含到当前的源文件中,被包含的文件不做任何变动地存放在当前文件中,编译器从其后开始继续处理。
INCBIN 文件名

  AREA Init, CODE, READONLY
  INCBIN a1.dat
  INCBIN c:\a2.txt
  …
  END

RN
RN 伪指令用于给一个寄存器定义一个别名,以提高程序的可读性。
名称 RN 表达式 //名称为给寄存器定义的别名,表达式为寄存器的编码。

ROUT
ROUT 伪指令用于给一个局部变量定义作用范围。
名称 ROUT //在程序中未使用该伪指令时,局部变量的作用范围为所在的 AREA ;而使用 ROUT 后,局部变量的作用范围为当前 ROUT 和下一个 ROUT 之间。

ARM编程:

各种源文件先由编译器和汇编器将它们分别编译或汇编成汇编语言文件及目标文件。
连接器负责将所有目标文件连接成一个文件并确定各指令的确定地址, 从而形成最终可执行文件。
连接器:(1)生成与地址相关的代码,把所有文件连接成一个可执行文件; (2)根据程序员所指定的选项,为程序分配地址空间; (3)给出连接信息,以说明连接过程和连接结果。

符号

在ARM汇编语言中,符号 可以代表 地址、变量 和 数字常量。
符号命名规则如下:
第一:符号由大小写字母、数字以及下画线组成;
第二:局部标号以数字开头,其他的符号都不能以数字开头;
第三:符号是区分大小写的;
第四:符号中的所有字符都是有意义的;
第五:符号在其作用范围内必须唯一;
第六:程序中的符号不能与指令助记符、伪指令、宏指令同名。

优先级

运算次序遵循如下的优先级: (1)优先级相同的双目运算符运算顺序为从左到右;(2)相邻的单目运算符的运算顺序为从右到左,且单目运算符的优先级高于其他运算符; (3)括号运算符的优先级最高。

汇编语言的表达式和运算符

运算次序遵循如下的优先级:
(1)优先级相同的双目运算符运算顺序为从左到右;
(2)相邻的单目运算符的运算顺序为从右到左,且单目运算符的优先级高于其他运算符;
(3)括号运算符的优先级最高。

汇编程序访问全局 C 变量

 AREA globals, CODE, READONLY
 EXPORT asmsubrouttine
 IMPORT globvar
asmsubrouttine
 LDR R1,=globvar
 LDR R0,[R1]
 STR R0,[R1]
 END

C与汇编之间的函数调用

在 ARM 工程中,C 程序调用汇编函数和汇编程序调用 C 函数是经常发生的事情。为此人们制定了 ARM-Thumb 过程调用标准 ATPCS(ARM-Thumb Procedure Call Standard)。

函数是通过寄存器和堆栈 来传递参数和返回函数值的。 ATPCS 规定,ARM 的数据堆栈为 FD 型堆栈,即递减满堆栈。

ATPCS 标准规定,对于参数个数不多于 4 的函数,编译器必须按参数在列表中的顺序,自左向右为它们分配寄存器 R0~R3。其中函数返回时,R0 还被用来存放函数的返回值。如果函数的参数多于4个, 那么多余的参数则按自右向左的顺序压入数据堆栈,即参数入栈顺序与参数顺序相反。

汇编调用C函数 //汇编import,BL

int g(int a, int b, int c, int d, int e) 
{ 
    return a+b+c+d+e; 
}
 EXPORT    f
 AREA   tt,  CODE,  READONLY 
 IMPORT   g   ;声名g为外部引用符号 
 ENTRY
f
 STR   LR,   [SP,#-4]! ;断点存入堆栈,解决嵌套、返回 
 ADD  R1, R0, R0  ;(R1)= i*2 
 ADD  R2, R1, R0  ;(R2)= i*3 
 ADD  R3, R1, R2  ;(R3)= i*5 
 STR   R3, [SP, #-4]! ;将(R3)即第5个参数i*5存入堆栈 
 ADD  R3, R1, R1 ;(R3)= i*4
 BL  g  ;调用C函数g(),返回值在寄存器R0ADD SP, SP, #4 ;清栈,第5个参数 
 RSB R0, R0, #0  ;函数f的返回值(R0)=0-(R0) 
 LDR PC, [SP],#4   ;恢复断点并返回 
 END

C调用汇编函数 //汇编export C用extern

 AREA tt, CODE, READONLY 
 EXPORT strcopy 
strcopy  
 LDRB R2,[R1],#1 
 STRB R2,[R0],#1 
 CMP R2,#0 
 BNE strcopy 
 MOV PC,LR 
 END
extern void strcopy(char *d,const char * s); 
int main(void) { 
    const char *src = “source”; 
    char dest[10]; 
    ....... 
    strcopy(dest, src); 
    ..........
} 

内联汇编

内联汇编与真实汇编之间有很大区别,会受到很多限制。
(1)它不支持 Thumb 指令;除了程序状 态寄存器 PSR 之外,不能直接访问其他 任何物理寄存器等;
(2)如果在内联汇编程序指令中出现 了以某个寄存器名称命名的操作数,那 么它被叫做虚拟寄存器,而不是实际的 物理寄存器。编译器在生成和优化代码 的过程中,会给每个虚拟寄存器分配实 际的物理寄存器,但这个物理寄存器可 能与在指令中指定的不同。唯一的一个 例外就是状态寄存器 PSR ,任何对 PSR 的引用总是执行指向物理 PSR;
(3)在内联汇编代码中不能使用寄存 器 PC(R15)、LR(R14)和SP (R13),任何试图使用这些寄存器的 操作都会导致出现错误消息;
(4)鉴于上述情况,在内联汇编语句块中最好使用 C 或 C++ 变量作为操作数;
(5)虽然内联汇编代码可以更改处理器模式,但更改处理器模式会禁止使用 C 操作数或对已编译 C 代码的调用,直到将处理器模式恢复为原设置 之后。

 _ _asm     //声名内联汇编代码
{
    MRS  tmp, CPSR
    BIC  tmp, tmp, #0x80
    MSR  CPSR_c, tmp
}

嵌入式汇编

嵌入式汇编程序是一个编写在C 程序外的单独汇编程序,像C函数一样被调用。
参数名只允许使用在参数列表中,不能用在嵌入式汇编函数体内。

 _ _asm int add(int i, int j)
       {
          ADD  R0, R0, R1
          MOV  PC, LR
       }

内联汇编代码与嵌入式汇编代码之间的差异

1、内联汇编代码使用高级处理器抽象, 并在代码生成过程中与 C 和 C++代码 集成。因此编译程序将C 和 C++代码与汇编代码一起进行优化;
2、与内联汇编代码不同,嵌入式汇编代码从 C 和 C++ 代码中分离出来单独进行汇编,产生与 C 和C++ 源代码编译对象相结合的编译对象;
3、可通过编译程序来内联汇编代码, 但无论是显示还是隐式,都无法内联嵌入式汇编代码。

项目内联汇编嵌入式汇编
指令集仅限于ARMARM和Thumb
ARM汇编程序命令不支持支持
C表达式支持仅支持常量表达式
优化代码支持不支持
内联可能从不
寄存器访问不使用物理寄存器使用物理寄存器
返回指令自动生成显示编写

汇编初始化和主应用部分

由于在用于完成初始化任务的汇 编语言程序中需要在 特权模式 下做 一些诸如修改 CPSR 等特权操作,所 以不能过早地进入用户模式。(上电 复位后进入SVC模式,除用户模式外, 其它模式中能任意切换工作模式)。

当所有的系统初始化工作完成之 后,就需要把程序流程转入主应用程 序。最简单的方法是,在汇编语言程 序末尾使用跳转指令 B 或 BL 直接从 启动代码转移到 C/C++ 程序入口。
B main ;跳转到C/C++程序

 IMPORT   main 
 AREA  Init, CODE, READONLY 
ENTRY 
 LDR R0, =0X3FF0000 
 LDR R1, =0XE7FFFF80 
 STR R1, [R0] 
 LDR SP, =0X3EE1000 
 BL main 
 END

S3C2440嵌入式系统

S3C2440A 专用寄存器注释:
①在小端模式下,必须使用小端地址;大 端模式下,必须使用大端地址;
②每个特殊寄存器必须按照推荐的方式进 行操作;
③除了ADC寄存器,RTC寄存器 和 UART寄 存器外,其他寄存器都必须以字为单元( 32位)进行读写;
④对ADC,RTC,UART寄存器进行读/写时, 必须仔细考虑使用的大/小端模式;
⑤W:32位寄存器,必须用 LDR/STR 指令或i整型数型指针(int )进行访问; HW:16位寄存器,必须用 LDRH/STRH 或 短整型数指针(short int )访问; B:8位寄存器,必须用LDRB/STRB 或字符型指针(char int *)访问。

寄存器名地址(大端)功能
BWSCON0X48000000总线宽度和等待控制
BANKCON00X48000004ROM控制
BANKCON10X48000008BANK1控制
BANKCON20X4800000CBANK2控制
BANKCON30X48000010BANK3控制
BANKCON40X48000014BANK4控制
BANKCON50X48000018BANK5控制
BANKCON60X4800001CBANK6控制
BANKCON70X48000020BANK7控制
REFRESH0X48000024DRAM/SDRAM刷新控制
BANKSIZE0X48000028存储器大小
MRSRB60X4800002CSDRAM的模式设置寄存器
MRSRB70X48000030SDRAM的模式设置寄存器

存储控制器

(1)小/大端(通过软件选择);
(2)地址空间:每BANK有128MB(共有 1GB/8BANKS);
(3)除BANK0(只能是16/32位宽)之 外,其他BANK都具有可编程的访问大小 (8/16/32位);
(4)总共8个存储器BANK,6个是ROM、 SRAM等类型存储器BANK,剩下的2个可以 为ROM、SRAM、SDRAM等存储器BANK;
(5)7个固定的存储器BANK的起止地址;
(6)最后一个BANK的起始地址是可调整的;
(7)最后2个BANK的大小是可编程的;
(8)所有存储器BANK的访问周期都是可编程的;
(9)总线访问周期可以通过插入外部等待来延长;
(10)支持SDRAM的自刷新和掉电模式。

BANK0总线宽度

BANK0 的数据总线(nGCS0)必须首 先设置成 16位或32位的,因为 BANK0 通 常作为 引导ROM区(映射到地址 0X00000000)。在复位时,系统将检测 OM[1:0] 上的逻辑电平,并依据这个电 平来决定 BANK0 区存储器的总线宽度。

OM1(操作模式1)OM0(操作模式0)导入ROM数据宽度
00Nand Flash Mode
0116位
1032位
11测试模式
存储器地址引脚S3C2440地址/8位数据总线S3C2440地址/16位数据总线S3C2440地址/32位数据总线
A0A0A1A2
A1A1A2A3

BWSCON

①在这个存储控制器里,所有类型的主时 钟都对应着总线时钟。例如:SRAM的HCLK 就是总线时钟,SDRAM的SCLK也和总线时钟 相同;
②nBE[3:0]相当于nWBE[3:0]和nOE进行 “与”之后的信号。

BANKCONn

BANKCON6~7:
MT [16:15] 决定BANK6和BANK7的存储器类型。
00:ROM或SRAM;
01:保留
10:保留;
11:Sync.DRAM

REFRESH

它的设置决定了SDRAM的刷新是否允许、刷新模式、RAS预充电的时间、RAS和 CAS最短时间、CAS保持时间以及刷新计数值。

BANKSIZE

BANKSIZE寄存器是控制BANK大小的寄存器,主要是决定BANK6/7 的存储区域的空间大小。

SDRAM模式寄存器集寄存器(MRSR)

注意:当代码在 SDRAM 中运行时, 绝不能够重新配置 MRSR 寄存器。 重要说明:在掉电模式下, SDRAM 必须进入 SDRAM 的自我刷新模式。

NAND Flash控制器

由于 NOR Flash 价格较高,而 SDRAM 和 NAND Flash 存储器相对经济,这样促使一些用户在 NAND Flash 上执行启动代 码,在 SDRAM 上执行主程序。
S3C2440A 的驱动代码可以在外部的 NAND Flash 存储器上被执行。为了支持 NAND Flash 的 boot loader,S3C2440A 配备了一个内部的 SRAM 缓冲器名为 “Steppingstone”。
启动时,NAND Flash 上的前 4KByte 字节 将被装载到 Steppingstone 中,并且装载到 Steppingstone 上的启动代码会被执行。
一般情况下,启动代码会拷贝 NAND Flash 上的内容到 SDRAM 中,在引导代码执行完毕后就跳转到 SDRAM 执行。使用硬件的 ECC 对 NAND Flash 的数据进行有效性检查。在完成拷贝的基础上, 主程序将在 SDRAM 上被执行。
注:在自动重启期间,ECC没有检查, 因为NAND Flash的前4KB数据一般认为没有位错误。

特性

①自动启动:启动代码在重启时被传输 到 4kbytes 的 Steppingstone 上。传输后代码会在 Steppingstone 上被执行;
②NAND Flash 存储器接口:支持 256字 、512 字节、1000 字 和 2000 Byte 页 ;
③软件模式:用户可以直接访问 NAND Flash,例如这个特性可以被用于对 NADN Flash 存储器的读/擦除/编程;
④接口:8/16 位的 NADN Flash 存储器接口总线;
⑤硬件 ECC 生成,检测和指示(软件纠错);
⑥SFR 接口:支持小端模式,对于数据和 ECC 数据寄存器的字节/半字/字访问, 对于其他寄存器的字访问;
⑦Steppingstone 接口:支持大小端,字节/半字/字访问;
⑧Steppingstone 4kB 内部 SRAM 缓冲器可以在 NAND Flash 启动后被用于其他目的。

Steppingstone是一块内部sram,其大小为4KB,映射地址在bank7之后,即0x40000000。

引脚功能

OM[1:0]=00:使能NAND Flash存储器启动;

NCON: NAND Flash存储器选择 0:普通NAND Flash(256 字/512 字 节页大小,3/4 地址周期); 1:先进NAND Flash(1K字/2K字节页 大小,4/5 地址周期)。

GPG13: NAND Flash存储器页容量选择 0:页=256 字(NCON=0)或页=1K字( NCON=1); 1:页=512 字节(NCON=0)或页=2K字 节(NCON=1)。

GPG14: NAND Flash存储器地址周期选择 0:3 个地址周期(NCON=0)或4 个地 址周期(NCON=1); 1:4 个地址周期(NCON=0)或5 个地 址周期(NCON=1)。

GPG15: NAND Flash存储器总线宽度选择 0:8 位总线宽度; 1:16 位总线宽度。

寄存器

(1) NAND Flash 配置寄存器 (NFCONF)
(2) NAND Flash 命令设置寄存器(NFCMD)
(3) NAND Flash 地址设置寄存器(NFADDR)
(4) NAND Flash 数据寄存器(NFDATA)
(5) NAND Flash 操作状态寄存器(NFSTAT)
(6) NAND Flash ECC寄存器(NFECC)

ECC

NAND Flash 控制器包括 4个 ECC( 错误纠错码)模块。两个模块(一个用于 data[7:0],一个用于data[15:8])可以被用于(上限)2048bytes 的 ECC奇偶码的生成,另外两个模块(一个用于 data[7:0],一个用于data[15:8])可以被用于(上限)16bytes 的 ECC奇偶校验码的生成。

• 28位 ECC奇偶码 = 22位行奇偶 + 6位 列奇偶;
• 14位 ECC奇偶码 = 8位行奇偶 + 6位列 奇偶

时钟和功率管理

时钟和功率管理模块由 三部分 组成: 时钟控制、USB控制 和 功率控制。
S3C2440 的时钟控制逻辑能够产生系 统所需要的时钟,包括:CPU的FCLK、AHB 总线接口的HCLK 和 APB总线接口的PCLK。
S3C2440 有两个PLL,一个用于FCLK、 HCLK、PCLK;另一个用于USB模块 (48MHZ)。时钟控制逻辑能够由软件控制 不将 PLL 连接到各接口模块以降低处理器 时钟频率,从而降低功耗。
S3C2440 有各种针对不同任务提供的最佳功率管理策略,功率管理模块能够使系统工作在如下四种模式:正常模式、低 速模式、空闲模式 和 掉电模式。

正常模式

功率管理模块向 CPU 和 所有外部设备提供时钟。这种模式下,当所有外设都开启时,系统功率将达到 最大。用 户可以通过软件控制各种外设的开关。
在正常模式下,所有的外设和基本模块,包括:电源管理模块、CPU 核、总线控制器、寄存器控制器、中断控制器和DMA,都能完全正常工作。 但是,除基本模块外,可以通过使用 S/W 对每一个外设时钟进行选择性的停止,以降低功耗。

低速模式

没有PLL的模式。与正常模式不同,低速模式直接使用外部时钟(XTIpll或者 EXTCLK)作为FCLK,这种模式下,功率仅由外部时钟决定。
低速模式是非PLL模式。与正常模式不同的是:低速模式没有通过 PLL电 路 。而是直接使用了一个外部时钟 (ETIpll或者EXTCLK)作为 FCLK 信号。 在此模式中,电源的功耗仅取决于外部 时钟的频率,将 PLL 自身的耗电排除在外。

空闲模式

功率管理模块仅关掉FCLK,而继续提供时钟给其他外设。空闲模式可以减少由于CPU核心产生的功耗。任何中断请求都可以将CPU从中断模式唤醒。
在空闲模式下,仅停止为 CPU 提 供时钟信号,只对:总线控制器、存储器控制器 和 电源管理模式等外设提供时钟。如果要退出空闲模式,则 EINT[23:0] 或者 RTC 告警中断,或者其他的中断必须处于活动状态(如果想使用 EINT ,则 GPIO 模块在启动前必须是开启的)。

掉电模式

功率管理模块断开内部电源,因此 CPU 和 除唤醒逻辑单元以外的外设都不会产生功耗。要执行掉电模式需要有两个独立的电源,其中一个给唤醒逻辑单元供电,另一个给包括CPU在内的其他模块供电。在掉电模式下,第二个电源将被关掉。掉电模式可以由外设中断 EINT[15:0]或RTC唤醒。

时钟源选择

模式OM[3:2]MPLL状态UPLL状态主时钟源USB时钟源
00onon晶振晶振
01onon晶振外部时钟
10onon外部时钟晶振
11onon外部时钟外部时钟

FCLK、HCLK和PCLK

①FCLK信号是ARM920T内核使用的时钟信号;
②HCLK信号是AHB总线的时钟信号,在 ARM920T内核、存储控制器、中断控制器、 LCD控制器、DMA和USB主模块使用;
③PCLK信号是APB总线的时钟信号,在外部设备中使用,如WDT、IIS、I 2 C、PWM定 时器、MMC接口、ADC、UART、GPIO、RTC 和SPI。

S3C2440 在 FCLK、HCLK 和 PCLK之间可以选择划分比率。比率由 CLKDIVN 控制寄存器的 HDIVN 和 PDIVN 决定。

当 PLL 被配置为 一个新的频率值时,时钟控制逻辑在 PLL输出稳定之前禁止FCLK ,直到 PLL锁定系统时钟后 取消 禁止。时钟控制逻辑同时在 开电源重 启时 和 从掉电模式唤醒时起作用。
在设定 PMS 的值之后,需要设定 CLKDIVN 寄存器的值,其会在 PLL 锁 定的时间后有效,当然在重启和改变 电源管理模式之后也可以使用。

时钟发生器和功率模块特殊寄存器

(1)锁定计数器寄存器(LOCKTIME)
(2)PLL控制寄存器(MPLLCON/UPLLCON)
MDIV [19:12] PDIV [9:4] SDIV [1:0]
Mpll=(2 m X Fin)/(p X 2 s ),m = MDIV + 8,p = PDIV + 2,s = SDIV。
(3)时钟控制寄存器(CLKCON)
(4)低速时钟控制寄存器(CLKSLOW)
(5)时钟除数控制寄存器(CLKDIVN)

DMA

S3C2440 的 DMA 在以下四种情况可运行:
(1)源设备和目标都在系统总线AHB上;
(2)源设备和目标都在外围总线APB上;
(3)源设备在系统总线,而目标设备位于外围总线;
(4)源设备在外围总线,而目标设备位于系统总线。
DMA的主要优点是:可以不通过 CPU 的中断来实现数据的传输,DMA 的运行可以通过软件或者通过外围设备的中断和请求来初始化。

每个DMA通道都有5个DMA请求源

DMA工作流程

① 外设向 DMA 发出请求
② DMA通过 OLD向CPU发出总线请求
③ CPU响应释放三总线 , 并且发应答HLDA
④ DMA向外设发DMA应答
⑤ DMA发出地址、控制信号,为外设传送数据
传送完规定的数据后,DMA 撤销 HOLD 信号,CPU 也撤销 HLDA 信号,并 且恢复对三总线的控制。

S3C2440 的 DMA 工作工程可以分为以下三个状态:
①状态1——等待状态
②状态2——准备状态
③状态3——传输状态

DMA特殊功能寄存器

每一个 DMA 通道有 9个 控制寄存器( DMA 控制器共有 4个通道, 共计 36个 控制寄存器),其中的 6 个 控制寄存器控制 DMA 发送操作, 另外 3个管理 DMA 控制器的状态。
(1)DMA初始源寄存器
(2)DMA初始源控制寄存器
(3)DMA初始目的寄存器
(4)DMA初始目的控制寄存器
(5)DMA控制寄存器
(6)DMA状态寄存器
(7)DMA当前源寄存器
(8)当前目的寄存器
(9)DMA屏蔽触发寄存器

中断控制器

S3C2440X 中断控制器有 60个 中断源,对外提供 24个 外中断输入引脚, 内部所有设备都有中断请求信号,例如: DMA控制器、UART、IIC等。

S3C2440X 的 ARM920T 内核有两个中断:IRQ中断和快速中断FIQ。

中断仲裁:当中断控制器接收到多个中断请求时,其内的优先级仲裁器裁决后向 CPU 发出优先级最高的中断请求信号或快速中断请求信号。

S3C2440中断源

中断控制器提供 60个 中断源,所 以中断优先级非常重要。

中断系统有 6个 分仲裁器 和 1个 总仲裁器,每一个仲裁器可以处理 6路 中断

每一个仲裁器可以控制 6个 中断请求, 其基于由仲裁模式控制的 1位(ARB_MODE) 和 选择控制信号的2位(ARB_SEL)。注意:仲裁器的 REQ0 一般为最高优先 级,REQ5 一般为最低优先级;通过改变 ARB_SEL 位的值,可以设定 REQ1~REQ4 优先级。

中断控制器的特殊功能寄存器

中断控制器中包括 5个 控制寄存器: 源挂起寄存器、中断模式寄存器、屏蔽寄存器、优先级寄存器、中断挂起寄存器。
来自中断的中断请求首先寄存在源挂起寄存器。它们基于中断模式寄存器分为两组:FIQ中断请求 和 IRQ中 断请求。对多重IRQ请求的仲裁过程使用优先级寄存器。
(1)源挂起寄存器
(2)中断模式寄存器
如果 INTMOD 寄存器中某中 断模式设置为 FIQ ,那么 FIQ 中断将 不会影响 INTMOD 和 INTOFFSET 寄存器, 两者只对 IRQ 模式的中断源有效。
(3)中断屏蔽寄存器
中断屏蔽寄存器INTMSK 也包括了32 位,每一个比特位均与相应的一个中断源 相对应。如果某位被设置为1,那么CPU不 会执行相应中断源提出的中断请求(即使 源挂起寄存器的相应位被设置为1)。如果 屏蔽位为0,那么中断请求会被正常执行。
(4)优先级控制寄存器
(5)中断挂起寄存器
中断挂起寄存器 INTPND 包括 32个 比特位,其中每一个比特位均表示相应中 断请求是否拥有最高优先级,它们处于等 待中断服务状态并且没有被屏蔽。INTPND 寄存器在优先级仲裁器结束之后,仅有一 个比特位被置 1,并且被 置1 的中断请 求向 CPU 产生 IRQ。在执行 IRQ 中断服 务时,可以读取寄存器来确定 32个 中断 源中哪个中断源被执行。 同 SRCPND 一样,INTPND 也需要在 中断服务程序中加入 清0 操作。
(6)INTOFFSET寄存器
(7)辅助源挂起寄存器
(8)中断辅助屏蔽寄存器
中断辅助屏蔽寄存器 INTSUBMSK 中 的 11位 和响应的中断源有联系,如果 某一比特位设置为 1 ,那么来自相应中 断源的中断请求便不会被 CPU 执行(注 意此种情况下,SUBSRCPND 寄存器相应 位会被设置为 1)。如果屏蔽位为 0 , 那么中断请求将会被执行。

S3C2440处理器的外设

I/O端口

S3C2440 有 130个 通用可编程多功 能 输入/输出引脚,可分为以下几类:
(1)Port A(GPA):25位输出端口;
(2)Port B(GPB):11位输入/输出端口;
(3)Port C(GPC):16位输入/输出端口;
(4)Port D(GPD):16位输入/输出端口;
(5)Port E(GPE):16位输入/输出端口;
(6)Port F(GPF):8位输入/输出端口;
(7)Port G(GPG):16位输入/输出端口;
(8)Port H(GPH):9位输入/输出端口;
(9)Port J (GPJ):13位输入/输出端口。

寄存器

(1)端口配置寄存器(GPACON~GPHCON)
如果 GPF0~GPF7 和 GPG0~GPG7 在 掉电的模式下 被用作唤醒信号,则在 中断模式下,这些端口必须被配置。
端口配置寄存器一般两位配置一个I/O口,通常:00输入,01输出,10为AF,11为保留。
(2)端口数据寄存器(GPADAT~GPHDAT)
如果这些端口被配置为 输出端口, 则输出数据可以被写入 GPnDAT的相应 位 。如果被设定为 输入端口,则输 入数据可以从 GPnDAT的相应位读取。
一般1位一个I/O口,输入模式读取,输出模式写入。
(3)端口上拉寄存器(GPBUP~GPHUP)
当相应的位被 设为 0 时,引脚接上拉电阻;当相应 的位被设置为 1 时,引脚不接上拉电 阻。如果引脚接上拉电阻,那么上拉电 阻不需要引脚的功能设置就可以工作 (例如input、output、DATAn、EINTn 等)。如果引脚接上拉电阻,那么上拉电阻不需要引脚的功能设置就可以工作 (例如input、output、DATAn、EINTn 等)。
端口上拉寄存器,一般0为允许上拉,1为不允许。
(4)多样控制寄存器
这个寄存器控制 DATA端口的上拉电阻、hi-z状态、USB 和 CLKOUT 选择。
(5)外部中断控制寄存器(EXTINTN)
24个外部中断源可用各种信号来请求。外部中断寄存器为外部中断请求设置了信号触发方法 ,包括:低电平触发、高电平触发、下降沿触发、上升沿触发、上升沿触发和下降沿触发。8个 外部中断引脚有一个数字滤波器(见 EINTFLTn),16个引脚EINT[15:0]用作唤醒源。
(6)掉电模式 和 I/O口
所有的 GPIO寄存器 的值在掉电模式下被保存。EINTMSK 不能禁止从掉电模式唤醒, 但是如果 EINTMSK 屏蔽了 EINT[15:4] 中的I位,系统可以被唤醒,但是 SRCPND 中的 EINT4_7位 和 EINT8_23 位不会在唤醒后被置1。

(1)端口A寄存器(GPACON/GPADAT)
GPADAT为准备输出的数据,其值为 23位[22:0]
①当 A口引脚配置为非输出功能时, 其输出无意义; ②从引脚输入没有意义。

(2)端口B寄存器(GPBCON、GPBDAT、 GPBUP)
端口B控制寄存器包括:端口B配 置寄存器GPBCON、数据寄存器GPBDAT 和上拉寄存器GPBUP。
GPBDAT 为准备输出或输入的数据, 其值为 11位[10:0]。
GPBUP 为 端口B 上拉寄存器,位 [10:0]有意义。
注意:当端口B引脚配置为 非输入/ 输出功能时,其寄存器中的值没有意义。

(3)端口C寄存器(GPCCON、GPCDAT、 GPCUP)
端口C控制寄存器包括:端口C配置 寄存器GPCCON、数据寄存器GPCDAT 和上 拉寄存器GPCU。
GPCDAT 为准备输出或输入的数据, 其值为 16位[15:0]。

(4)端口D寄存器(GPDCON、GPDDAT、 GPDUP)
端口D控制寄存器包括:端口D配置 寄存器GPDCON、数据寄存器GPDDAT 和 上拉寄存器GPDU。
GPDDAT 为准备输出或输入的数据, 其值为 16位[15:0]。
GPDUP 为端口D上拉寄存器,位 [15:0]有意义。初始化时,[15:12]无 上拉功能,而[11:0]有上拉。
注意:当端口D引脚配置为非输入/ 输出功能时,其寄存器中的值没有意义。

(5)端口E寄存器(GPECON、GPEDAT、 GPEUP)
端口E控制寄存器包括:端口E配置 寄存器GPECON、数据寄存器GPEDAT 和 上拉寄存器GPEU。
GPEDAT 为准备输出或输入的数据, 其值为 16位[15:0]。
注意:当端口E引脚配置为非输入/ 输出功能时,其寄存器中的值没有意义。

(6)端口F寄存器(GPFCON、GPFDAT、GPFUP)
GPF0~GPF7用作POWER_OFF模式中 的唤醒信号,那么必须要将其配置为外部 中断(中断模式中设置)。
端口F控制寄存器包括:端口F配置寄 存器GPFCON、数据寄存器GPFDAT 和上拉 寄存器GPFU。
GPFDAT 为准备输出或输入的数 据,其值为 8位[7:0]。
GPEUP 为端口F上拉寄存器,位 [7:0]有意义。初始化时各个引脚都 有上拉功能。
注意:当端口F引脚配置为非输 入/输出功能时,其寄存器中的值没 有意义。

(7)端口G寄存器(GPGCON、GPGDAT、 GPGUP)
GPG0~GPG7 用作 POWER_OFF 模式中 的 唤醒信号,那么必须要将其配置为外 部中断(中断模式中设置)。
端口G 控制寄存器包括:端口G配置 寄存器GPGCON、数据寄存器GPGDAT 和 上 拉寄存器GPGU。
注:在NAND引导方式时,GPG[15: 13]必须选择输入 。
GPGDAT 为准备输出或输入的数据, 其值为 16位[15:0]。
GPEUP 为端口F上拉寄存器,位 [15:0]有意义。初始化时[15:11]引脚无 上拉功能,其它引有上拉功能。
注意:当端口G引脚配置为非输入/ 输出功能时,其寄存器中的值没有意义。

(8)端口H寄存器(GPHCON、GPHDAT、 GPHUP)
端口H控制寄存器包括:端口H配置 寄存器GPHCON、数据寄存器GPHDAT 和上 拉寄存器GPHU。
GPHDAT 为准备输出或输入的数据, 其值为 11位[10:0]。
GPHUP 为端口H上拉寄存器,位 [10:0]有意义。
注意:当端口H引脚配置为非输入/ 输出功能时,其寄存器中的值没有意义。

(9)端口J寄存器(GPJCON、GPJDAT、 GPJUP)
端口J控制寄存器包括:端口J配置 寄存器GPJCON、数据寄存器GPJDAT 和上 拉寄存器GPJUP。
GPJDAT 为准备输出或输入的数据, 其值为 13位[12:0]。
GPJUP 为端口H上拉寄存器,位 [12:0]有意义。

(10)杂项控制寄存器(MISCCR)
在休眠方式,数据总线(D[31:0] 或 D[15:0])能被设成高阻和0输出。但是, 由于I/O引脚的特点,填补的特性,数据 总线上拉电阻必须被打开或关闭减少耗电 量。D[31:0]引脚上拉电阻可通过MISCCR 寄存器控制。
主USB被这一个寄存器控制,或对于 USB装置。

(11)DCLK控制寄存器(DCLKCON)
DCLKCON定义DCLKn信号,其作为 外部源的时钟。寄存器DCLKCON仅在 CLKOUT[1:0]位设置为发送DCLKn信号 时可以自动操作。

(12)外部中断控制寄存器(EXTINTn)
24个外部中断可以有不同的信号方式请求。EXTINTn 为外部中断请求,配置信号的方式为:电平触发 或者 边沿 触发,也可以配置信号极性。 为了能检测出电平触发中断,不受噪声滤波器的影响,EXTINTn引脚的有效逻辑电平至少要维持 40ns。(消抖?)
24个中断,每4位一个中断,EXTINT0 EXTINT1 EXTINT2每个配置8个外部中断
EXTINT0,4位中前3位有效,设置信号触发方式:
000=低电平 001=高电平 01x=下降沿触发 10x=上升沿触发 11x=边沿触发
EXTINT1和EXTINT2前3位同EXTINT0,第4为作为滤波器使能位,1为使能滤波器。

(13)外部中断过滤寄存器(EINTFLTn)
要确认中断等级,在EXTINTn引脚上正确的逻辑电平必须保留40ns噪音滤波。
EXTFLT2/3是外部中断过滤寄存器2/3,EXTFLT2[30:0]和EXTFLT3[31:0]有效,每8位配置1个外部中断滤波器,前7位配置滤波宽度,第8位配置滤波时钟,0为PCLK,1位EXTCLK/OSC_CLK

(14)外部中断屏蔽寄存器(EINTMASK)
)外部中断屏蔽寄存器(EINTMASK) 针对20个外部中断(EINT[23:4] 0-3保留) 的中断屏蔽寄存器(即EINTMASK),0允许中断,1屏蔽中断。

(15)外部中断挂起寄存器(EINTPENDn)
外部中断挂起寄存器EINTPENDn 是针对20个外部中断(EINT[23:4]) 的,可以通过向此EINTPEND寄存器相应位写1来清除比特位。0:没发生中断,1:发生中断,通过写“1”清除。

(16)状态寄存器(GSTATUSn)

寄存器地址R/W描述复位值
GSTATUS00X560000ACR外部引脚状态不确定
GSTATUS10X560000B0R芯片ID0x32440001
GSTATUS20X560000B4R/W复位状态0X1
GSTATUS30X560000B8R/W通知寄存器0X0
GSTATUS40X560000BCR/W通知寄存器0X0
GSTATUS0描述
nWAIT[3]nWAIT引脚状态
NCON[2]NCON引脚状态
RnB[1]RnB引脚状态
BATT_FLT[0]BATT_FLT引脚状态
GSTATUS1描述
CHIPID[31:0]ID寄存器=0x32440001

GSTATUS2 GSTATUS3/4

(17)控制存储器I/O驱动电流(DSCn)
电流控制寄存器0/1

(18)存储器休眠控制寄存器(MSLCON)

PWM定时器

(1)5个16 位定时器;
(2)2个8位预分频器 和 2个4位分割器;
(3)输出波形的占空比可编程控制 (PWM);
(4)自动加载模式 或 单触发脉冲模式;
(5)死区产生器。

S3C2440 具有 5个16位定时器,定时 器0、1、2、和3 具有PWM功能(脉宽调 制),定时器4 是一个内部定时器,不具 有对外输出口线。定时器0 具有死区发生 器,通常用于大电流设备应用。 定时器0和1 公用 一个8位预分频器, 定时器2、3和4 公用 另一个8位预分频 器。每一个定时器都有一个时钟除法器, 除法器使用 5个不同的除数因子(1/2、 1/4、1/8、1/16和TCLK)。

每一个时钟块 从其时钟除法器 中 接收时钟信号,时钟除法器 从其 相应的 8位预分频器 中接收时钟信 号。8位预分频器 是可编程的,并根 据存储在 TCFG0 和 TCFG1 的值来对 PCLK信号 进行分频。

概念

PWM 概念(脉宽调制)就是只对 一方波序列信号的占空比 按要求 进行调制,而不是 改变方波信号的 其它参数,即不改变 幅度和周期, 因此脉宽调制信号的产生和传输,都 是数字式的。
只 要带宽足够(频率足够高或周期足够 短),任何模拟信号都可以使用 PWM 来实现。

定时器

定时器计数缓冲寄存器(TCNTBn) 的值 是当定时器使能时装载到减法计数 器的 初值,定时器比较缓冲器(TCMPBn) 的值 将被装载到比较寄存器并与减法计 数器的值进行比较。TCNTBn 和 TCMPBn 双重缓冲器的特性使 定时器频率 和 占 空比改变时,确保产生稳定的输出。
每个计数器都有自己的 16位减法 器 ,由定时器时钟驱动。当定时器计 数器值 达到0时 ,定时器发出中断请 求,通知 CPU 定时工作已经完成,相 应的 TCNTBn 将自动装入计数器,以继 续下一个操作。但是,如果定时器已经 停止,例如在定时器运行状态中清除 TCONn 中的定时使能位,则 TCNTBn 中的值将不会被装载到计数器。
TCMPBn 的值用于脉宽调节,当该 计数器值与定时器控制逻辑中的比较 寄存器值相等时,定时控制逻辑改变 输出电平。因此,比较寄存器决定 PWM 输出的高电平时间(或低电平时 间)。

(1)预定标器 和 分割器
此处的分割器应该是指分频器(对应的值应为分割值),预定标器应指预加载器(对应的值为预分频系数)。
(2)定时器基本操作
一个定时器(定时器4除外)包含: TCNTBn、TCNTn、TCMPBn和TCMPn几个寄 存器(TCNTn和TCMPn是内部寄存器的名 称,TCNTn的值可以通过读TCNTOn得到)。 当定时器达到 0时 ,TCNTBn 和 TCMPBn 的值将 自动加载 到 TCNTn 和 TCMPn 中。当 TCNTn到0且中断使能时,定时器 将 产生一个中断请求。
(3)自动加载 和 双缓冲模式
脉宽调制定时器 有一个 双缓冲 功能 ,在这种情况下,改变下次加 载值的同时 不影响 当前定时周期。 因此,尽管设置一个 新的定时器值, 当前定时器的操作将会继续完成而不 受影响。
定时器的值可以写入定时器计数值 缓冲寄存器(TCNTBn)中,而当前计数 器的值可以通过读定时器计数值观测寄 存器(TCNTOn)得到。
当 TCNTn 的值到 0时,自动加载 操作复制 TCNTBn 的值到 TCNTn 中。 但是如果 自动加载模式 没有使能, TCNTn 将不进行任何操作。
(4)用手动更新位和逆变器位对定时器进 行初始化
当递减计数器的值 到0时,自动加载 操作才能进行。所以,用户必须预先对 TCNTn 定时一个起始值。因此,起始值必 须由手动更新位载入。以下步骤描述了怎 么起始一个定时器。 ①将初始值写入到 TCNTBn 和 TCMPBn中; ②设置相应定时器的手动更新位。推荐配 置逆变器位开或关(不管逆变器用与否); ③设置相应定时器的起始位,从而启动一 个定时器(同时清除手动更新位)。
如果定时器被迫停止,TCNTn将保留 计数器的值且不重载TCNTBn。如果用户需 要设置一个新值,必须执行手动更新。 需要注意的时,无论何时 TOUT 逆 变器开关位的值改变。TOUTn 的逻辑值 将随之改变。因此,推荐逆变器开关位 的配置与手动更新位 同时进行。
(5)定时器操作步骤
①使能自动加载功能 设置 TCNTBn 为 160,TCMPBn 为 110。设置手动更新位并配置逆变器位。 手动更新位设置 TCNTn 和 TCMPn 的值 与 TCNTBn 和 TCMPBn 相同。然后设置 TCNTBn 和 TCMPBn的 值分别为 80 和 40,确定下一个周期的值;
②如果手动更新位为 0、逆变器 关 且 自动加载 开,则设置起始位,在定时器 的延迟时间后定时器开始递减计数;
③当 TCNTn 的值和 TCMPn 相等时,则 TOUTn 的逻辑电平将发生改变,由低到 高;
④当 TCNTn 的值 到0时,产生一个中 断并且将 TCNTBn 的值加载到一个临时 寄存器。在下一个时钟周期,TCNTBn 由临时寄存器加载到 TCNTn 中;
⑤在中断服务程序中,TCNTBn 和 TCMPBn 分别设置成 80 和 60;
⑥当 TCNTn 的值和 TCMPn 相等时,则 TOUTn 的逻辑电平发生改变,由低到高
⑦当 TCNTn到0时,TCNTn 自动重新加载, 并发出一个中断请求;
⑧在中断服务子程序中,自动加载和中 断请求都被禁止,从而将停止定时器;
⑨当 TCNTn的值和TCMPn相等时,则 TOUTn 的逻辑电平将发生改变,由低到 高;
⑩当 TCNTn的值为0时,TCNTn 将不再 重新加载新的值,从而定时器停止;
⑪由于中断请求被禁止,不再产生中 断请求。
(6)脉宽调制
脉宽调制功能可以通过改变 TCMPBn 的值实现。PWM 的频率由 TCNTBn 决定。
如果想得到一个 高的PWM值 ,则 要 减小TCMPBn的值。相反,如果想要 得到一个 低的PWM值 ,则要 增加 TCMPBn的值。如果逆变器使能,则情况 正好相反。
由于定时器具有双缓冲功能,则 在当前周期的任何时间都可以通过 ISR 和其它程序改变 TCMPBn 的值。
(7)输出电平控制
①关闭自动加载位。然后,TOUT 变高 且在 TCNTn 为 0 后定时器停止运行
②通过定时器开始位清零来停止定时器 运行。如果 TCNTn≤TCMPn,则输出高; 如果 TCNTn>TCMPn,输出为低;
③通过改变 TCON 中的逆变器开关位来 使 TOUTn 为高或低。
(8)死区发生器
死区是为了功率器件中的 PWM控制。 这一功能 使能 在一个关键器件关闭和另 一个开关器件开启的 间隔时间。这一时 间间隔 禁止 了两个开关器件同时处于开 启状态,即使是一段非常短的时间内。
TOUT0 是一个 PWM输出。nTOUT0 是 TOUT0 的反向。如果死区使能,则 TOUT0 和 nTOUT0 的输出波形将是 TOUT0_DZ 和 nTOUT0_DZ 。nTOUT0_DZ 由 TOUT1 脚输出
在死区间隔,TOUT0_DZ 和 nTOUT0_DZ 将不会同时开启。
(9)DMA请求模式
PWM 定时器能在任何时间产生 一个 DMA请求。定时器保持 DMA请求信号 (nDMA_REQ)为低 直到 定时器接收到 ACK信号。当定时器接收到 ACK信号时, 定时器将使请求信号无效。产生DMA请求 的 定时器由设置 DMA模式位(TCFG1) 决定。如果一个定时器配置成 DMA请求 模式,则此定时器将不能产生中断请求, 而其他定时器将正常产生中断请求。

PWM定时器的特殊功能寄存器

PWM 定时器是通过 设置其特殊功能 寄存器 来实现相应的功能。
(1)定时器配置寄存器0

TCFG0位描述初始值
Reserved[31:24]保留0X00
Dead zone length [23:16]该8位确定死区的长度,死区长度的1 个时间单位与定时器0的1个单位相等0X00
Prescaler1[15:8]该8位确定定时器2、3、4的预分频器的值0X00
Prescaler0[7:0]该8位确定定时器0、1的预分频器的值0X00

(2)定时器配置寄存器1

TCFG1描述初始值
保留[31:24]保留0000
DMA MODE[23:20]选择DMA请求通道:0000:没有选择(所有中断); 0001:定时器0;0010:定时器1;0011:定时器2; 0100:定时器3;0101:定时器4;0110:保留0000
MUX4[19:16]选择PWM定时器4的MUX输入:0000:1/2;0001:1/4; 0010:1/8;0011:1/16;01XX:外部时钟TCLK10000
MUX3[15:12]选择PWM定时器3的MUX输入:0000:1/2;0001:1/4; 0010:1/8;0011:1/16;01XX:外部时钟TCLK10000
MUX2[11:8]选择PWM定时器2的MUX输入:0000:1/2;0001:1/4; 0010:1/8;0011:1/16;01XX:外部时钟TCLK10000
MUX1[7:4]选择PWM定时器1的MUX输入:0000:1/2;0001:1/4; 0010:1/8;0011:1/16;01XX:外部时钟TCLK00000
MUX0[3:0]选择PWM定时器0的MUX输入:0000:1/2;0001:1/4; 0010:1/8;0011:1/16;01XX:外部时钟TCLK00000

(3)定时器控制寄存器
(4)定时器0计数缓冲器与比较缓冲寄存器
(5)定时器0观察寄存器

UART接口

UART(通用异步收发器)单元提供三个独立的异步串行I/O端口 ,每个都可以在中断 和 DMA 两种模式下工作。 也就是说,UART可以产生内部中断请 求 或者 DMA请求,在 CPU 和 串行I/O 之间传送数据。它们支持的波特率为 230.4Kbps,如果外部设备通过 UEXTCLK 提供 UART 单元,那么 UART 单元可以以更高的速率操作。
每个 UART 通道包含 2个16位 分 别用于 接收 和 发送 信号的 FIFO (先进先出)通道。UART 单元可以对 以下的参数进行设置:可编程的波特率, 红外收/发模式,1或2个停止位,5位、 6位、7位、8位数据宽度 和 奇偶位校 验。每个 UART 包含:一个波特率产生 器、发送器、接收器 和 控制单元。
波特率发生器以 PCLK/UEXTCLK 作 为时钟源。发送器和接收器包含 16个 字节 的 FIFOs 和 移位寄存器。发送 的数据在发送前,首先被写入 FIFO , 然后复制到发送移位寄存器,它从数据 输出端口(TxDn)依次被移位输出。同 时,被接收的数据也同样从数据接收端 口(RxDn)移位输入到移位寄存器,然 后从移位寄存器复制到 FIFO 。
UART 单元特性如下:
(1)基于DMA或中断操作的RxD0、TxD0; RxD1、TxD1;RxD2、TxD2;
(2)UART通道0、1、2符合IrDA1.0要求, 且具有16字节的FIFO;
(3)UART通道0、1具有nRTS0、nCTS0、 nRTS1和nCTS1;
(4)支持收发时握手模式。

UART 的操作

UART 主要包括:数据发送、数据接收、中断发生、波特率发生、回送模式、 红外模式以及自动流控制等操作。

数据发送

数据发送帧格式包含:1个开始位、 5~8个数据位、1个可选的奇偶位 以及 1~2 个停止位,这些都可以通过 行控制寄存器 (ULCONn) 来设置。数据发送的帧是可编程的。
发送器也能够产生 断点条件 (Break Condition),断点条件迫使串 口输出保持在 逻辑0状态,这种状态保 持 超过 一个传输帧的时间长度。断点 条件通常在一帧传输数据完整地传输完 之后,再通过这个 全0状态 将断点信号 发送给对方。断点信号发送之后,将持 续地传送数据到 Tx FIFO 中(在不使用 FIFO 模式下的 Tx 保持寄存器)。

数据接收

与数据发送一样,接收的数据帧同样是可编程的。数据接收帧格式包括了: 1个起始位、5~8个数据位、1个可选的奇 偶校验位 和 1~2个停止位,这些都可以 通过行控制寄存器(ULCONn)来设置。 接收器还可以检测到溢出错误和帧错误,每种情况下都会在寄存器中将一个错误标志置位。
①溢出错误表示 新的数据 在 旧的数据 没有及时被读取的情况下,已经覆盖了 旧的数据;
②帧错误表示 接收到的数据没有 有效 的停止位。
在 FIFO 模式下接收 FIFO 不为空, 且接收器已经在 3个字时间内 没有接 收到任何数据,则接收超时。

自动流控(AFC)

S3C2440 的 UART0 和 UART1 都可以 通过各自的 nRTS 和 nCTS 信号来实现自 动流控。在自动流控(AFC)模式下 nRTS 取决于接收端的状态,而 nCTS 控制了发 送端的操作。具体地说:只有当 nCTS 有 效时(表明接收方的 FIFO 已经准备就绪 来接收资料了),UART 才会将 FIFO 中的 资料发送出去。在 UART 接收资料之前, 只要接收 FIFO 有 至少2字节 空余的时候, nRTS 就会被置为有效。

非自动流控制

UART 通过软件控制 nRTS 和 nCTS。 接收操作: ①选择接收模式(中断 或者 DMA模式); ②检查 UFSTATn 寄存器中 Rx FIFO 计数 器的值,如果值 小于15,用户必须设置 UMCONn[0] 的值为“1”(nRTS有效),并 且如果它 等于或大于15,用户必须设置该 位值为“0”(nRTS无效); ③重复第②步。
发送操作: ①选择发送模式(中断 或者 DMA模式); ②检查 UMSTATn[0] 的值,用户就可以写 数据到 输出缓冲区 或 Tx FIFO 寄存器。 RS-232C接口:如果用户要连接到 调 制解调器接口,就需要:nRTS、nCTS、 nDSR、nDTR、DCD 和 nRI信号。在这种情 况下,用户可以利用软件通过通用 I/O口 来控制这些信号,因为 AFC 是不支持 RS-232 接口的。

中断/DMA请求的产生

每一个 UART 都有 5个状态 (Tx/Rx/Error)信号:溢出错误、帧 错误、接收FIFO/Buffer数据准备好、 发送FIFO/Buffer空 和 发送移位寄存 器空。所有这些状态都由对应的 UART 状态寄存器(UTRSTATn/UERSTATn)中 的相应位来表现。
溢出错误 和 帧错误 都被认为 是接收错误状态。如果 UCONn 中的 “接收错误状态中断使能位”被置 位,它们中的每一个都能够引发接 收错误中断请求。当“接收错误状 态中断请求”被检测到,引发请求 的信号可以通过读取 UERSTATn 来 识别。
在 FIFO 模式下,如果控制寄 存器(UCONn)中的接收模式选为 中断模式,则当接收器要将接收移 位寄存器的数据送到接收 FIFO 时, 将激活接收 FIFO 的可引起接收中 断的“端”状态信号。
在 非Non-FIFO 模式下,传送接收 移位寄存器的数据到接收保持寄存器会 引起 Rx 中断。 如果接收/发送模式被选定为 DMA模式 ,则接收 FIFO“满” 和 发送FIFO“空”的状态信号也可以被 连接,以产生 DMA 请求信号。
类型 FIFO模式Non-FIFO模式
Rx中断 如果每次接收的数据达到了接收 FIFO的触发水平,则Rx中断产生; 如果FIFO非空并且在3个字时间内 没有接收到数据,则Rx中断也将产生 (接收超时)。 如果每次接收数据 变为“满”,则接收保 持寄存器产生一个中断。
Tx中断 如果每次发送的数据达到了发送 FIFO的触发水平,则Tx中断产生。 如果每次发送数据 变为“空”,则发送保 持寄存器产生一个中断。

UART错误状态FIFO

除了 Rx FIFO 寄存器之外,UART 还具有一个错误状态 FIFO 。错误状 态 FIFO 中表示了在 FIFO 寄存器中, 哪一个数据在接收时出错。错误中断 发生在有错误的数据被读取时。为 清除错误状态 FIFO ,寄存器 URXHn 和 UERSTATn 会被读取。

波特率的发生

每个 UART 的波特率发生器为收/ 发器提供一个连续时钟。时钟源可以 选为 S3C2440 的 内部系统时钟 或者 UEXTCLK。也就是说,分频由 UCONn 中时钟选择的设置来选择。波特率产 生器的时钟通过一个 16位分频器 和 一个由 UART 波特率除数寄存器 (UBRDIVn)指定的 16位除数 决定。
UBRDIVn = (int)[PCLK/(波特率 X 16)] - 1 除数的范围为1~(2 16 -1)。例如:如 果波特率为 115200bps 且系统主频(PCLK) 为 64MHZ,则 UBRDIVn 为:
UBRDIVn = (int)[64000000/(115200 X 16)]-1=35-1=34
为了使 UART 操作准确,S3C2440 提 供了 UEXTCLK 作为被除数。
①1Frame = start bit + data bit + parity bit + stop bit;
②在特殊条件下,应该将波特率提 高到 921.6kbs。例如:当 PCLK 为 60MHZ,就可以通过使用 921.6kbs 的波特率将 UART 的错误率降到 1.69% 。
1.69% 。 共229页172

回环模式

S3C2440 UART 提供一个测试模式作 为 回环模式,以解决通讯连接中出现的 孤立错误。此模式使能 RXD 和 TXD 之 间的连接。在这种模式下,发送的数据 通过 RXD 会立即被接收。这个特点允许 处理器检验内部的传输和接收所有 SIO 通道的数据途径。这些模式可以通过 UCONn 寄存器中的回环模式位来选择。

红外通信模式

S3C2440 的 UART 模块支持红外线 (IR)发送和接收,可以通过设置 UART 控制寄存器(ULCONn)中的红外 模式位来选择这一模式。
在 IR 发送模式下,发送阶段通过 正常串行发送占空比 3/16 的脉冲波调 制(当传送的数据位为 0 );在 IR 模式下,接收必须检测 3/16 脉冲波来 识别 0。

UART特殊功能寄存器

(1)UART行控制寄存器
在UART模块包括3个行控制寄存 器,分别为ULCON0、ULCON1、ULCON2。

ULCONn位描述初始值
Reserved[7]保留0 Infra-Red Mode[6] 确定是否采用红外模式: 0:普通操作模式; 1:红外发送送/接收模式。
Parity Mode[5:3]确定奇偶产生的类型和校验,在 UART发送/接收操作过程中: 0XX:无校验; 100:奇校验; 101:偶校验; 110:强制为1; 111:强制为0。
Number of Stop Bit[2]确定每帧中停止位个数: 0:每帧1位停止位; 1:每帧2位停止位。
Word Length[1:0]确定每帧总数据位的个数: 00:5位;01:6位;10:7位;11:8位

(2)UART控制寄存器
UART控制寄存器也有3个,分别 为UCON0、UCON1 和UCON2。
注意:当 UART 没有达到 FIFO 触 发水平或在 FIFO 下 DMA 接收模式中的 3个字的时间内 没有接收到数据,Rx 中 断会发生(接收超时),并且用户应该 检测 FIFO 状态读取中断。
(3)FIFO控制寄存器
UART 模块中含有 3个UART FIFO 控 制寄存器,分别为 UFCON0、UFCON1 和 UFCON2。

UFCONn描述初始值
TxFIFO Trigger Level[7:6]确定发送FIFO的触发条件:00:空; 01:4字节;10:8字节;11:12字节。0
Reserved[3]保留0
TxFIFO Reset[2]Tx复位位,该位在FIFO复位后自动清 除:0:正常;1:TxFIFO复位。0
Rx FIFO Reset[1]Rx复位位,该位在FIFO复位后自动清 除:0:正常;1:Rx FIFO复位。0
FIFO Enble[0]0=FIFO禁止;1=FIFO模式。0

注意:在 FIFO DMA 接收模式下, 当 UART 没有达到 FIFO 触发水平或在 3个字的时间内 没有接收到数据时, Rx 中断会产生(接收超时),并且用 户应该检测 FIFO 状态读取中断。
(4)UART Modem 控制寄存器
UART 模块中有 2个UART MODEM 控 制寄存器,分别为 UMCON0 和 UMCON1。
注意:UART2不支持AFC功能,因 为S3C2440没有nRTS2和nCTS2。
(5)UART Rx/Tx状态寄存器
UART 模块有3个UART Rx/Tx状态 寄存器,分别为UTRSTAT0、UTRSTAT1、 UTRSTAT2。
(6)UART错误状态寄存器
UART模块有3个UART错误状态寄 存器,分别为UERSTAT0、UERSTAT1 和UERSTAT2。
注意:当 UART 错误状态寄存器 被读时,这些位会 自动清0 。
(7)UART的FIFO状态寄存器
UART模块有3个FIFO 状态寄存器, 分别为UFSTAT0、UFSTAT1 和UFSTAT2。
(8)UARTMODEM 状态寄存器
UART模块有2个UART MODERM 状态 寄存器,分别为UMSTAT0 和UMSTAT1:
(9)UART发送/接收保持寄存器
UART模块有3个发送/接收保持寄存 器,分别为UTXH0、UTXH1 和UTXH2, URXH0、URXH1 和URXH2。
注意:(L):小端模式;(B):大 端模式。
URXHn寄存器中各位描述如下所示:
URXHn 位 描述 初始值
RXDATAn [7:0] UARTn的接收数据 -
注意:当溢出错误发生时,URXHn必须被读,否则,即使该UERSTATn溢出错误位清0,下一个接收数据也会产生溢出错误。
(10)UART波特率分频寄存器
UART模块有3个波特率分频寄存 器,分别为UBRDIV0、UBRDIV1 和 UBRDIV2。
UBRDIVn 中的值决定串行TX/RX时波特率:
UBRDIVn = (int)[PCLK /(波特率 X 16)]-1 或 UBRDIVn = (int)[UEXTCLK /(波特率 X 16)]-1 或 除数的范围为 1~(2 16 -1),并且 UEXTCLK 应该比 PCLK 小。
UBRDIVn寄存器中各位的描述如下 所示:
UBRDIV [15:0] 波特率除数UBRDIVn>0 -

输入、输出设备

这种简单的按键有一个缺点 , 即按键被按下(或被释放),触点被接通(或断开)的一瞬间,电路有一个持续 5~30ms 的若通若断的抖动阶段,
解决抖动问题的办法有两种:
(1)一种是使用硬件消抖电路 (如RC电路、专用芯片)滤掉抖动波 形;
(2)另一种是当发现键盘输出电平 有变化时 ,通过 延时 的方法躲过按键的抖动,待电路状态稳定之后再来检测按键的输出电平,从而达到正确确定按键信息的目的。

独立按键式键盘也叫做 单线键盘, 其 特点 是每一个键都占用 一条 接口 线,所以这种键盘简单可靠,但在键 数目较多时,占用接口线也 较多。

当键盘的按键数目较大时,为 了减少键盘接口线的数目,人们常 常采用 矩阵式键盘。

时钟源选择电路

由系统复位时,在复位信号 上升沿对引脚OM3、OM2 所测的 状态来确定。
OM[3:2]值 主时钟源 USB时钟源
00 Crystal Crystal
01 Crystal EXTCLK
10 EXTCLK Crystal
11 EXTCLK EXTCLK

相关电路参考PPT第7章电路,一定要看!!!

ARM 2种工作状态
ARM 2种体系结构
ARM 2种指令集
2种中断优先级实现方法
2种措施保障快中断
ARM 3种分类方法
ARM 4种堆栈工作方式
ARM 6类指令
ARM 6/7种寻址方法
ARM 7种运行模式
ARM 7种中断
ARM 8类伪指令

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值