文章目录
1. ARM架构
ARM架构(Advanced RISC Machines)是目前最为广泛使用的微处理器架构之一,广泛应用于移动设备、嵌入式系统、物联网设备等领域。
1. ARM架构的基本特点
RISC(精简指令集计算机)架构
- 简化指令集:ARM采用RISC架构,具有简化的指令集,每条指令通常在一个时钟周期内完成。
- 高效能比:RISC架构使得ARM处理器在同等功耗下,具有较高的性能和能效比。
寄存器数量多
- 通用寄存器:ARM处理器通常具有16个通用寄存器(R0-R15),这些寄存器用于存储操作数和中间结果。
- 专用寄存器:包括程序计数器(PC)、堆栈指针(SP)和链接寄存器(LR)等。
负载/存储架构
- Load/Store架构:所有的数据处理指令只能在寄存器之间进行,访问内存的操作通过专门的Load和Store指令完成。
条件执行
- 条件指令:ARM处理器的大多数指令都可以根据条件执行,这减少了分支指令的数量,提高了代码效率。
低功耗设计
- 低功耗特性:ARM处理器设计注重低功耗,这使得其非常适合移动设备和电池供电的嵌入式系统。
ARM架构的主要版本
ARMv4
- ARM7TDMI:这是早期的ARM架构版本,支持32位指令集,应用于许多早期的嵌入式系统。
ARMv5
- ARM9:引入了一些性能优化和新指令,改进了指令流水线,提高了处理性能。
ARMv6
- ARM11:进一步改进了指令集和流水线性能,增加了对多媒体指令集的支持。
ARMv7
- Cortex-A系列:面向高性能应用,如智能手机和平板电脑。
- Cortex-R系列:面向实时处理应用,如汽车电子和工业控制。
- Cortex-M系列:面向低功耗、低成本应用,如微控制器和物联网设备。
ARMv8
- Cortex-A53/A57:支持64位处理,提高了性能和内存寻址能力,广泛应用于高性能计算领域。
2. ARM处理器程序运行的过程
ARM芯片属于精简指令集计算机(RISC:Reduced Instruction Set Computing),其指令集设计比较简单,具有以下特点:
-
对内存只有读、写指令:
- ARM处理器的指令集设计非常简化,主要通过读写指令与内存进行交互。所有的运算都是在寄存器中完成的,只有数据的读取和写入才会涉及内存访问。
-
对数据的运算是在CPU内部实现:
- 数据的所有运算都在CPU的寄存器中进行,这样可以提高运算速度,因为寄存器的访问速度远高于内存。
-
使用RISC指令的CPU复杂度小,易于设计:
- 由于指令集简单,RISC架构的CPU设计相对较为简易,能够实现更高的性能和能效。
3. 示例
为了更好地理解ARM处理器的工作过程,我们来看一个简单的加法运算:a = a + b
。这个运算需要经过以下4个步骤才能实现:
-
读取 a 的值:读指令从内存中读取变量
a
的值,并将其存储到CPU的寄存器中。 -
读取 b 的值:读指令从内存中读取变量
b
的值,并将其存储到CPU的另一个寄存器中。 -
执行加法运算:CPU执行加法指令,将寄存器中存储的
a
和b
的值相加,并将结果存储到另一个寄存器中。 -
写入结果:写指令将加法运算的结果从寄存器写回内存中,存储在变量
a
的位置。
继续深入分析ARM处理器的操作过程。
内部寄存器和ALU
- 寄存器(R0-R15):ARM处理器内部包含多个通用寄存器,用于存储操作数和中间结果。
- 算术逻辑单元(ALU):用于执行算术和逻辑运算,如加法、减法、逻辑与或非等操作。
假设我们有两个变量 a
和 b
,它们的初始值分别为 0x12
和 0x34
。我们需要将这两个值相加,并将结果存储回变量 a
中。
指令执行步骤
- 从内存读取a的值到寄存器R0
- 从内存读取b的值到寄存器R1
- 将寄存器R0和R1中的值相加,结果存储在寄存器R0
- 将寄存器R0中的结果写回内存中的变量a
对应的ARM汇编指令如下:
- LDR R0, [a]:加载变量
a
的值到寄存器R0
- LDR R1, [b]:加载变量
b
的值到寄存器R1
- ADD R0, R0, R1:将
R0
和R1
中的值相加,结果存储在R0
- STR R0, [a]:将
R0
中的结果存储回内存中的变量a
3. 基于ARM架构的STM32单片机
STM32单片机是基于ARM Cortex-M系列内核的微控制器,广泛应用于嵌入式系统中。以下是对STM32单片机基础知识的详细介绍,包括运行模式、寄存器组等。
1. 运行模式
ARM Cortex-M内核支持多种运行模式,这些模式用于处理不同的操作需求。主要包括:
1.1 Thread Mode(线程模式)
- 描述:这是正常的执行模式,通常用于执行主程序和任务。
- 进入方式:复位时,处理器进入线程模式;通过异常返回指令(如
BX LR
)也可以进入线程模式。 - 特性:在此模式下,CPU可以运行主程序和一般的应用代码。
1.2 Handler Mode(处理模式)
- 描述:用于处理异常和中断。
- 进入方式:当中断或异常发生时,处理器自动进入处理模式。
- 特性:在此模式下,CPU处理中断服务程序(ISR)和异常处理程序。
2. 寄存器组
ARM Cortex-M内核包含一组通用寄存器和专用寄存器,用于数据存储和控制操作。
2.1 通用寄存器
- R0-R12:通用工作寄存器,用于数据运算和临时存储。
- R13(SP, Stack Pointer):堆栈指针,指向当前堆栈顶。
- MSP(Main Stack Pointer):主堆栈指针,复位后默认使用。
- PSP(Process Stack Pointer):进程堆栈指针,用于线程模式下的进程堆栈。
- R14(LR, Link Register):链接寄存器,存储子程序返回地址。
- R15(PC, Program Counter):程序计数器,指向当前执行指令的地址。
2.2 特殊功能寄存器
- xPSR(Program Status Register):程序状态寄存器,包含程序状态、当前异常号等信息。
- PRIMASK:中断屏蔽寄存器,控制全局中断的屏蔽。
- FAULTMASK:故障屏蔽寄存器,控制所有故障中断的屏蔽。
- BASEPRI:基优先级寄存器,用于设置中断屏蔽的基优先级。
- CONTROL:控制寄存器,控制堆栈指针的选择和特权级别。
3. STM32的基本结构
STM32单片机内部结构包含多个功能模块,每个模块通过总线互连,实现复杂的嵌入式应用。
3.1 内核(Core)
- Cortex-M内核:负责指令执行和处理任务。
- NVIC(Nested Vectored Interrupt Controller):嵌套向量中断控制器,管理和处理中断请求。
3.2 存储器(Memory)
- Flash存储器:用于存储程序代码和常量数据。
- SRAM(Static RAM):用于存储临时数据和变量。
- EEPROM(仅部分型号支持):用于存储需要掉电保持的数据。
3.3 外设(Peripherals)
- GPIO(General-Purpose Input/Output):通用输入输出接口,用于控制和读取外部设备。
- USART/UART:通用同步/异步收发器,用于串行通信。
- SPI/I2C:串行外设接口和I2C接口,用于与其他设备进行同步通信。
- ADC/DAC:模数转换器和数模转换器,用于模拟信号的处理。
- Timers:定时器,用于定时、计数、PWM输出等。
4. STM32的运行模式
4.1 运行模式(Run Mode)
- 正常的工作模式,CPU和所有外设正常工作。
- 功耗相对较高,适用于处理主要任务和高性能应用。
4.2 睡眠模式(Sleep Mode)
- CPU停止工作,但外设和中断系统继续运行。
- 降低功耗,适用于需要快速响应的低功耗应用。
4.3 停止模式(Stop Mode)
- 停止大部分外设和时钟,仅保留最低功耗的部分模块。
- 极大降低功耗,适用于需要较长时间休眠的应用。
4.4 待机模式(Standby Mode)
- 关闭所有外设和时钟,仅保留少量低功耗模块。
- 最低功耗模式,适用于长时间休眠的应用。
4. 寄存器组详解
在STM32单片机中,ARM Cortex-M内核的寄存器组主要包括通用寄存器、专用寄存器、程序状态寄存器等。以下是对这些寄存器的详细介绍:
1. 未备份寄存器
未备份寄存器指的是在所有运行模式下都共享的寄存器。这些寄存器包括 R0
到 R7
,它们在不同的模式下没有独立的备份,因此在模式切换时其数据可能会被破坏。
- R0-R7:通用工作寄存器,用于数据运算和临时存储。
2. 备份寄存器
备份寄存器在不同的模式下有独立的物理寄存器,确保在模式切换时数据不会被破坏。STM32单片机中常见的备份寄存器包括:
- R8-R12:在快速中断模式(FIQ)下,这些寄存器有独立的备份,以保证快速中断处理的效率。
- R13(SP, Stack Pointer):堆栈指针,有多个物理寄存器对应不同的模式,确保堆栈数据的安全。
- R14(LR, Link Register):链接寄存器,存储子程序返回地址。不同模式下也有独立的备份。
例如,在FIQ模式下,R8_fiq
到 R12_fiq
是独立的,其他模式下则共享相应的寄存器。
3. 程序计数器
**程序计数器(PC, Program Counter, R15)**保存着当前执行指令的地址值。Cortex-M内核是三级流水线设计,取指令、译码、执行,循环执行。
- R15(PC):当前执行指令地址 + 8 个字节。
- 例如,当正在执行第一条指令的同时,也在取第二条指令和译码第三条指令。R15总是指向当前正在执行的指令地址加8个字节。
4. 程序状态寄存器
**程序状态寄存器(PSR)**包括当前程序状态寄存器(CPSR)和备份程序状态寄存器(SPSR)。
- CPSR:当前程序状态寄存器,包含条件标志位、中断禁用位、当前执行模式标志等。
- SPSR:备份程序状态寄存器,特定异常中断发生时,用于保存CPSR的值,当异常退出时恢复。
所有运行模式都共用一个CPSR物理寄存器,因此在模式切换时,需要通过SPSR来保存和恢复状态。
5. CPSR和SPSR寄存器
在STM32单片机中,ARM Cortex-M内核的程序状态寄存器(PSR)包含当前程序状态寄存器(CPSR)和备份程序状态寄存器(SPSR)。以下是对这些寄存器的详细解释。
1. CPSR和SPSR寄存器结构
CPSR(Current Program Status Register)寄存器保存了当前的程序状态,包括条件标志、中断屏蔽位、当前执行模式等。SPSR(Saved Program Status Register)寄存器用于在发生异常时保存CPSR的值,以便在异常返回时恢复。
CPSR和SPSR寄存器的结构如下:
位 | 标志位 | 描述 |
---|---|---|
31 | N | 负数标志,结果为负时置1 |
30 | Z | 零标志,结果为零时置1 |
29 | C | 进位标志,加法操作中结果产生进位时置1,减法操作中结果产生借位时置0 |
28 | V | 溢出标志,带符号数运算结果溢出时置1 |
27 | Q | 只有在ARM v5TE架构支持,累积/饱和标志 |
26-25 | IT[1:0] | 与IT[7:2]一起组成IT[7:0],作为IF-THEN指令执行状态标志位 |
24 | J | 控制指令执行状态,表明本指令是ARM指令还是Thumb指令(Jazelle模式) |
23-20 | Reserved | 保留位 |
19-16 | GE[3:0] | SIMD指令有效,大于或等于 |
15-10 | Reserved | 保留位 |
9 | E | 大小端控制位,E=1/0表示大/小端模式 |
8 | A | 禁止异步中断位,A=1表示禁止异步中断 |
7 | I | 禁止IRQ中断位,I=1表示禁止IRQ中断 |
6 | F | 禁止FIQ中断位,F=1表示禁止FIQ中断 |
5 | T | 控制指令执行状态,表明本指令是ARM指令还是Thumb指令 |
4-0 | M[4:0] | 运行模式控制位,表示当前处理器的运行模式 |
J(bit 24)和T(bit 5):控制指令执行状态
- 表明这个指令是ARM指令还是Thumb指令。
J | T | 描述 |
---|---|---|
0 | 0 | ARM |
0 | 1 | Thumb |
1 | 1 | ThumbEE |
1 | 0 | Jazelle |
M[4:0](bit 4-0):运行模式控制位
- 表示当前处理器的运行模式。
M[4:0] | 运行模式 |
---|---|
10000 | User 模式 |
10001 | FIQ 模式 |
10010 | IRQ 模式 |
10011 | Supervisor (SVC) 模式 |
10110 | Monitor (MON) 模式 |
10111 | Abort (ABT) 模式 |
11010 | Hyp (HYP) 模式 |
11011 | Undef (UND) 模式 |
11111 | System (SYS) 模式 |
CPSR和SPSR寄存器在ARM Cortex-M内核中扮演重要角色,用于保存和恢复程序状态。理解这些寄存器的结构和作用,可以更好地控制STM32单片机的运行模式和中断处理。通过详细掌握CPSR寄存器中的标志位和控制位,可以提高系统的可靠性和运行效率。