STM32
直播中

艾玛

12年用户 812经验值
擅长:模拟技术 EDA/IC设计 RF/无线
私信 关注
[问答]

有关嵌入式系统的基本知识都总结在这里了

什么叫嵌入式系统呢?
嵌入式系统的硬件包括哪些部分?
嵌入式系统的软件包括哪些部分?



回帖(5)

孙丽萍

2021-11-12 11:33:22
嵌入式系统基础

定义

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

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

嵌入式系统的硬件包括:核心处理器外围威廉希尔官方网站 外部设备三部分。
①核心处理器

嵌入式系统的硬件层的核心是嵌入式微处理器。
可以采用冯.诺依曼体系结构和哈佛体系结构;指令系统可以采用精简指令集系统和复杂指令集系统。
冯.诺依曼结构也称为普林斯顿结构,是一种将程序指令存储器和数据存储器合并在一起的存储器结构。 指令和数据的宽度相同。
哈佛结构:是一种将程序指令存储和数据存储分开的存储器结构。 程序指令存储和数据存储分开,可以使指令和数据有不同的数据宽度。
RISC和CISC之间主要的差别
[tr]指标RISCCISC[/tr]
指令集一个周期执行一条指令,通过简单指令的组合实现复杂操作,指令长度固定。指令长度不固 定,执行需要多个周期。
流水线流水线每周期前进一步指令的执行需要调用一段微程序
寄存器更多通用寄存器用于特定目的的专用寄存器
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]** [tr][4:0]处理器模式可以访问的寄存器[/tr]
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 种。 [tr]I位值F位值禁止的异常/中断中断优先级[/tr]
11复位(RESET)中断1
1-未定义指令(UNDEF)异常6
1-软中断(SWI)6
1-预取指令中止(PABT)异常5
1-数据中止(DABT)异常2
1-中断(IRQ)4
11快中断(FIQ)3
中断(异常)向量表的保留项 在实际应用系统中,常常会需要 多个中断(异常)向量表,这时就需 要利用这个 保留项 中数据来对这多个向量表进行 区别。 处理器响应中断(异常)后所进入的模式如下表所示: [tr]中断(异常)进入的模式[/tr]
复位(RESET)管理模式(SVC)
未定义指令(UNDEF)未定义指令中止模式(UND)
软中断(SWI)管理模式(SVC)
预取指令中止(PABT)中止模式(ABT)
中断优先级

处理器通常只有一个可屏蔽中断请求输入端。对于具有多个中断源的系统来说, 当有两个或两个以上中断源同时发生中断 请求时就会出现所谓的竞争。 具体实现方法有两种:硬件实现方法 和 软件实现方法。 (1)硬件实现方法

就是为计算机系统配备一套能按 优先等级对中断源进行**排队的硬件威廉希尔官方网站 ** ,以保证级别高的中断能先于级别低的中断被处理器响应。 一般情况下,这个优先排队机构可能在处理器中有一套,在中断控制器中也有一套,甚至在接口威廉希尔官方网站 中也会有一套。 (2)软件实现方法

就是把所有中断源的中断请求信号分成两路,其中一路经 “或” 逻 辑送到处理器的中断请求输入端,而另一路则送入中断接口威廉希尔官方网站 经数据总线送入处理器。 中断服务程序

中断服务程序与普通子程序的重要差别在于: **中断服务程序要对中断嵌套进行必要的管理**。即中断服务程序要根据需要,对程序状态寄存器中的中断允许标志进行相应的设置。 为了与普通子程序的首地址进行区分,中断服务程序的首地址通常被叫做 中断向量,或 中断矢量。 以后还会看到,凡是能直接或间接指向中断服务程序的都叫中断向量。 各种处理器如何来调用中断服务子程序的方法不尽相同,通常有两种方法: **调用方法** 和 **转移方法**。 调用方法

是在处理器收到中断请求之后, 由 中断系统硬件执行一条**子程序调用指令**来调用中断服务程序。 转移方法

是由中断系统硬件执行 一条**转移指令**来转向中断服务程序。 所有的中断向量都必须存放在一个固定的存储区域,这个集中存放了 中断向量或与中断向量相关信息的存储区域就叫做 中断向量表。
举报

王艳

2021-11-12 11:33:29
中断的处理过程

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

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

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

[tr]异常/中断地址说明[/tr]
复位(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], #4R0=[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{}   BL{}      //PC->LRBX{}  Rm          //0->Rm[0]BLX             //PC->LR        ARM->ThumbBLX{} Rm          //PC->LR        Rm[0]->T        0->Rm[0] B 指令和 BL 指令都是以一个 24 位有符号数 signed_immed_24 间接提供目标地址,真正的目标地址是由处理器根据这个有符号数和当前的PC 值计算出来的。
数据处理指令

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

ADD{}{S}  , ,   //加SUB{}{S}  , ,   //减ADC{}{S}  , ,   //带进位加SBC{}{S}  , ,   //带借位减RSB{}{S}  , ,   //逆向减RSC{}{S}  , ,   //带借位逆向减 加法进位C置为1,否则置为0,减法借位C置为0,否则置为1
按位逻辑操作指令

AND{}{S}  , ,   //会将C置为0ORR{}{S}  , , EOR{}{S}  , , BIC{}{S}  , , 寄存器移位操作指令

