1,专用、软硬件可剪裁可配置
2,低功耗、高可靠性、高稳定性
3,软件代码短小精悍
4,代码可固化
5,实时性
6,弱交互性
7,需要专门的开发工具和开发环境
8,要求开发,设计人员有较高的技能
1、软件方式:gdb调试器
2、硬件方式:ROM Monitor、ROM Emulator、In-Circuit Emulator、In-Circuit Debugger
ARM Cortex处理器基于ARM v7架构,Cortex分为三个系列:Cortex A、Cortex R、Cortex M。
使用场景:
Cortex A:多功能复杂性
Cortex R:实时性要求高
Cortex M:嵌入式,单片机
类型 | 中文 | 大小 |
---|---|---|
Byte | 字节 | 8bit |
Halfword | 半字 | 16bit |
Word | 字 | 32bit |
1、功能:
考虑处理器本身能够支持的功能,如支持USB、网络、串口、液晶显示功能等。
2、性能:
从处理器的功耗、速度、稳定性、可靠性方面考虑。
3、价格:
通常产品总是希望在完成功能要求的基础上,成本越低越好。在选择处理器时需要考虑处理器的价格,以及由处理器衍生出的开发价格。如开发板价格、处理器自身价格、外围芯片价格、开发工具价格、制版价格等。
4、熟悉程度及开发资源:
通常公司对产品的开发周期都有严格的要求,选择一款自己熟悉的处理器可以大大降低开发风险。在自己熟悉的处理器都无法满足功能的情况下,可以尽量选择开发资源丰富的处理器。
5、操作系统支持:
在选择嵌入式处理器时,如果最终的程序需要运行在操作系统上,那么还应该考虑处理器对操作系统的支持
6、升级:
很多产品在开发完成后都会面临升级的问题,正所谓人无远虑必有近忧。所以在选择处理器时必须要考虑升级的问题。要尽量选择具有相同封装的不同性能等级的处理器;考虑产品未来可能增加的功能。
7、供货稳定:
供货稳定也是选择处理器时的一个重要参考因素,尽量选择大厂家和比较通用的芯片。
处理器工作模式 | 简写 | 描述 |
---|---|---|
用户模式 | usr | 正常程序执行模式,大部分任务执行在这种模式下。 |
快速中断模式 | fiq | 当一个高优先级中断产生时会进入这种模式,一般用于高速数据传输和通道处理。 |
外部中断模式 | irq | 当一个低优先级中断产生会进入这种模式一般用于通常的中断处理。 |
特权模式 | svc | 当复位或者软中断指令执行时将会进入这种模式,一般用于通常的中断处理。 |
数据访问中止模式 | abt | 当存取异常时进入这种模式,用于虚拟存储或者存储保护。 |
未定义指令中止模式 | und | 当执行未定义指令时进入这种模式,有时用于通过软件仿真协处理器硬件的工作方式。 |
系统模式 | sys | 使用和user模式相同寄存器的模式,用于特权级操作系统任务。 |
监控模式 | mon | 可以在安全模式和非安全模式之间进行转换。 |
除了用户模式之外的其他7种处理器模式被称为特权模式,除了用户模式和系统模式之外的6种模式被称为异常模式。
**3级流水线:**取指令、译码、执行
**5级流水线:**取指令、译码、执行、LS1负责加载和存储指令中制定的数据,LS2则负责提取、符号扩展,通过字节或半字加载命令来加载数据。(但是LS1和LS2仅对加载(LDR)和存储命令(STR)有效,其他的指令是不需要执行这两个阶段的)
ARM处理器内部有40个32位寄存器,其中包括:32个通用寄存器,7个状态寄存器(1个CPSR,6个SPSR),1个程序计数器PC。
CPSR:当前程序状态寄存器
SPSR:备份程序状态寄存器
特殊的几个寄存器:
SP:R13寄存器(用作堆栈指针)
LR:R14寄存器(连接寄存器)
PC:R15寄存器
条件标志位:N、Z、C、V 通称为条件标志位,也就是CPSR的高4位。条件标志位会根据程序中的算术指令或逻辑指令的执行结果进行修改。
条件标志位 | 含义 |
---|---|
N | 当两个由补码组成的有符号整数运算时,N=1表示运算的结果为负数,N=0表示运算的结果为正数或0。 |
Z | Z=1表示运算的结果为0,Z=0表示结果为不为0 |
C | 加法指令(包括比较指令CMN),当结果产生了进位,则C=1,表示无符号数运算发生上溢出;其他情况下C=0。在减法指令中(包括比较指令CMP),当运算中发生了错位(即无符号数运算发生下溢出),则C=0;其他情况下C=1。对于在操作数中包含移位操作的运算指令(非加减指令),C被设置为被移位寄存器最后移出去的位。对于其他非加减运算指令,C的值通常不受影响。 |
V | 对于加减指令,当运算结果溢出时V=1,表示符号位溢出,没有溢出V=0。对于非加减指令,V的值通常不受影响 |
CPSR的低8位(I、F、T、M[4:0])统称为控制位。当异常发生时,这些位的值将发生响应的变化。
(1)中断禁止位
I=1,IRQ被禁止
F=1,FIQ被禁止
(2)状态控制位
T位是处理器的状态控制位,T位只有在T系列的ARM处理器上才有效,在非T系列的ARM版本中,T位始终为0
T=0,处理器处于ARM状态(即正在执行32位的ARM指令)
T=1,处理器处于Thumb状态(即正在执行16位的Thumb指令)
(3)模式控制位
M[4:0]是位模式控制位,这些位的组合确定了处理器处于哪种状态。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-gt5QKlQa-1592389913678)(https://s1.ax1x.com/2020/06/12/tXyf5d.jpg)]
ARM指令集可以分为跳转指令、数据处理指令、程序状态寄存器传输指令、Load/Store指令、协处理器指令、异常中断产生指令。
ARM指令的寻址方式分为数据处理指令寻址方式和内存访问指令寻址方式。
数据处理指令寻址方式:立即数寻址方式、寄存器寻址方式、寄存器移位寻址方式。主要的作用是对数据的处理。
内存访问指令寻址方式:主要的作用是将内存中的数据加载到寄存器中(load)或者是将寄存器中的数据存储到内存中(store)。
格式 | 模式 | 解释 |
---|---|---|
IA | 后递增方式 | 每次传送后地址加4 |
IB | 先递增方式 | 每次传送前地址加4 |
DA | 后递减方式 | 每次传送后地址减4 |
DB | 先递减方式 | 每次传送前地址减4 |
格式 | 模式 | 解释 |
---|---|---|
FD | 满递减方式 | 堆栈指针指向栈顶元素,堆栈向内存地址减小的方向增长。 |
ED | 空递减方式 | 堆栈指针指向第一个可用元素(也就是空位置),堆栈向内存地址是增加的方向增长。 |
FA | 满递增方式 | 堆栈指针指向栈顶元素,堆栈向内存地址减小的方向增长。 |
EA | 空递增方式 | 堆栈指针指向第一个可用元素(也就是空位置),堆栈向内存地址是增加的方向增长。 |
注意:数据处理指令加上S,指令的执行结果将会影响CPSR中的标志位。
1、MOV 指令 说明:相当于赋值,将寄存器中的值或者立即数转移
MOV R0, R1
MOV R0, #4
MOV R0, R0, LSL #3
2、MVN 指令 说明:反相传送,将操作数的反码传送到目标寄存器
MVN R0, #4 ; R0=-5
MVN R0, #0 ; R0=-1
3、AND 指令 说明:逻辑与运算
AND R0, R0, #3
AND R2, R1, R3
4、EOR 指令 说明:逻辑异或运算
EOR R0, R0, #3
5、SUB 指令 说明:减法运算
SUB R0, R1, R2
6、ADD 指令 说明:加法运算
ADD R0, R1, R2
ADD R0, R0, #4
7、CMP 指令 说明:比较两个数是不是相等
CMP R1, #10 ; 比较R1和立即数10并设置响应的标志位
CMP R1, R2 ; 比较寄存器R1和R2的值并设置相关的标志位
8、CMN 指令 说明:比较两个数是不是相反数
CMN R0, #1
9、ORR 指令 说明:逻辑或运算
ORR R0, R0, #3
10、BIC 指令 说明:位清零运算
BIC R0, R0, #0x1011 ; 将立即数中为1的位清零
11、MUL 指令 说明:乘法运算
MUL R1, R2, R3 ; R1 = R2 × R3
MULS R0, R3, R7 ; R0 = R3 × R7,并同时设置CPSR中的N位和Z位
12、MLA 指令 说明:乘法运算后加上一个操作数
MLA R1, R2, R3, #10 ; R1 = R2 × R3 + 10
13、SWP指令 说明:交换指令
MOV R0, #0
SWP R1, R1, [R0] ; 将R0地址中的值和R1互换位置
SWP R1, R2, [R3] ; 将R3地址中的值给R1,将R2的值放到R3的地址中
LDR指令:
LDR R1, [R0, #0x12] ; 将R0+12地址处的数据读出存放到R1中
LDR R1, [R0] ; 将R0地址处的数据读出存放到R1中
LDR R1, [R0, R2] ; 将R0+R2地址处的数据读出存放到R1中
LDR R1, [R0, R2, LSL #2] ; 将R0+R2×4地址处的数据读出存放到R1中
LDR Rd, label
LDR Rd, [Rn], #0x04 ; 将Rn地址处的数据读出存放到Rd中,然后Rn的值变成原来的值加0x04
STR指令:
STR R1, [R0] ; 将R1的值保存到R0地址中
LDM指令:
LDMIA R0!, {R3~R9} ; 从R0指向的地址上加载数据到R3~R9上,R0值更新
STMIA R1!, {R3~R9} ; 将R3~R9的数据存储到R1指向的地址上,R1值更新
STMFD SP!, {R0~R7,LR} ; 现场保存,将R0~R7、LR入栈
LDMFD SP!, {R0~R7,PC} ; 恢复现场,异常处理返回
注:!表示完成数据传输后要更新基址寄存器
指令 | 说明 | 作用 |
---|---|---|
B | 跳转指令 | 使程序跳转到指定的地址执行程序 |
BL | 带返回的连接跳转 | 将下一条指令的地址复制到LR中,然后跳转到指定地址运行程序 |
BX | 跳转并切换状态 | 能切换Thumb状态和ARM状态 |
BLX | 带返回的跳转并切换状态 | 能切换Thumb状态和ARM状态,也能返回 |
指令 | 作用 |
---|---|
MRS | 把程序状态寄存器的值送到一个通用寄存器 |
MSR | 把通用寄存器的值送到程序状态寄存器或把一个立即数送到程序状态字 |
MRS R1, CPSR ; 读取CPSR的值,保存到R1中
MRS R2, SPSR ; 读取SPSR的值,保存到R2中
MSR CPSR, #0xD3 ; 低8位设置为:1101 0011 切换到管理模式
MSR CPSR, R3 ; 将R3的内容保存到CPSR中
伪指令名 | 作用 |
---|---|
ADR | 小范围地址读取伪指令 |
ADRL | 中等范围地址读取伪指令 |
LDR | 装载一个32位的常数或一个地址到寄存器 |
LDR常用
LDR R3, =0xff0 ; 将常数0xff0读进寄存器R3中
LDR R1, =place ; 将place标号地址读入R1中
语法:asm volatile ("asm code":output:input:changed);
如果后面没有任何内容:可以省略,前面或中间的:不能省略。
汇编语句放到字符串中,多个字符串之间只要不加任何符号编译完之后就会变成一个字符串,汇编指令之间必须要换行。
"mov r0, r0\n\t"
"mov r1, r1\n\t"
"mov r2, r2"
output是输出值:汇编语言 -> C语言
input是输入值:C语言 -> 汇编语言
看一下output的格式:
asm volatile("asm code":"约束"(变量));
约束定义了变量的存放位置:
r : 使用任何可用的通用寄存器
m : 使用变量的内存地址
还有一些输出的修饰符:
+ : 可读可写
= : 只写
& : 该输出操作数不能使用输出部分使用过的寄存器,只能 +& 或 =& 方式使用
再看一下input的格式:
asm volatile("asm code"::"约束"(变量 或 立即数));
约束定义了输入变量或是立即数的存放位置:
r : 使用任何可用的通用寄存器(变量和立即数都可以)
m : 使用变量的内存地址(不能用立即数)
i : 使用立即数(不能用变量)
使用占位符
int a = 100, b = 200;
int result;
asm volatile(
"mov %0,%3\n\t"
"ldr r0,%1\n\t"
"ldr r1,%2\n\t"
"str r0,%2\n\t"
"str r1,%1\n\t"
: "=r"(result), "+m"(a), "+m"(b)
: "i"(123)
);
引用占位符
int num = 100;
asm volatile(
"add %0,%1,#100\n\t"
: "=r"(a)
: "0"(a) // 引用时不能加%,只能是 input 引用 output,引用是为了更能分清输出输入部分
);
&修饰符
int num;
asm volatile(
"mov %0,%1\n\t"
: "=&r"(num) // 输入和输出的寄存器不相同
: "r"(123)
);
内联汇编实例
#include
unsigned long ByteSwap(unsigned long val)
{
int ch;
asm volatile(
"eor r3, %1, %1, ror #16\n\t"
"bic r3, r3, #0x00FF0000\n\t"
"mov %0, %1, ror, #8\n\t"
"eor %0, %0, r3, lsr #8"
: "=r"(val)
: "0"(val)
: "r3");
}
int main(void)
{
unsigned long test_a = 0x1234, result;
result = ByteSwap(test_a);
printf("Result:%d\r\n", result);
return 0;
}
c语言程序:
#include
extern void strcopy(char* d, const char* s);
int main()
{
const char* srcstr = "First string - source ";
char dststr[] = "Second string - destination";
printf("Before copying:\n");
printf("%s\n%s\n", srcstr, dststr);
strcopy(dststr, srcstr);
printf("After copying:\n");
printf("%s\n%s\n", srcstr, dststr);
return 0;
}
汇编语言程序:
.global strcopy
strcopy: ; R0指向目的字符串,R1指向源字符串
LDRB R2, [R1], #1 ; 加载字节并更新源字符串指针地址
STRB R2, [R2], #1 ; 存储字节并更新目的字符串指针地址
CMP R2, #0 ; 判断是否为字符串结尾
BNE strcopy ; 如果不是,程序跳转到strcopy继续复制
MOV PC, LR ; 程序返回
C语言函数
int g(int a, int b, int c, int d, int e)
{
return a + b + c + d + e;
}
汇编语言程序
# int f(i){ return g(i, 2*i, 3*i, 4*i, 5*i); }
.text
.global _start
_start:
STR LR, [SP, #-4]! ; 保存返回地址 LR
ADD R1, R0, R0 ; 计算2*i(第2个参数)
ADD R2, R1, R0 ; 计算3*i(第3个参数)
ADD R3, R1, R2 ; 计算5*i
STR R3, [SP, #-4]! ; 第5个参数需要通过堆栈传递
ADD R3, R1, R1 ; 计算4*i(第4个参数)
BL g ; 调用C程序
ADD SP, SP, #4 ; 从堆栈中删除第5个参数
LDR PC, [SP], #4 ; 返回
GPIO也就是通用IO接口。接口至少有两个寄存器:通用IO控制寄存器、通用IO数据寄存器。
GPIO端口有两种方向:输出 和 输入。
1、引脚控制寄存器(GPxCON):用来配置每个引脚的功能
2、引脚数据寄存器(GPxDAT):如果引脚功能被配置成输出功能,可以通过向该寄存器对应为写入数据,控制引脚输出响应电平。如果被配置为输入功能,则可以从对应位读出数据
异常类型 | 处理器模式 | 执行低地址 | 执行高地址 |
---|---|---|---|
复位异常 | 特权模式 | 0x00000000 | 0xFFFF0000 |
未定义指令异常 | 未定义指令中止模式 | 0x00000004 | 0xFFFF0004 |
软中断异常 | 特权模式 | 0x00000008 | 0xFFFF0008 |
预取异常 | 数据访问中止模式 | 0x0000000C | 0xFFFF000C |
数据异常 | 数据访问中止模式 | 0x00000010 | 0xFFFF0010 |
外部中断异常 | 外部中断请求模式 | 0x00000018 | 0xFFFF0018 |
快速中断异常 | 快速中断请求模式 | 0x0000001C | 0xFFFF001C |
1、设置异常中断向量表
2、初始化数据栈和寄存器
3、初始化存储系统
4、初始化关键I/O设备
5、使能中断
6、处理器切换到合适的模式
7、初始化C变量,跳转到应用程序执行
**中断软件分支处理:**非向量中断控制器NVIC、通用中断控制器GIC
GIC架构分为:分配器、CPU接口、虚拟CPU接口
(1)软中断(SGI)
中断号0-15为SGI保留
(2)专用外设中断(PPI)
中断号16-31为PPI保留
(3)共享外设中断(SPI)
中断号32-1020用于共享外设中断
GIC中断在不同的状态间切换:
(1)Inactive(无效)
中断没有发生
(2)Pending(待处理)
中断已经发生,但是等待核心来处理。待处理中断都做为CPU接口发送到核心处理的候选者
(3)Active(正在处理)
中断发送给了核心,目前正在进行中断处理
(4)Active and pending(处理和待处理)
一个中断源正在进行中断处理而GIC又接收到来自同一中断源的中断触发信号
1,CPU中断通道使能寄存器(ICCICR_CPUN n=0~3)
2,中断使能寄存器(ICDISERm_CPUn m=0~4 n=0~3)
3,CPU优先级过滤寄存器(ICCPMR_CPUn n=0~3)
4,GIC中断使能寄存器(ICDDCR)
5,中断目标CPU配置寄存器(ICDIPTRm_CPUn m=0~39 n=0~3)
6,中断响应寄存器(ICCIAR_CPUn n=0~3)
7,GIC中断状态清除寄存器(ICDICPRm_CPUn m=0~5 n=0~3)
8,中断处理结束寄存器(ICCEOIR_CPUn n=0~3)
9,I2C传输配置寄存器(I2CCONn n=0~7)
在微型计算机中,通信有两种方式:串行通信和并行通信
串行通信通常传输速度慢,但使用的传输设备成本低,可利用现有的通信手段和通信设备,适合于计算机的远程通信
并行通信的速度快,但使用的传输设备成本高,适合于近距离的数据传送。
异步通信:指数传送以字符为单位,字符与字符间的传送是完全异步的,位与位之间的传送基本上是同步的。
1、以字符为单位传送信息
2、相邻两字符间的间隔是任意长
3、因为一个字符中的波特位长度有限,所以需要的接收时钟和发送时钟只要相接近就可以
4、异步方式特点就是:字符间异步,字符内部各位同步
1、以数据块为单位传送信息
2、在一个数据块(信息帧)内,字符与字符间无间隔
3、因为一次传输的数据块中包含的数据较多,所以接收时钟与发送时钟严格同步,通常要有同步时钟
9针引脚定义
引脚 | 简写 | 功能说明 |
---|---|---|
1 | CD | 载波侦测 |
2 | RXD | 接收数据 |
3 | TXD | 发送数据 |
4 | DTR | 数据终端设备 |
5 | GND | 地线 |
6 | DSR | 数据准备好 |
7 | RTS | 请求发送 |
8 | CTS | 清除发送 |
9 | RI | 振铃指示 |
接线方式:2接3、3接2、5接5
功能:定时触发、标记事件间隔(还可以用来输入捕捉、输出比较、PWM信号输出等)。
定时器的实质:定时器的本质就是一个计数器,只不过计数器记录的是处理器外部发生的事情,定时器记录时钟脉冲的个数。
**PWM(脉冲宽度调制):**是利用处理器的数字输出对模拟电路进行控制的一种非常有效的技术,广泛应用在测量、通信、功率控制个变换等多个领域。
**PWM控制技术优点:**控制简单、灵活、动态响应好;从处理器到被控制系统信号都是数字形式的,在进行数模转换时,可将噪声影响降到最低。
**4412-PWM定时器:**Exynos4412中共有5个32位定时器,可产生中断信号给ARM子系统。定时器0、1、2、3包含了脉冲宽度调制(PWM),并可驱动其外部的I/O口。
特点:
1、5个32位定时器
2、2个8位PCLK分频器提供1级预分,5个独立的2级分频器
3、可编程时钟选择的PWM独立通道
4、4个独立的PWM通道,可控制极性和占空比
5、静态配置:PWM停止
6、动态配置:PWM启动
7、支持自动重装模式及出发脉冲模式
8、两个PWM输出课带Dead-Zone发生器
9、中断发生器
**看门狗的作用:**看门狗定时器用于检测程序的正常运行,当微控制器受到干扰进入错误状态后,使系统在一定时间间隔内自动复位重启。因此看门狗是保证系统长期、可靠个稳定运行的有效措施。主要的作用就是防死机。
**看门狗的原理:**启动看门狗后,必须在看门狗复位之前向特定寄存器中写入数值,不让看门狗定时器溢出,这样看门狗就会重新计时。当用户程序在规定时间内没有向特定寄存器中依次写入数值,看门狗定时器计数溢出,引起看门狗复位,看门狗产生一个强制系统复位。这样可以使程序重新运行,减少程序跑死的危害。看门狗需要不停的接收信号或者重新设置计数值,保持计数值不为0,如果一旦一段时间内接收不到信号或者计数值为0,看门狗就会发出复位信号。
**看门狗定时器特点:**需要不停的接收信号(一些外置看门狗芯片)或重新设置计数值(如Exynos4412的看门狗控制器),保持计数值不为0。一旦一段时间接收不到信号,或计数值为0,看门狗将发出复位信号复位系统或产生中断。
主要特性: 1、通用的中断方式的16位定时器。2、当计数器减到0(发生溢出)时,产生128个PLK周期的复位信号。
看门狗定时器寄存器:
1、看门狗定时器控制寄存器(WTCON)
2、看门狗定时器数据寄存器(WTDAT)
3、看门狗计数寄存器(WTCNT)
**RTC定时器的作用:**为一个嵌入式系统提供可靠的时间,并且要求系统处于关机状态下也能正常工作。
**Exynos4412RTC定时器概述:**RTC可以通过STRB/LDRB指令将8位BCD码数据送至CPU。这些BCD包括秒、分、时、日期、星期、月和年。RTC单元通过一个外部的32.768kHz晶体提供时钟。具有定时报警功能。
RTC定时器特点:
1、时钟数据采用BCD编码
2、能够对闰年的年月日进行自动处理
3、具有告警功能,当系统处于关机状态时,能产生告警中断
4、具有独立的电源输入
5、提供毫秒级时钟中断,该中断可用于作为嵌入式操作系统的内核时钟
RTC定时器软件设计流程:
1、设置RTC控制寄存器中的CTLEN为1,使能时间值寄存器数据的读/写
2、设置RTC当前时钟时间
3、在掉电前,RTCEN位应清0来预防误写入RTC寄存器中
4、读取年、月、日等相关寄存器的数据通过串口打印到屏幕上
(1)分辨率:
表示会触发数字量变化的最小模拟信号的变化量。通常以输出二进制(或十进制)数的位数来表示。n位输出的A/D转换器能区分2n个不同等级的输入模拟电压,能区分输入电压的最小值为满量程输入的1/2n。 最大输入电压一定时,输出位数越多,量化单位越小,分辨率越高。
(2)转换速率:
指完成一次A/D转换所需的时间的倒数。积分型A/D转换时间是毫秒级的,属低速A/D;逐次比较型是微秒级的,属中速A/D;全并行/串并行型A/D是纳秒级的。采样时间则指两次转换的间隔。采样速率必须小于或等于转换速率,转换速率在数值上可等同于采样速率。采样速率常用单位是Ksps和Msps,表示每秒采样千/百万次。
(3)量化误差:
由于A/D的有限分辨率而引起的误差。通常是一个或半个最小数字量的模拟变化量。表示为1LSB、1/2LSB.
(4)偏移误差:
输入信号为0时输出信号不为0的值,可外接电位器调至最小。
(5)满度误差:
满度输出时对应的输入信号与理想输入信号值之差。
(6)线性度:
实际禅话器的转移函数与理想直线的最大偏差。
I2C总线是两线式串行总线,是同步通信的一种特殊形式。Exynos4412芯片包含8个通用I2C接口控制器。
I2C接口是全双工的,只要求两条总线线路:一条串行数据线 SDA、一条串行时钟线 SCL。
I2C总线的优点:接口线少,控制方式简单,器件封装形式小,通信速率较高。
术语 | 描述 |
---|---|
发送器 | 发送数据到总线的器件 |
接收器 | 从总线接收数据的器件 |
主机 | 初始化发送,产生时钟信号和终止发送的器件 |
从机 | 被主机寻址的器件 |
多主机 | 同时有多于一个主机尝试控制总线但不破坏报文 |
仲裁 | 是一个在有多于一个主机尝试控制总线,但只允许其中一个控制总线并使报文不被破坏的过程 |
同步 | 两个或多个器件同步时钟信号的过程 |
I2C总线传输过程中有三种信号:开始信号(S)、结束信号(P)、应答信号(ACK)
开始信号:SCL为高电平时,SDA从高电平向低电平跳变,开始发送数据
结束信号:SCL为高电平时,SDA从低电平向高电平跳变,结束发送数据
应答信号:接收设备在接收到8bit(一个字节)的数据后,在第9个时钟周期,向发送设备发送低电平,表示成功收到数据
(1)开始时SDA和SCL线都是高电平,主机发送开始信号,SDA向低电平跳变,开始数据传输。
(2)数据一位一位的进行传输,SCL时钟为低电平周期时发送器发送数据,SDA线上数据可以发送变化,SCL时钟为高电平周期时接收器接收数据,SDA线上数据必须保持稳定
(3)当传输到8bit时,在第9个时钟周期,发送器释放对SDA线的控制,SDA线恢复高电平,若第9个时钟周期内,SDA线始终为高电平,发送器没有接收到ACK信号,就会发出停止信号停止本次通信或者重新发送开始信号。如果接收到ACK信号就会继续发送下一个字节。
(4)直到主机发送结束信号,结束本次通信。
I2C设备用一个7位或10位的数字唯一标识自己。I2C设备地址由固定部分和可编程部分组成,这样就可以支持一个I2C总线上挂载多个同样的器件,而地址不同。I2C地址的可编程部分的最大数量就是可以连接到I2C总线上相同的数量。
通常是开始信号之后的第一个字节决定了主机选择哪一个从机(例外的情况是可以寻址所有器件的广播地址)。第一个字节的前7位组成了从机地址,第8位决定了数据传输的方向,如果第8位是0表示主机会向从机写信息,是1表示主机会向从机读信息。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ZiFBBV6U-1592389913684)(https://s1.ax1x.com/2020/06/13/tvdykR.jpg)]
如果是10位编址的话,用开始信号后的两个字节表示地址,第一个字节的前7位是 11110XX(XX是10位地址的两个最高位),第一个字节的第8位是R/W位,决定了数据传输的方向,第二个字节是地址剩下的8位。
(1)配置主机发送模式
(2)将要通信的I2C从机的地址和读写位写入I2CDS寄存器
(3)将0xF0写入I2CSTAT寄存器
(4)I2C控制器发出开始信号后,在(2)中写入的I2CDS寄存器地址自动发送到SDA总线上,用来寻找从机。
(5)在ACK周期后,I2C控制器发生中断,I2CCON[4]被自动置1,I2C传输暂停
(6)I2C数据通信是否结束,若结束跳转到(10),否则跳转到7
(7)将要传输的数据写入I2CDS寄存器准备发送
(8)清除中断标志位,通过向I2CCON[4]中写0实现
(9)清除中断标志位后,I2CDS寄存器内的数据就开始发送到SDA总线上。发送完成后,跳转到(5)
(10)将0xD0写入I2CSTAT寄存器
(11)清除中断标志位,通过向I2CCON[0]中写0实现
(12)延时等待一段时间,使得停止信号生效,I2C通信结束
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-K5pCnCBU-1592389913686)(https://s1.ax1x.com/2020/06/13/tvrVR1.md.jpg)]
信号 | 信号描述 |
---|---|
CLK时钟信号 | 主设备发出,用于控制数据发送和接受的时序 |
MISO时钟信号 | 做为主设备时,从从设备接收输入数据;做为从设备时,向主设备发送输出数据 |
MOSI时钟信号 | 做为主设备时,向从设备发送输出数据;做为从设备时,从主设备接收输入设备 |
CS片选信号 | 从设备选择信号,当CS为低电平时,所有的数据发送/接收依次被执行 |
通过设置GPOL(极性)和GPHA(相位)的值,我们选定当前要使用的SPI数据传输格式。
GPOL | GPHA | |
---|---|---|
功能 | 控制时钟极性 | 控制时钟相位 |
值为0 | SPI总线空闲时,SCK为低电平 | SCK第一个跳变沿采样 |
值为1 | SPI总线空闲时,SCK为高电平 | SCK第二个跳变沿采样 |
1、用汇编语言实现求1~100的和
START:
MOV R0, #1
MOV R1, #1
LOOP:
ADD R1, R1, #1
ADD R0, R0, R1
CMP R1, #100
BEQ END
BNE LOOP
END:
B END ; R0中就是和
2、用汇编语言实现求5!
START:
MOV R0, #5
MOV R1, #4
LOOP:
MUL R0, R0, R1
SUB R1, R1, #1
CMP R1, #0
BEQ END
BNE LOOP
END:
B END ; R0中就是阶乘
1、用 ARM 内联汇编实现求1~100的和
int a = 1, b = 1;
int result;
asm volatile(
"LOOP:"
"ADD %2, %2, 1"
"ADD %1, %1, %2"
"CMP %2, #100"
"BNE LOOP"
"MOV %0, %1"
: "=r"(result)
: "+r"(a), "+r"(b)
);
2、用ARM内联汇编实现求5!
int a = 5, b = 4;
int result;
asm volatile(
"LOOP:"
"MUL %1, %1, %2"
"SUB %2, %2, #1"
"CMP %2, #0"
"BNE LOOP"
"MOV %0, %1"
: "=r"(result)
: "+r"(a), "+r"(b)
);
标志位
条件标志位:N、Z、C、V 通称为条件标志位,也就是CPSR的高4位。条件标志位会根据程序中的算术指令或逻辑指令的执行结果进行修改。
条件标志位 | 含义 |
---|---|
N | 当两个由补码组成的有符号整数运算时,N=1表示运算的结果为负数,N=0表示运算的结果为正数或0。 |
Z | Z=1表示运算的结果为0,Z=0表示结果为不为0 |
C | 加法指令(包括比较指令CMN),当结果产生了进位,则C=1,表示无符号数运算发生上溢出;其他情况下C=0。在减法指令中(包括比较指令CMP),当运算中发生了错位(即无符号数运算发生下溢出),则C=0;其他情况下C=1。对于在操作数中包含移位操作的运算指令(非加减指令),C被设置为被移位寄存器最后移出去的位。对于其他非加减运算指令,C的值通常不受影响。 |
V | 对于加减指令,当运算结果溢出时V=1,表示符号位溢出,没有溢出V=0。对于非加减指令,V的值通常不受影响 |
控制位
CPSR的低8位(I、F、T、M[4:0])统称为控制位。当异常发生时,这些位的值将发生响应的变化。
(1)中断禁止位
I=1,IRQ被禁止
F=1,FIQ被禁止
(2)状态控制位
T位是处理器的状态控制位,T位只有在T系列的ARM处理器上才有效,在非T系列的ARM版本中,T位始终为0
T=0,处理器处于ARM状态(即正在执行32位的ARM指令)
T=1,处理器处于Thumb状态(即正在执行16位的Thumb指令)
(3)模式控制位
M[4:0]是位模式控制位,这些位的组合确定了处理器处于哪种状态。
处理器工作模式 | 简写 | 描述 |
---|---|---|
用户模式 | usr | 正常程序执行模式,大部分任务执行在这种模式下。 |
快速中断模式 | fiq | 当一个高优先级中断产生时会进入这种模式,一般用于高速数据传输和通道处理。 |
外部中断模式 | irq | 当一个低优先级中断产生会进入这种模式一般用于通常的中断处理。 |
特权模式 | svc | 当复位或者软中断指令执行时将会进入这种模式,一般用于通常的中断处理。 |
数据访问中止模式 | abt | 当存取异常时进入这种模式,用于虚拟存储或者存储保护。 |
未定义指令中止模式 | und | 当执行未定义指令时进入这种模式,有时用于通过软件仿真协处理器硬件的工作方式。 |
系统模式 | sys | 使用和user模式相同寄存器的模式,用于特权级操作系统任务。 |
监控模式 | mon | 可以在安全模式和非安全模式之间进行转换。 |
除了用户模式之外的其他7种处理器模式被称为特权模式,除了用户模式和系统模式之外的6种模式被称为异常模式。
立即寻址、寄存器寻址、寄存器间接寻址、寄存器移位寻址、变址寻址、多寄存器寻址、相对寻址、堆栈寻址、块复制寻址
异常类型 | 处理器模式 | 执行低地址 | 执行高地址 |
---|---|---|---|
复位异常 | 特权模式 | 0x00000000 | 0xFFFF0000 |
未定义指令异常 | 未定义指令中止模式 | 0x00000004 | 0xFFFF0004 |
软中断异常 | 特权模式 | 0x00000008 | 0xFFFF0008 |
预取异常 | 数据访问中止模式 | 0x0000000C | 0xFFFF000C |
数据异常 | 数据访问终止模式 | 0x00000010 | 0xFFFF0010 |
外部中断异常 | 外部中断请求模式 | 0x00000018 | 0xFFFF0018 |
快速中断异常 | 快速中断请求模式 | 0x0000001C | 0xFFFF001C |
答: ARM、Thumb(如果是三种状态的话是 ARM、Thumb、ThumbEE)
答:有40个32位寄存器
答:输出 和 输入
答:1位、1.5位、2位
答:GBLA、LCLS