极简嵌入式ARM知识点
——基于NXP公司i.MX6ULL处理器
1、前言
-
标题已说明一切。
-
建议先看文末的温馨提示。
2、ARM
版本的特点
-
具体处理器
和基础架构
分别有各自的版本号: 例如ARM7-TDMI
和ARM920T
的架构版本分别为v4
和v4T
,ARM946E-S
为v5
,ARM1136J-S
为v6
,等等。 -
从
v7
架构开始,处理器版本不再使用单一数字递增的命名方式, 而开始发布Cortex-A
、Cortex-R
、Cortex-M
等系列,其中A
表示Application
、R
表示Real-time
、M
表示Microcontroller
,应对不同场景。 -
上述每一系列再加上数字形成一个具体型号的处理器, 并且数字的大小不一定反映先后顺序和工艺性能,例如
A8
的数字比A7
要大, 但A7
在A8
之后发布,且性能更强。 -
所以,要对比不同系列、不同型号处理器之间的性能特点, 只能从官方资料查证,不能简单以名称和数字进行推断。
-
可以从下表(源于网上)稍微感受一下命名的混乱(截至
v7
):
架构版本号 | 处理器家族(不完全列举) |
---|---|
ARMv1 |
ARM1 |
ARMv2 |
ARM2 、ARM3 |
ARMv3 |
ARM6 、ARM7 |
ARMv4 |
StrongARM 、ARM8 、ARM7-TDMI 、ARM9-TDMI |
ARMv5 |
ARM7EJ 、ARM9E 、ARM10E 、XScale |
ARMv6 |
ARM11 |
ARMv7 |
ARM Cortex-A 、ARM Cortex-M 、ARM Cortex-R |
3、处理器模式
- 最初只有
7
种模式、归属于2
类:- 非特权模式:
USR
:User,用户模式,绝大部分程序,尤其是应用程序,均处于此模式。
- 特权模式(两中断、两异常、一管理、一系统):
FIQ
:Fast Interrupt Request,快速中断模式。IRQ
:Interrupt Request,中断模式。SVC
:Supervisor,管理员模式,在使用特权指令访问受限资源时,进入此模式。ABT
:Abort,中止模式,当发生内存访问异常时,进入此模式。UND
:Undefined,未定义模式,当执行未定义指令时,进入此模式。SYS
:System,系统模式,操作系统就运行于此模式。
- 非特权模式:
- 引入
信任区
(TrustZone
)安全扩展机制后,新增以下1
种模式:MON
:Monitor,监护模式,为处理器营造安全
(Secure
)和非安全
(Non-secure
) 两种状态(State),其中前者通常运行通用型操作系统及应用程序, 后者则运行各厂商私有固件以及安全相关的软件。每种状态下均能使用前述7
种模式, 而监控模式作为这两种状态的监护者和转换途径(Gateway)。
- 若再加入
虚拟化
(Virtualization
)机制,则又增加1
种模式:HYP
:Hypervisor,超级管理员模式,此模式介于操作系统与硬件之间, 并将最初的7
种模式划分成2
种(在安全状态下)或3
种(在非安全状态下)权限级别
(Privilege Level),分别为:PL0
:应用于USR
模式。PL1
:应用于USR
和HYP
以外的模式。PL2
:应用于HYP
模式。
- 总结得出以下关系(整理自参考材料2的“Chapter 3 ARM Processor Modes and Registers”):
权限级别 状态寄存器模式位 非安全状态 安全状态 PL0 10000 USR USR PL1 10001
10010
10011
10111
11011
11111FIQ
IRQ
SVC
ABT
UND
SYSFIQ
IRQ
SVC
ABT
UND
SYSPL2 11010 HYP PL1 10110 MON
4、寄存器简介
4.1 按功能划分
-
通用寄存器:
R0
~R15
。 -
帧指针:
FP
(Frame Pointer
,由R11
兼任)。 -
栈指针:
SP
(Stack Pointer
,由R13
兼任)。 -
链接寄存器:
LR
(Link Register
,由R14
兼任);存放函数返回地址。 -
程序计数器:
PC
(Program Counter
,由R15
兼任); 由于3
级流水线
(取指
->译码
->执行
)的设计, 实际上存放的是当前正在执行的指令之后第2
条指令。 - 程序状态寄存器:
xPSR
(Program Status Register
),其中x
有:C
:Current,当前。A
:Application,应用,是CPSR的替身,供用户模式下的程序使用, 且仅限访问以下二进制位:N
、Z
、C
、V
、Q
、GE[3:0]
。S
:Saved,备份,也是CPSR的替身,当异常发生时,自动将之前的状态保存, 但此寄存器在用户模式下不可访问。二进制位定义如下:
序号 代号 作用 31 N Negative;运算结果为负时,置1 30 Z Zero;运算结果为0时,置1 29 C Carry-out;对于加法指令,发生进位则置1,否则清0;对于减法指令,发生借位则清0,否则置1。 28 V oVerflowed;运算结果溢出时,置1。 27 Q cumulative saturation;处于累积饱和状态时,置1。此位又称作粘滞位(sticky)。 26:25 IT[1:0] If-Then;与后面的5位一起,反映条件指令的执行状态。 24 J Jazelle;为1则表示处于Jazelle状态。 23:20 Reserved 预留。 19:16 GE[3:0] Greater Equal;大于等于,用于某些SIMD指令中。 15:10 IT[7:2] 见前面 IT[1:0]
的说明。9 E Endianness;大端模式则置1,小端则清0。 8 A asynchronous Abort;若要禁止异步中断,则置1。 7 I Interrupt;禁止中断(IRQ)则置1,激活则清0。 6 F Fast interrupt;禁止快速中断(FIQ)则置1,激活则清0。 5 T Thumb;使用Thumb指令则置1,使用ARM指令则清0。 4:0 M[4:0] processor Mode;处理器模式,详见处理器模式关系表。 -
协处理器(Coprocessor)寄存器:
c0
~c15
,应用编程通常用不上,暂时忽略。 - 系统控制寄存器:
SCTRLR
(System Control
),暂时忽略,理由同上。
4.2 按处理器模式进行分组与共享
USR | SYS | FIQ | IRQ | ABT | SVC | UND | MON | HYP |
---|---|---|---|---|---|---|---|---|
SP_fiq | SP_irq | SP_abt | SP_svc | SP_und | SP_mon | SP_hyp | ||
LR_fiq | LR_irq | LR_abt | LR_svc | LR_und | LR_mon | R14(LR) | ||
APSR | ||||||||
/ | / | SPSR_fiq | SPSR_irq | SPSR_abt | SPSR_svc | SPSR_und | SPSR_mon | SPSR_hyp |
ELR_hyp |
5、为何需要汇编语言?
-
芯片上电后,C语言环境还未准备好;
-
C语言环境主要单元为各个大大小小的函数;
-
C函数调用涉及栈操作;
-
栈要由
SP指针
访问,而SP指针需要在上电后手动初始化, 只能通过汇编指令来实现(汇编与机器码有简单的对应关系, 只需经过简单的翻译,与直接使用机器码无异)。 -
其他初始化工作,例如DDR初始化等,同理。
6、CISC
架构与RISC
架构
-
全称见后面的缩略词表格。
X86
基于CISC
,可以用一条指令实现复杂的操作(一条指令实际上可能分解为若干微操作码), 处理某些特殊任务效率较高,但逻辑复杂,主要特点如下:- 使用(可)变长(度)指令(格式不一难于优化),每条指令可身兼多职;
- 指令基本都能直接访问储存器(包括内存),寻址方式也多;
- 由于以上特点,有时编程书写较为方便;
- 各指令执行时间相差很大,多数需要多个时钟周期;
- 底层复杂度较高、粒度较粗,难以进行编译优化。
-
实践中发现了
二八定律
,于是提取出少量简单而又频繁使用的指令,便形成了RISC
, 且原先复杂的指令也能由这些简单指令组合得到。 ARM
基于RISC
,由少量的通用指令集构成,硬件实现简单,且低功耗,主要特点如下:- 使用(固)定长(度)指令(格式统一便于优化),每条指令职责单一;
- 不可直接访问储存器(包括内存),
加载
和储存
指令除外,寻址方式也少; - 由于上一点,几乎所有操作均需借助寄存器(但也减少对内存的操作,速度得以提升, 详见下一点),故通用寄存器很多;
- 由于以上特点,有时编程书写较为麻烦;
- 必备的流水线技术,使得大部分指令可在一个时钟周期左右完成, 再配合超标量流水线技术,平均指令时间可降至一个时钟周期以下;
- 底层复杂度较低、粒度较细,容易进行编译优化。
- CISC与RISC的区别并不在于晶体管的多少(因为硬件集成度逐年提高),
或指令集的大小(因为新应用需求不断出现),而在于设计理念:
- 内核是否足够简单,各项功能是否具有正交性,以便仅通过组合来实现更多特性;
- 状态是否足够少,甚至无状态,以便并发、乱序执行;
CISC
内部逻辑也有将复杂指令分解成多个微操作的做法,RISC
设计也可以在综合考量成本和预算之后选择添加少量复杂指令, 两者可以互相借鉴。
7、ARM
指令集与Thumb
指令集
-
i.MX6ULL
基于Cortex-A7
,Cortex-A7
属于ARMv7
,ARMv7
属于32位架构; -
ARM
又是加载/储存
(Load/Store
)架构,即数据处理全在通用寄存器
进行, 只有加载
和储存
指令会访问内存,而寄存器也是32位; -
所以,
ARM
指令集是32位指令集,是最初、最基本的指令集。 -
Thumb
指令集则是16位指令集,首次出现在ARM7TDMI
处理器,程序体积更小, 适用于资源不够丰富的嵌入式系统,但以牺牲部分性能为代价(类似CISC
与RISC
)。 -
因此,
ARM
指令集用于性能至上的场合(包括异常处理), 而Thumb
则用于储存不足的场合,以及与16位内存、外设直连的场合。 -
在
ARMv6T2
架构引入Thumb-2
技术(不是指令集!!),对Thumb
指令集进行了扩展, 加入部分32位指令,使之既有与ARM
相近的性能,又有与Thumb
相近的小体积。 在Cortex-A
系列处理器中,这项技术已是标配。 -
旧式语法会区分
ARM
指令与Thumb
指令,新式语法已将两者统一, 该语法被称作统一汇编语言
(Unified Assembly Language,UAL
)。 -
实际开发中,既可使用
ARM
专有的编译工具,也可使用GNU
编译工具, 而后者又比较通用,不限于编译ARM
。在下文的介绍中,语句格式使用GNU
格式, 具体指令则使用ARM
指令。
8、GNU
汇编语言通用格式
-
由一系列语句组成;
-
每行一条语句;
-
每条语句(Statement)的格式(方括号部分表示非必需):
[<LABEL>:] [<INSTRUCTION>] [@ <COMMENT>]
-
指令(Instruction)格式:
<NAME> <DESTINATION OPERAND> <SOURCE OPERAND>
-
除注释(Comment)和寄存器名称外,各部分的书写可以全大写,也可以全小写,但不能大小写混用;
- 访问修饰符(Access Modifier):
- 立即数以
#
开头(对于ARM
可选),但ARM
的LDR
指令的立即数要以=
开头; - 其余待补充。
- 立即数以
- 伪操作:汇编程序(Assembler)自己的指令,每条指令均以
句点
(.
)开头,常见伪操作如下:.align
n:对数据段的数据,或代码段的NOP
指令,执行2^n
字节对齐。.ascii
“string”:定义ASCII
字符串常量,没有\0
结尾。.asciiz
“string”:同上,但有\0
结尾。.{byte, hword, word}
expression:定义一个字节/半字/字的数据,多个数据则用逗号隔开。.data
:指示其后是数据段
区域。详见程序布局。.end
:表示源文件结束。.equ
symbol, expression:将后面表达式的结果赋给前面的标签。.extern
synbol:声明一个外部符号(定义在别的源文件)。.global
symbol:定义一个全局符号,对其他源文件和链接程序均可见。.include
“filename”:包含一个文件进来,通常是头文件。.section
:自定义一个段。.text
:指示其后是正文段
区域。详见程序布局。- 其余伪操作见官网:https://sourceware.org/binutils/docs/as/Pseudo-Ops.html
- 其余特性见官网:https://sourceware.org/binutils/docs/as/index.html
9、ARM
汇编指令解析
-
参数(Parameter)顺序:多数情况下与赋值顺序一样(内存操作指令除外), 即目标操作数在前、源操作数在后,并且第一个操作数必须是寄存器, 第二个操作数既可以是立即数,也可以是寄存器,还可以是经过移位操作的寄存器, 详见参考材料2的“5.2.1 Operand 2 and the barrel shifter”小节。
-
几乎所有指令都可以配合
条件后缀
使用(其他架构大多只有分支跳转指令有条件判断), 这样就不必使用条件性分支跳转语句来实现条件判断逻辑,书写更简洁,但值得注意的是, 执行速度在某些处理器(例如Cortex-A9
)却可能不如分支跳转,尤其是分支预测准确的情形下。 详见参考材料2的“5.1.2 Conditional execution”小节。条件后缀有:后缀 含义 受影响的CPSR标志位 EQ Equal,等于 Z = 1 NE Not Equal,不等 Z = 0 CS Carry Set,进位置位,与 HS
效果一样C = 1 HS Unsigned Higher or Same,无符号型的大于或等于 C = 1 CC Carry Clear,进位清零,与 LO
效果一样C = 0 LO Unsigned Lower,无符号型的小于 C = 0 MI Minus,相减,或结果为负 N = 1 PL Plus,相加,或结果非负 N = 0 VS oVerflow Set,溢出标志置位 V = 1 VC oVerflow Clear,溢出标志清零 V = 0 HI Unsigned Higher,无符号型的大于 C = 1 且 Z = 0 LS Unsigned Lower or Same,无符号型的小于或等于 C = 0 或 Z = 1 GE Signed Greater than or Equal,有符号型的大于或等于 N = V LT Signed Less Than,有符号型的小于 N != V GT Signed Greater Than,有符号型的大于 Z = 0 且 N = V LE Signed Less than or Equal,有符号型的小于或等于 Z = 1 或 N != V AL Always,总是,默认值 -
多数指令还可以带
S
后缀(Set flags,设置标志),若有,则紧跟指令、写在条件后缀
之前; 若无,则不会影响CPSR
的相关标志位。 - 内存寻址(使用方括号):
寄存器寻址
:使用寄存器里的值作为内存地址进行访问。 例如:LDR R0, [R1] /* 读取R1的值指向的内存并加载到R0 */
前索引寻址
:对寄存器里的值加上一个偏移量,再作为内存地址进行访问, 该偏移量可正可负、可以是立即数也可以是寄存器(可附带移位操作)。 例如:LDR R0, [R1, R2]
。前索引寻址且回写
:末尾多写一个感叹号,表示在访问完内存之后,更新参与寻址的寄存器。 例如:LDR R0, [R1, #32]! /* R1里的值递增32 */
后索引寻址且回写
:偏移量写在方括号之外,比第一种情形多了更新寻址寄存器的步骤。 例如:LAR R0, [R1], #32
- 具体的指令可查阅:
10、程序布局(Layout)
10.1 保存在储存器的文件所呈现的布局
-
这里的储存器通常指磁盘(Disk)、闪存(Flash)等;
-
一个可执行文件由多个段组成,如下:
代号 含义 作用 .bss 以符号作为开头的块区域 存放未初始化或初始化为0的全局变量和静态变量,在程序执行前自动清零,故此段不占储存器空间,仅标记所含全部变量占用的空间大小。 .data 数据段 存放已初始化的非0全局变量和静态变量。 .rodata 只读数据段 存放只读数据。是否一定存在,以及存在的位置,均有待确认。 .text 正文段 存放程序代码,以及常量,故该区域通常设置为只读,但某些架构也允许写,即在运行期修改代码。
10.2 运行期加载到内存时所呈现的布局
-
除了前述的文件布局内容,还增加了以下内容:
代号 含义 作用 heap 堆 运行期动态分配的内存段,从低地址向高地址扩张。 stack 栈 存放非静态局部变量,从高地址向低地址扩张。 mmap 内存映射 处于堆栈之间,扩张方向与栈相同。 -
总的(虚拟)内存布局(以32位系统为例)如下:
起始地址 分段 0xFFFFFFFF / 0xC0000000 kernel space (1GB) uncertain stack uncertain mmap uncertain heap uncertain .bss uncertain .data uncertain .text 0x0 / 值得注意的是,部分段的起始地址不确定,是特意随机化以对抗破解攻击, 不过32位地址空间有限,削弱了效果。
11、应用程序二进制接口(ABI)
待补充。
12、浮点数、SIMD、NEON
待补充。
13、缓存与缓冲
待补充。
14、内存管理单元(MMU)
待补充。
15、内存重排序、乱序执行
待补充。
16、异常处理
待补充。
17、中断机制
-
中断机制
为突发事件
提供了一个快速甚至是实时
的处理手段
, 弥补了忙等待
和轮询
方式的不足。 -
中断机制
的核心是中断服务
,其以函数
的形式呈现,在中断信号
产生之后被调用, 包含了该如何处理该信号的操作逻辑。 -
所有中断服务
函数的入口地址
组成一个表,叫中断向量表
。 每个表项都是由体厂商预先定好的。当某个中断信号发生时,会自动跳转到对应的表项, 然后执行相应的中断服务函数。 -
中断向量表
放在整个程序的最前面。ARM
处理器是从0x0
地址开始执行, 但代码却是下载到0x08000000,中断向量表亦是,所以要借助中断向量表偏移量
(对应SCB_VTOR
寄存器和VECT_TAB_OFFSET
宏定义)进行校正。 -
Cortex-M
系列会将所支持的中断平铺直叙
地列举到向量表(以确保简单性和实时性??), 但A
系列只有7
个中断,并将所有外设中断都归入IRQ
中断, 具体是什么中断可通过读取指定的寄存器来判断。i.MX6ULL
的中断向量表如下:向量地址 中断类型 处理器模式 0x00
复位(Reset) 特权模式(SVC) 0x04 未定义指令(Undefined Instruction) 未定义模式(UND) 0x08 软中断(Software Interrupt,SWI) 特权模式(SVC) 0x0C 预取指中止(Prefetch Abort) 中止模式(ABT) 0x10 数据访问中止(Data Abort) 中止模式(ABT) 0x14 预留未使用(Not Used) / 0x18
IRQ中断 外部中断模式(IRQ) 0x1C FIQ中断 快速中断模式(FIQ) -
Cortex-A
系列管理中断的模块叫通用中断控制器
(Generic Interrupt Controller
), 简称GIC
。GIC
从外部接收中断信号并经过处理之后,再报告给ARM内核
。 GIC
接收的中断源可分为3
类:共享中断
:Shared Peripheral Interrupt,SPI
,最常见最多,例如按键中断、串口中断, 处理器的任一个核都可以对其进行处理。中断标识号范围是32
~1019
(为何不是1023??), 但实际只用到127
,完整的列表详见参考资料3“3.2 Cortex A7 interrupts”小节。私有中断
:Private Peripheral Interrupt,PPI
,每个核独有的中断,不能跨核处理。 中断标识号范围是16
~31
。软件中断
:Software-Generated Interrupt,SGI
,由软件触发(写GICD_SGIR
寄存器), 可用于多核之间的通信。中断标识号范围是0
~15
。
GIC
报告给ARM内核
的有4
个信号(后两个是针对虚拟化的,没用到的话一般不用管):IRQ
:外部中断。FIQ
:快速中断。VIRQ
:虚拟外部中断。VFIQ
:虚拟快速中断。
- 从
逻辑架构
划分,则GIC
可分为两块:分发器
:Distributor
,决定中断事件应分发给哪个处理器接口
,职责如下:- 所有中断的全局开关;
- 每个中断的单独开关;
- 每个中断的优先级;
- 每个中断的目标处理器列表;
- 每个中断的触发模式:
电平
触发还是边缘
触发; - 每个中断属于组
0
还是组1
(??)。
处理器接口
:CPU Interface
,决定中断事件应发送到哪个核
,职责如下:- 激活或禁止发送给
处理器核心
的中断请求; - 应答中断;
- 通知中断处理完成;
- 设置
优先级掩码
,该掩码可决定中断请求是否需要上报给处理器核心; - 定义抢占策略;
- 多个中断同时到来时,只(??)选择优先级最高的中断上报给处理器核心。
- 激活或禁止发送给
CP15
协议处理器:- 一般用于管理储存系统,但也会在部分中断场景用到。
MRC
、MCR
指令:待补充。CP15
寄存器:c0
:获取处理器内核信息。c1
:用于开关内存管理单元
(MMU)、指令缓存
(I Cache)、数据缓存
(D Cache)等。c12
:设备中断向量表偏移量
。c15
:获取GIC
基地址。- 其余寄存器详见参考资料1的“B3.17 Organization of the CP15 registers in a VMSA implementation”小节。
中断开关
:全局开关
:除了可以使用CPSR
的I
标志位,还可以使用以下方式:CPSID i
:关闭IRQ
中断,ID
即Interrupt Disabled
。CPSIE i
:打开IRQ
中断,ID
即Interrupt Enabled
。CPSID f
:关闭FIQ
中断。CPSIE f
:打开FIQ
中断。CPS
指令详见参考资料1的“B9.3.2 CPS (ARM)”小节。
独立开关
:GICD_ISENABLER0[0:15]
:负责软件中断
(SGI
)。GICD_ISENABLER0[16:31]
:负责私有中断
(PPI
)。GICD_ISENABLER1
~GICD_ISENABLER15
:负责共享(外设)中断
(SPI
)。
中断优先级
:- 设置
优先级个数
:利用GICC_PMR
寄存器的低8位
(高24位未使用),设置如下:bit[7:0] 优先级个数 11111111 256个优先级 11111110 128个优先级 11111100 64个优先级 11111000 32个优先级(Cortex-A7内核使用,包括i.MX6ULL) 11110000 16个优先级 - 设置
抢占优先级级数
和子优先级级数
:利用GICC_BPR
寄存器的低3位
(高29位未使用), 设置如下(XX优先级域是指某个寄存器的某些位??N级XX优先级表示有2^N
个XX优先级):寄存器值 抢占优先级域 子优先级域 说明 0 [7:1] [0] 7级抢占优先级,1级子优先级 1 [7:2] [1:0] 6级抢占优先级,2级子优先级 2 [7:3] [2:0] 5级抢占优先级,3级子优先级 3 [7:4] [3:0] 4级抢占优先级,4级子优先级 4 [7:5] [4:0] 3级抢占优先级,5级子优先级 5 [7:6] [5:0] 2级抢占优先级,6级子优先级 6 [7:7] [6:0] 1级抢占优先级,7级子优先级 7 无 [7:0] 0级抢占优先级,8级子优先级 - 设置
优先级值
:值范围为0
~31
,且值越小,优先级越高, 可通过GICD_IPRIORITYR[N]
寄存器进行设置,这是一系列寄存器,共有512
个, 可使用中断标识号(ID)作为索引号(即N
),并且值要进行相应的左移
, 例如在i.MX6ULL
将40号
中断的优先级设为5
,则应写成:GICD_IPRIORITYR[40] = 5 << 3;
- 设置
18、电源管理
待补充。
19、倍频、分频、时钟、定时器
-
时钟信号
是一切操作的动力源和速率度量。 -
倍频
技术可简化时钟源
,例如仅使用一个24MHz
的晶振
并配合倍频
电路, 便可输出多路不同频率的时钟信号。倍频
逻辑可使用PLL
(锁相环
)来实现, 属于提频
。 -
分频
技术则用于产生各种外设所需的频率,属于降频
,可通过写寄存器
来细化配置。 -
时钟层级递进逻辑为:
24MHz
晶振 ->PLL
倍频 ->1
至2
级分频 -> 最终的外设频率。 - 时钟树:
Clock Switcher
:对应上一点的倍频
逻辑。Clock Root Generator
:对应上一点的分频
逻辑。System Clocks
:对应上一点的外设频率
。
-
时钟相关寄存器:待补充。
EPIT
(共2
路):Enhanced Periodic Interrupt Timer
,增强型周期性中断定时器, 可提供精准的、重复性(不支持仅触发一次)的定时中断。组成
:- 时钟源输入(
3
个):ipg_clk
、ipg_clk_32k
、ipg_clk_highfreq
。 - 分频电路:
4096
种分频,分别对应0
~4095
。 - 计数器:即
EPIT_CNR
寄存器,向下计数,其初始值源于EPIT_LR
加载寄存器, 或从0xFFFFFFFF
重新开始,视不同模式而定,而模式可由EPITx_CR
(x = 1, 2)指定。 - 比较器:即
EPIT_CMPR
寄存器,值相等时会产生一个引脚输出
信号和一个中断
信号。
- 时钟源输入(
- 使用
步骤
:- 选择
时钟源
:设置EPITx_CR
的CLKSRC
位; - 设置
分频值
:设置EPITx_CR
的PRESCALAR
位; - 设置
工作模式
:设置EPITx_CR
的RLD
位; - 设置
计数初值来源
:设置EPITx_CR
的ENMOD
位; - 打开
比较中断
:设置EPITx_CR
的OCIEN
位; - 设置
加载器
和比较器
:分别是EPIT_LR
和EPIT_CMPR
; - 在
GIC
打开对应该路EPIT
的中断,并设置中断优先级
(可选), 详见中断机制章节; - 编写中断服务函数;
- 打开
EPIT
中断:设置EPITx_CR
的EN
位。
- 选择
寄存器
详情:见参考资料3“24.6 EPIT Memory Map/Register Definition”小节。
GPT
(共2
路):General Purpose Timer
,通用型定时器,比前述EPIT
更通用。组成
:- 时钟源输入(
5
个):ipg_clk_24M
、GPT_CLK
(外部时钟)、ipg_clk
、ipg_clk_32k
和ipg_clk_highfreq
。 - 分频电路:
4096
种分频,分别对应0
~4095
。 - 计数器:即
GPTx_CNT
(x = 1, 2,下同)寄存器,向上计数。 - 输入捕获器(
2
路):待补充。 - 输出寄存器(
3
路):待补充。 - 比较器(
3
路):当某一路的输出寄存器
和计数器
的值比较相等时, 会输出中断信号
,各路中断独立输出。
- 时钟源输入(
- 使用
步骤
:复位
定时器:对GPTx_CR
的SWR
位写1
(复位后此位会自动清零);- 选择
时钟源
:设置GPTx_CR
的CLKSRC
位; - 设置
工作模式
:设置GPTx_CR
的FRR
位; - 设置
分频值
:设置GPTx_PR
的PRESCALAR
位; - 设置
比较器
:设置GPTx_OCRy
(y = 1, 2, 3); - 打开
GPTx
中断:设置GPTx_CR
的EN
位; - 编写中断服务函数。
寄存器
详情:见参考资料3“30.6 GPT Memory Map/Register Definition”小节。
20、有线以太网
- 为何要拆分成
MAC
和PHY
两部分:MAC
对应链路层,负责通信协议的控制与处理;PHY
对应物理层,通过数-模
双向转换进行数据收发。MAC
芯片是全数字器件,而PHY
还含有大量的模拟器件, 后者对集成有很大挑战,所以主流方案都是将MAC
集成到CPU内部, 而PHY
作为外部芯片,既降低了成本,又可为MAC
设置DMA
大大加速数据包处理。- 两者的数据接口是
MII
或RMII
,控制接口是MDIO
(类似于I2C
)。 PHY
对外则会先连接变压器
、再连RJ45
接口(即网线接口), 部分RJ45
可能会内置变压器
。- 由于
i.MX6ULL
已集成MAC
(详见后面),而在实际做产品时可能会选用不同的PHY
芯片, 所以一般移植的重点是PHY
的参数调整。由于PHY
芯片寄存器地址线宽是5
位, 亦即支持最多32
个寄存器,并且IEEE
规定了前16
个基础寄存器的功能, 所以无论采用哪个厂家的PHY
芯片,单靠前16
个寄存器就足以驱动起来, 亦即可以采用通用驱动代码,但要使用芯片的专用特性,就需要原厂驱动了。 关于PHY
基础寄存器的说明,详见IEEE Std 802.3™-2018
文档SECTION2
第22.2.4 Management functions
小节。
MII
与RMII
的区别:MII
即Media Independent Interface
,介质独立接口, 是最初的IEEE-802.3
以太网标准接口,特点是收发时钟分开, 且收发都是4
条数据线,最大缺点也是线太多,达到16
条, 所以已越来越少用。RMII
即Reduced MII
,属于精简型的MII
接口, 特点是收发共用同一时钟,且收发数据线都缩减到2
条, 线的数量只有7
条,但需要翻倍的时钟频率以保证传输速率。- 此外还有
GMII
、RGMII
等接口,都是在前两者基础上发展起来的, 不再赘述。
- 网络分层:
OSI层级 OSI模型 TCP/IP模型 TCP/IP层级 7 应用层 应用层 4 6 表示层 5 会话层 4 传输层 3 3 网络层 2 2 链路层 链路层 1 1 物理层 i.MX6ULL
的10/100-Mbps Ethernet MAC
(ENET
)功能特性:- 实现
三
层网络硬件级加速,可加速常见协议(IP、TCP、UDP、ICMP等)数据包的处理。 通过硬件加速模块来执行关键功能(perform critical functions), 比在软件层面用大帧头来实现(with large software overhead)相同的功能要好很多。 - 带
RMON
(Remote Network Monitoring
)计数功能。 - 内置
FIFO
缓冲区,减少接收丢包。 - 高级电源管理,可用于
魔术包
(magic packet
)检测和掉电模式
(power-down
mode)。 - 内置专用
DMA
,可优化ENET
核心与SoC
之间的数据传输, 还支持IEEE 1588
标准的增强型缓冲描述符
(enhanced buffer descriptor
), 而且IEEE 1588
还提供工业自动化应用
场景下的分布式控制节点
所需的精确时钟同步
机制。 - 自动
流(量)控(制)
(Flow Control
),不需应用层干预。 - 可通过
MII
(2.5/25MHz)、MII-Lite
(同前)或RMII
(50MHz)接口与各种PHY
无缝衔接。 - 内含单播和多播地址过滤,减少高层应用的负担。
- 能合并
MAC
模块产生的中断,降低CPU负担。 - 支持
IPv4
和IPv6
,并且有自动的IP、TCP、UDP、ICMP的校验码生成及检验、数据包和错误统计、 可配置的错误帧丢弃/收发字节序转换/32位字对齐/剥除填充内容……之类的特性。 - 其余细节及寄存器详情见参考资料3“Chapter 22 10/100-Mbps Ethernet MAC (ENET)”。
- 实现
21、常见的基础通信接口
21.1 一些重要概念
同步
与异步
:区别在于是否需要时钟信号
的同步机制
:同步
通信:数据传输的时序
是由同一个时钟信号控制
的。收发双方均需在每个时钟周期内, 按特定顺序收发每一个数据位,所以通信协议不需要定界符
,但数据速率
必须与时钟频率
匹配, 即时钟频率
决定数据速率
。异步
通信:数据传输不需要时钟信号,而是使用定界符
(起始位、停止位、 校验位等)来确定传输情况。- 注意:速率快慢与同步异步无绝对关系,而与
物理电气特性
和软件协议设计
有关。 通信距离亦然。
单工
与双工
:- 两个设备之间仅支持
单向
数据传输,就是单工
。 - 支持
双向
数据传输,就是双工
,又可进一步分为:全
双工:两个方向
的数据传输可同时进行
。半
双工:不可同时进行。- 注意:接收与发送共用一条线的,肯定是
半
双工; 收与发各用一条线的,基本都是全
双工(除非硬件设计和软件协议不支持)。
- 两个设备之间仅支持
比特率
与波特(率)
:比特率
:Bit Rate
,每秒传输的二进制位
数,符号是b/s
或bps
。波特(率)
:Baud (Rate)
,每秒传输的码元符号
数,符号是Bd
。- 两者关系:一个
码元符号
可由多个二进制位
(仅指数据位,不含起始、停止位)组成, 所以两者的关系的表示公式为:比特率
=波特率
*数据位数
。 - 注1:通常在
时钟速率
固定的情况下,比特率
也固定,但波特率
却要看编码方式
, 编码方式决定一个码元符号
是由几个比特位
组成的。有的计算标准会考虑起始、停止位; 还有的标准使用的是调制状态
占用的二进制位数
,所以计算公式会使用对数
, 即:比特率
=波特率
*log2(M)
,其中M
是调制相位数
,对于串口来说, 电平变化只有0
和1
,属两相调制
,即M
=2
,故比特率
=波特率
。 - 注2:
波特率
一般只用于串口
(UART
),其他情况基本上都用比特率
。 - 注3:
波特
已包含速率
的意思,其实不必再加一个率
。
21.2 串口(UART)
-
全称详见缩略词表格。
-
引脚相对于
并(行)(接)口
大大减少,方便布线,但通信速率亦会大大降低。 -
与后面的
I2C
、SPI
等接口相比,通信距离远。 - 引脚(全双工最小配置):
GND
:接地。RXD
:接收。TXD
:发送。
- 协议时序:
空闲
状态:线路处于逻辑1
(即高电平)的状态。起始
位:逻辑0
,即低电平。数据
位:- 位数:可选择
5
~9
位,由于一个字节是8位,所以通常选择8位。 - 顺序:先传
低
位,后传高
位,与小端字节序相似。
- 位数:可选择
奇偶校验
位:对数据中1
的位数进行校验,且校验功能可关闭。停止
位:逻辑1
,位宽可选择1
、1.5
或2
,一般选1
。
- 接口电平:
TTL
:低
电平(0
V)表示逻辑0
,高
电平(5
V或3.3
V)表示逻辑1
。 常用于设备内部的数据传输,而不像以下两个的跨设备、长距离场景。RS-232
(Recommended Standard 232
):即COM口
(DB9
接口,或D-Sub 9
, 但通常只使用其中3
条线,其余线仅以前用到,引脚与TTL
兼容,但电平需要转换),+3
~+15
V表示逻辑0
,-3
~-15
V表示逻辑1
。速率较低(异步20 Kbps
), 抗干扰能力较差,实际中最大通信距离为50
米左右(视通信速率而定,速率越大, 距离越短,下同)。连接方式只能一对一。RS-485
:采用差分
线(不必用GND
,抗干扰能力强,通信距离更长,可达3000
米, 速度最高可达10 Mbps
,但属于半
双工),+2
~+6
V表示逻辑1
,-2
~-6
V表示逻辑0
,0
V表示空闲
,电压比RS-232
降低了,更不易损坏芯片,且与TTL
电平兼容, 可方便与其相连。连接方式允许一对多(但通信时序不是?),最多可达128
个收发器。
寄存器简介
:- 分析待补充。
- 寄存器详情见参考资料3“55.15 UART Memory Map/Register Definition”小节。
21.3 I2C
-
全称详见缩略词表格。
-
引脚数最少!
- 引脚(均需上拉电阻):
SCL
:Serial Clock
,时钟。SDA
:Serial Data
,数据。
- 协议时序(基于地址;应答式):
- 数据的采样全发生在
SCL
为1
(高电平)期间;以下如无说明均是主机
视角。 起始
位:SDA
输出下降沿
。停止
位:SDA
输出上升沿
。数据
位:直接采样SDA
的电平
值,注意要保持电平稳定, 数据要变化就只能发生SCL
为0
期间。- 位数:不固定,由硬件决定,可以在
1
~32
范围内选择,一般设为8
。 - 顺序:先传
高
位,后传低
位,与大端字节序相似、与UART
相反。
- 位数:不固定,由硬件决定,可以在
应答
位:紧跟数据
之后
的一个时钟周期,供从机
使用,将SCA
拉低即可, 此时主机
是处于输入
状态,读到低电平则表示通信成功而继续下一步,否则进行错误处理。单
字节写
时序:- 发送从机
设备地址
:起始
位;7
位地址;(最低位)1
位读写位
, 此处为0
表示写
;等待从机应答
信号。 - 发送从机
寄存器地址
:起始
位;8
位地址;等待从机应答
信号。 - 发送
寄存器数据
:8
位数据;等待从机应答
信号。 - 发送
停止
位。
- 发送从机
单
字节读
时序(比写
时序多一步):- 发送从机
设备地址
:与写
时序一样。 - 发送从机
寄存器地址
:与写
时序一样。 - 再发一次从机
设备地址
:除了读写位
为1
表示接下来要读数据之外, 其余与第一步相同。 - 读取
寄存器数据
:8
位数据;且向从机发送1
位NO ACK
信号, 表示不需要从机应答。 - 发送
停止
位。
- 发送从机
多
字节写
时序:- 除了在第三步连续发送多个字节的数据(包括每个字节均要等待应答)之外,
其余与
单
字节写
时序相同,而且要求主机和从机均支持这种模式。
- 除了在第三步连续发送多个字节的数据(包括每个字节均要等待应答)之外,
其余与
多
字节读
时序:- 除了在第四步连续接收多个字节的数据、非末尾字节等待从机应答、
末尾字节才向从机发送
NO ACK
之外,其余与单
字节读
时序相同, 而且要求主机和从机均支持这种模式。
- 除了在第四步连续接收多个字节的数据、非末尾字节等待从机应答、
末尾字节才向从机发送
- 数据的采样全发生在
寄存器简介
:- 分析待补充。
- 寄存器详情见参考资料3“31.7 I2C Memory Map/Register Definition”小节。
21.4 SPI
-
全称详见缩略词表格。
-
速率比
I2C
更快,时序也更简单。 - 引脚:
CS/SS
:Slave Select / Chip Select
,片选,拉低即选中某从机, 在多从机场景中,主机可以有多个片选引脚。菊花链模式是另一种多从机连接方式, 即所有从机的片选引脚均连接到主机的单一片选引脚,而从机之间的数据引脚则串联。SCK
:Serial Clock
,时钟。MOSI/SDO
:Master Out Slave In / Serial Data Output
,主出从入。MISO/SDI
:Master In Slave Out / Serial Data Input
,主入从出。
- 协议时序(无地址;有片选;时钟跳变沿读写数据):
- 拉低片选信号,选中要通信的从机。
- 在相应的时钟跳变沿(第
1
还是第2
个上升或下降沿,见后面配置), 可同时通过MOSI
发送数据及通过MISO
接收数据。 收发顺序与I2C
相同,即先传高
位,后传低
位。CPOL
:Clock Polarity
,时钟极性
,决定SCK
空闲时的极性:0
为低
电平,1
为高
电平。CPHA
:Clock Phase
,时钟相位
,决定数据线
的采样时机:0
是在第1
个跳变沿采样,1
则在第2
个跳变沿采样。- 至于采样时是上升沿还是下降沿,则要结合以上两个参数来判断。
例如两个均为
0
,则意味着总线从空闲(低电平)转为就绪状态(高电平)时, 第一个时钟跳变沿是上升沿,此时即进行数据采样,其余情况可类推。
寄存器简介
:- 分析待补充。
- 寄存器详情见参考资料3“20.7 ECSPI Memory Map/Register Definition”小节。
21.x 其余
待补充。
21.y 各通信接口对比
名称 | 引脚 | 连接方式 | 速率 | 协议特色 | 典型用途 |
---|---|---|---|---|---|
UART | GND RXD TXD |
一对一 | 典型:115200 Bd | 最简单 | 目标板调试、低速率工控设备通讯、蓝牙、GPS、GPRS等 |
I2C | SCL SDA |
一主多从 | 标准:100 Kb/s 高速:400 Kb/s |
基于地址; 应答式 |
温度传感器、陀螺仪、加速度计、触摸屏等 |
SPI | CS/SS SCK MOSI/SDO MISO/SDI |
一主多从 | 一般可达到:x Mb/s | 无地址,有片选; 时序更简单,速度比I2C更快 |
传感器、储存器、实时时钟、数模转换等 |
22、其余模块的功能简介、寄存器定义、及内存映射
22.1 IO复用
-
所谓的
IO复用
(IO Multiplexing),是指一个引脚
(Pin
)可以被多个功能模块所用 (但在给定的任一时刻只能配置成一种功能状态), 在对应的寄存器配置方面有多个信号选项
(Signal Option
)可供选择。 -
设置
引脚
与信号
之间的映射关系的复用器
(Multiplexer
)叫IOMUX
。 -
各个复用选项的详情见参考资料3的“4.1.1 Muxing Options”小节, 或具体模块的“External Signals”小节。现仅将其分属的模块列举如下:
代号 含义 PLATFORM 平台 CCM Clock Controller Module,时钟控制器模块 CSI CMOS Sensor Interface,CMOS传感器接口 ECSPI 1~4 Enhanced Configurable Serial Peripheral Interface,增强型可配置串行外设接口,共4路 EIM External Interface Module,外部接口模块 ENET 1~2 Ethernet,以太网,共2路 EPIT 1~2 Enhanced Periodic Interrupt Timer,增强型周期性中断定时器,共2路 EPDC Electrophoretic Display Controller,电泳显示器控制器 FlexCAN 1~2 Flexible Controller Area Network,弹性控制器局域网,共2路 GPIO 1~5 General Purpose Input/Output,通用型输入输出,共5路(每路引脚数不一样) GPT 1~2 General Purpose Timer,通用型定时器,共2路 I2C 1~4 Inter-Integrated Circuit,内部(还是跨域??)集成电路,共4路 KPP Keypad Port,键盘端口 LCDIF Liquid Crystal Display Interface,液晶显示器接口 MMDC Multi Mode DDR Controller,多模式DDR内存控制器 MQS Medium Quality Sound,中等质量音响 NAND 与非型闪存 PWM 1~8 Pulse Width Modulation,脉冲宽度调制,共8路 QSPI Quad Serial Peripheral Interface,四通路(??)串行外设接口 SAI 1~3 Synchronous Audio Interface,同步音频接口 SDMA Smart Direct Memory Access Controller,智能型直接内存访问控制器 SJC System JTAG Controller,系统JTAG控制器 SNVS Secure Non-Volatile Storage,安全型非易失性储存器 SRC System Reset Controller,系统重置控制器 SPDIF Sony/Philips Digital Interface,索尼/菲利普数字接口 UART 1~8 Universal Asynchronous Receiver/Transmitter,通用异步收发器(即串口),共8路 USB Universal Serial Bus,通用串行总线 USDHC 1~2 Ultra Secured Digital Host Controller,超安全主机控制器(用于读写SD/MMC储存卡),共2路 WDOG 1~3 Watchdog,看门狗,共3路 XTALOSC Crystal Oscillator,晶(体)振(荡器) - 在实际操作中,首先要通过
IO复用控制器
(IOMUX Controller
)来设置引脚复用, 该控制器称作IOMUXC
,有以下寄存器:IOMUXC_SW_MUX_CTL_PAD_<PAD NAME>
或IOMUXC_SW_MUX_CTL_GRP_<GROUP NAME>
: (1)配置一个焊盘(Pad
)或焊盘组的复用选项
(Multiplexing Option
, 在寄存器中表现为ALT
字段);(2)激活相应的输入路径强制
(Forcing of Input Path
, 在寄存器中表现为SION
字段,即Software Input ON
之意)特性。IOMUXC_SW_PAD_CTL_PAD_<PAD NAME>
或IOMUXC_SW_PAD_CTL_GRP_<GROUP NAME>
: 对一个焊盘或焊盘组进行特定设置,即配置电气特性,例如上下拉电阻、是否开漏输出等。IOMUXC_GPR_GPR0
~IOMUXC_GPR_GPR13
:通用寄存器,根据SoC
实际需求而定。
- 以上涉及的具体寄存器的功能定义及内存映射详见参考资料3的以下章节:
32.4 IOMUXC GPR Memory Map/Register Definition
32.5 IOMUXC SNVS Memory Map/Register Definition
32.6 IOMUXC Memory Map/Register Definition
- 最后,配置
具体模块的寄存器
(寄存器明细项及其内存映射详见特定章节,此处列举不了), 进行实际的数据收发。
22.2 GPIO
- 相关寄存器:
GPIO_DR
:Data Register,数据寄存器GPIO_GDIR
:Direction,方向寄存器GPIO_PSR
:Pad Sample Register,焊盘采样寄存器GPIO_ICR1
、GPIO_ICR2
:Interrupt Control Register,中断控制寄存器GPIO_EDGE_SEL
:Edge Select,边缘选择触发器GPIO_IMR
:Interrupt Mask,中断掩码寄存器GPIO_ISR
:Interrupt Status Register,中断状态寄存器
-
编程指导:详见参考资料3“28.4.3 GPIO Programming”。
- 寄存器定义及内存映射:详见参考资料3“28.5 GPIO Memory Map/Register Definition”。
其他
待补充。
23、蛋疼的缩略词(需结合语境)
英文缩写 | 英文全称 | 中文翻译(仅供参考) |
---|---|---|
ABI | Application Binary Interface | 应用程序二进制接口 |
ALU | Arithmetic Logical Unit | 算术逻辑单元 |
ARM | Advanced RISC Machine | 高级RISC机器 |
BSS | Block Started by Symbol | 以符号作为开头的块区域 |
CAN | Controller Area Network | 控制器局域网 |
CISC | Complex Instruction Set Computer | 复杂指令集计算机 |
CMOS | Complementary Metal Oxide Semiconductor | 互补金属氧化物半导体 |
CPU | Central Processing Unit | 中央处理器 |
CSI | CMOS Sensor Interface | CMOS传感器接口 |
DDR | Double Data Rate (Synchronous Dynamic Random Access Memory) | 双倍数据速率(同步动态随机访问储存器) |
DMA | Direct Memory Access | 直接内存访问 |
DRAM | Dynamic Random Access Memory | 动态随机访问储存器 |
EEPROM | Electrically Erasable Programmable Read-Only Memory | 可电气擦除的可编程只读储存器 |
FIFO | First In First Out | 先入先出 |
GIC | Generic Interrupt Controller | 通用中断控制器 |
GPIO | General Purpose Input/Output | 通用型输入/输出 |
I2C / IIC | Inter-Integrated Circuit | 内部(还是跨域??)集成电路 |
JTAG | Joint Test Action Group | 联合测试行动组,一种调试接口标准 |
LCD | Liquid Crystal Display | 液晶显示器 |
MMU | Memory Management Unit | 内存管理单元 |
OSI | Open System Interconnection | 开放式系统互联 |
PLL | Phase Locked Loop | 锁相环 |
PPI | Private Peripheral Interrupt | 私有外设中断 |
PWM | Pulse Width Modulation | 脉冲宽度调制 |
RAM | Random Access Memory | 随机访问储存器 |
RISC | Reduced Instruction Set Computer | 精简指令集计算机 |
ROM | Read-Only Memory | 只读储存器 |
SDHC | Secure Digital High Capacity | 高容量安全数字(规范/标准),即新一代的SD卡规范/标准 |
SGI | Software-Generated Interrupt | (由)软件产生的中断 |
SIMD | Single Instruction Multiple Data | 单指令多数据 |
SNVS | Secure Non-Volatile Storage | 安全型非易失性储存器 |
SoC | System on Chip | 片上系统 |
SPI | Serial Peripheral Interface / Shared Peripheral Interrupt | 串行外(围)设(备)接口 / 共享型外设中断 |
SDRAM | Synchronous Dynamic Random Access Memory | 同步动态随机访问储存器 |
SRAM | Static Random Access Memory | 静态随机访问储存器 |
TTL | Transistor-Transistor Logic | 晶体管-晶体管逻辑 |
UART | Universal Asynchronous Receiver/Transmitter | 通用异步收发器,通常简称为串口 |
USB | Universal Serial Bus | 通用串行总线 |
2024-11-25
注:更多缩略词可查阅这篇文章,此表不再更新。
24、参考材料
-
ARM Architecture Reference Manual ARMv7-A and ARMv7-R edition (宜作为字典,按需查询)
-
i.MX 6ULL Applications Processor Reference Manual (宜作为字典,按需查询)
25、温馨提示
书山有路找捷径,学海无涯抓重点!