MOV{}{S}  , MVN{}{S}  ,     //operand按位取反 两条指令均会影响C标志位,MOV会将C置为0
是立即数时,限制较大,如果要往寄存器中写入一个较大的数字,如0x12345678这种,可以用伪指令的LDR,LDR , =0x12345678
比较操作指令

CMP{} ,     //减CMN{} ,     //operand2取反,不存储结果TST{} ,     //与TEQ{} ,     //异或 乘法指令与乘加指令

MUL{}{S}  , , MLA{}{S}  , , ,   //Rm*Rs+Rn->Rd SMULL{}{S}, , , //Rm*Rs,[0-31]->RdLo [32-63]->RdHiSMLAL{}{S}, , , //Rm*Rs,[0-31]+RdLo->RdLo [32-63]+RdHi->RdHiUMULL{}{S}, , , //无符号数UMLAL{}{S}, , , //无符号数 标志位修改N、Z
程序状态寄存器访问指令

MRS {}    , CPSR  //CPSR -> RdMRS {}    , SPSRMSR{}  CPSR_,   //fields:f s x c,operand2->fieldsMSR{}  SPSR_, [tr]fieldbitsname[/tr]
f[31:24]条件标志域
s[23:16]状态位域
x[15:8]扩展位域
c[7:0]控制位域
加载/存储指令

LDR{} , LDR{cond}H  ,     //半字,高16位清零LDR{cond}B  ,     //字节,高24位清零STR{cond}   , STR{cond}H  , STR{cond}B  , 可为label,,label必须是当前指令-4~4KB范围内
批量数据加载/存储指令

LDM{} {mode} {!},{^}STM{} {mode} {!},{^} [tr]mode作用RD[/tr]
IA先传送数据,后基地址加4(Rd)
IB先基地址加4,后传送数据(Rd)+4
DA先传送数据,后基地址减4(Rd)
DB先基地址减4,后传送数据(Rd)-4
LDMIA R0,{R2、R3、R4、R5}  //[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 EALDMXX 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{}     , , {}  //[Rn]->Rd, Rm->[Rn] SWPB{}    , , {}  //字节
特殊情况的总结

除专用指令外会修改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}   ,    //近地址读取宏指令 expr通常是地址标号。ADRL{cond}  ,    //远地址读取宏指令 Expr 为表达式,必须是 64KB 以内非字对齐地址,256KB 以内的字对齐地址。LDR{cond}   , ={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 可对一个列表定义一个统一的名称。
  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 {,}
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。

{

{




控制程序流向伪指令

IF、ELSE 和 ENDIF伪指令能根据条件的成立与否决定是否执行某个程序段。
IF 逻辑表达式  程序段1ELSE  程序段2ENDIF WHILE 和 WEND 伪指令根据条件的成立与否决定是否重复汇编一个程序段。
WHILE  逻辑表达式   程序段WEND
其他伪指令

定义对齐方式伪指令 ALIGN
ALIGN=表达式 //对齐方式为2表达式的值。 使用 ALIGN 伪指令可用添加填充字节的方式,使当前位置实现某种对齐方式。在开发环境中看不到。
AREA Init, CODE, READONLY, ALIGN=3  代码段END 段定义伪指令
AREA ,{}{,}…   //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 之间。
举报

王玉华

2021-11-12 11:34:09
ARM编程:

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

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

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

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

  AREA globals, CODE, READONLY EXPORT asmsubrouttine IMPORT globvarasmsubrouttine 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为外部引用符号  ENTRYf 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(),返回值在寄存器R0中  ADD 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、可通过编译程序来内联汇编代码, 但无论是显示还是隐式,都无法内联嵌入式汇编代码。
[tr]项目内联汇编嵌入式汇编[/tr]
指令集仅限于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 *)访问。
[tr]寄存器名地址(大端)功能[/tr]
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 区存储器的总线宽度。
[tr]OM1(操作模式1)OM0(操作模式0)导入ROM数据宽度[/tr]
00Nand Flash Mode
0116位
1032位
11测试模式
[tr]存储器地址引脚S3C2440地址/8位数据总线S3C2440地址/16位数据总线S3C2440地址/32位数据总线[/tr]
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唤醒。
时钟源选择

[tr]模式OM[3:2]MPLL状态UPLL状态主时钟源USB时钟源[/tr]
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)
举报

李兆水

2021-11-12 11:34:50
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)
[tr]寄存器地址R/W描述复位值[/tr]
GSTATUS00X560000ACR外部引脚状态不确定
GSTATUS10X560000B0R芯片ID0x32440001
GSTATUS20X560000B4R/W复位状态0X1
GSTATUS30X560000B8R/W通知寄存器0X0
GSTATUS40X560000BCR/W通知寄存器0X0
[tr]GSTATUS0位描述[/tr]
nWAIT[3]nWAIT引脚状态
NCON[2]NCON引脚状态
RnB[1]RnB引脚状态
BATT_FLT[0]BATT_FLT引脚状态
[tr]GSTATUS1位描述[/tr]
CHIPID[31:0]ID寄存器=0x32440001
GSTATUS2 GSTATUS3/4
(17)控制存储器I/O驱动电流(DSCn)
电流控制寄存器0/1
(18)存储器休眠控制寄存器(MSLCON)
举报

更多回帖

发帖
×
20
完善资料,
赚取积分