文章目录
1. ARM架构
2. ARM处理器程序运行的过程
3. 示例
3. 基于ARM架构的STM32单片机
1. 运行模式
2. 寄存器组
3. STM32的基本结构
4. STM32的运行模式
4. 寄存器组详解
1. 未备份寄存器
2. 备份寄存器
3. 程序计数器
4. 程序状态寄存器
5. CPSR和SPSR寄存器
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寄存器中的标志位和控制位,可以提高系统的可靠性和运行效率。