笑看天下无敌手 发表于 2024-8-26 13:55:37

ARM体系架构

ARM体系架构
1. 指令系统
RISC: 精简指令集指令系统  -- ARM
   寻址方式: 寻址方式比较少(10种以内)
   指令会合指令的条数: 100条左右
   大的、统一的寄存器文件;
   装载/保存结构(Load/Store),数据处理操纵只针对寄存器的内容,而不直接对存储器举行操纵;
   统一和固定长度的指令域,简化了指令的译码,便于指令流水线设计。 -- 大多数指令的执行时间是相称的
CISC: 复杂指令集指令系统  -- X86, 51
   寻址方式: 寻址方式比较多(10种以上)
   指令会合指令的条数

2. ARM中数据类型
字节数据: 1byte
半字数据: 2byte
字数据: 4byte

3. 字节对齐和符号位扩展
struct T1
{
   char c;
   int n;
};  //字节对齐

struct T2
{
   char c1:2;
   char c2:3;
   char c3:2;
   int n:6;
};
struct T2 t;
t.c1 = 3;
printf("%d\n", t.c1);  //-1

 
4. 寄存器
ARM处理器有37个寄存器,在不同处理器运行模式下使用的寄存器是不完全同等的
所有的37个寄存器,分成两大类:31个通用32位寄存器;6个状态寄存器。
其中R0~R7为未分组的寄存器,也就是说对于任那边理器模式,这些寄存器都对应于雷同的32位物理寄存器。
寄存器R8~R14为分组寄存器。它们所对应的物理寄存器取决于当前的处理器模式,几乎所有允许使用通用寄存器的指令都允许使用分组寄存器
寄存器R8~R12有两个分组的物理寄存器。一个用于除FIQ模式之外的所有寄存器模式,另一个用于FIQ模式。如许在发生FIQ中断后,可以加快FIQ的处理速度。
R13: 堆栈指针SP -- 指向堆栈栈顶位置的指针(指向栈顶元素或者栈顶插入位置)
R14: 链接寄存器LR -- 作为子程序(函数)返回用
  R14为链接寄存器(LR),在结构上有两个特殊功能:
  在每种模式下,模式自身的R14版本用于保存子程序返回地址;(跳转到函数之前的位置)
  当发生异常时,将R14对应的异常模式版本设置为异常返回地址(有些异常有一个小的固定偏移量)。
R15: 程序计数器PC
  它指向正在取指的地址。 -- 下一条要执行的指令的位置

程序状态寄存器: CPSR
  运算的结果: NZCV
     N: 符号位
     Z: 零位
     C: 进位/借位位
     V: 溢出

5. 异常
异常(Exception)是指任何打断处理器正常执行,而且迫使处理器进入一个由有特权的特殊指令执行的变乱。
异常可分为4类:中断(interrupt)、陷井(trap)、故障(fault)和终止(abort)
上下文切换:
a. 将CPSR保存到对应的SPSR  -- 状态寄存器的保护
b. 将当前程序中使用的数据举行压栈 -- 数据保护
c. 将返回地址(当前的PC值)保存到LR中 -- 返回位置
d. 将切换的入口地址(中断向量)赋值给PC -- 实现跳转

异常返回(中断、函数调用竣事、内循环挑战到外循环):
a. 将SPSR恢复到CPSR中 -- 状态恢复
b. 数据栈中的数据弹栈 -- 数据恢复
c. 将LR赋值给PC  -- 返回

 
6. ATPCS
过程调用尺度ATPCS(ARM-Thumb Produce Call Standard)规定了子程序间相互调用的根本规则, ATPCS规定子程序调用过程中寄存器的使用规则、数据栈的使用规则及参数的传递规则。
寄存器使用规则:
R0-R3: 函数调用时的参数寄存器,用来存放前4个函数参数并存放返回值。在函数内如果将这些寄存器用作其他用途,将破坏其值。R0还作为函数的返回值
R4-R11: 通用变量寄存器(一般使用得比较多的是R4-R8)
R12: IP, 临时过渡寄存器,函数调用时会破坏其值

 
STM32的使用
常用资源:
ADC: 模拟/数字转换控制 -- 模拟传感器的使用
DAC: 数字/模拟转换控制
USART: 串行口 -- 调试、串口装备(蓝牙)
串行总线接口: SPI, IIC, CAN
定时器TIM
EXTI: 外部中断
GPIO: 通用IO口 -- 开关信号的输入输出
RTC: 及时时钟 -- 日历,时钟

STM32的引脚绝大多数都是复勤奋能引脚(一个引脚可以配置为不同的作用)
AMBA片上总线:已成为一种流行的工业片上总线尺度。它包括AHB(Advanced High performance Bus)和APB(Advanced Peripheral Bus ),前者作为系统总线,后者作为外设总线。
外设总线:包括APB1(Advanced Peripheral Bus 1) -- 低速
        和APB2(Advanced Peripheral Bus 2)  -- 高速

   要使用任何外部装备起首必须该外部装备对应的时钟系统是启动的

最小系统: STM32F103C8T6小系统板,主要由单片机、晶振电路、复位电路几部门构成,板载的资源能满足举行单片机GPIO,ADC,RTC,USART,IIC,SPI,USB数据通信等实验。

GPIO口的使用:
a. 要控制一个装备,起首必须先使能该装备对应的端口的时钟系统
b. 配置端口: 设置工作模式(输入、输出...), 设置工作属性(输出的速度...)
   端口的配置是通过端口寄存器来举行的
   端口: PA, PB, PC, ...
   引脚: 每一个端口理论上有16个引脚,Pin_0 ~ Pin_15
   每一个端口通过7个端口寄存器来举行设置(对于简单的设置一般只使用2~3个端口寄存器就可以了)
   ①两个32位的配置寄存器(GPIOx_CRL,GPIOx_CRH) -- 一个配置寄存器管理8个引脚(一个引脚通过配置寄存器的四位来举行设置)
   (GPIOx_CRL) (x=A..G): GPIOx configuration register low, GPIOx端口低配置寄存器,用于配置GPIOx端口的第0位~第7位。
   (GPIOx_CRH) (x=A..G): GPIOx configuration register high, GPIOx端口低配置寄存器,用于配置GPIOx端口的第8位~第15位。
   ②两个32位的数据寄存器(GPIOx_IDR,GPIOx_ODR) -- 每一个引脚对应数据寄存器中的一位
   (GPIOx_IDR) (x=A..G): GPIOx  input data register -- 输入数据寄存器
   (GPIOx_ODR) (x=A..G): GPIOx  output data register -- 输出数据寄存器
   ③一个32位的置位/复位寄存器 (GPIOx_BSRR)
   (GPIOx_BSRR) (x=A..G): GPIOx bit set/reset register
   ④一个16位的复位寄存器(GPIOx_BRR)
   ⑤一个32位的锁定寄存器(GPIOx_LCKR)
   (GPIOx_LCKR) (x=A..G): GPIOx configuration lock register
一般情况下,对于输入引脚的操纵通过CPIOx_CRL或者GPIOx_CRH、GPIOx_IDR就可以了;
对于输出引脚的操纵通过CPIOx_CRL或者GPIOx_CRH、GPIOx_ODR就可以了

输入引脚的工作模式: 浮空输入、上拉输入、下拉输入和模拟输入
输出引脚的工作模式: 推挽输出、开漏输出、复用推挽输出、复用开漏输出(最大输出速度有10MHz,2MHz和50MHz三种)

端口配置寄存器:
端口配置低寄存器(GPIOx_CRL)(x=A..G)
端口配置高寄存器(GPIOx_CRH) (x=A..G)
每一个引脚的配置使用寄存器的4位,包罗两位Mod位和两位CNF位
MODE位:
00:输入模式(复位后的状态)
01:输出模式,最大速度10MHz
10:输出模式,最大速度2MHz
11:输出模式,最大速度50MHz

CNF位:
在输入模式(MODE=00):
00:模拟输入模式
01:浮空输入模式(复位后的状态)
10:上拉/下拉输入模式
11:保存
在输出模式(MODE>00):
00:通用推挽输出模式
01:通用开漏输出模式
10:复勤奋能推挽输出模式
11:复勤奋能开漏输出模式

假如: LED连接在GPIOC_Pin_13, 设置对应的寄存器
使用的寄存器是: GPIOC_CRH
MOD位为: GPIOC_CRH  == 11
CNF位为: GPIOC_CRH  == 00

数据寄存器IDR或者ODR的每一位对应一个引脚的输入或者输出数据
比如: LED要亮
   要设置GPIOC_ODR = 0

寄存器地址计算:
GPIOA: 0x4001 0800 - 0x4001 0BFF
   GPIOA_CRL: 0x4001 0800
   GPIOA_CRH: 0x4001 0804
   GPIOA_IDR: 0x4001 0808
   GPIOA_ODR: 0x4001 080C
GPIOB: 0X4001 0C00 - 0x4001 0FFF
   GPIOB_CRL: 0X4001 0C00
   GPIOB_CRH: 0X4001 0C04
   GPIOB_IDR: 0X4001 0C08
   GPIOB_ODR: 0X4001 0C0C
GPIOC: 0x4001 1000 - 0x4001 13FF
   GPIOC_CRL: 0x4001 1000
   GPIOC_CRH: 0x4001 1004
   GPIOC_IDR: 0x4001 1008
   GPIOC_ODR: 0x4001 100C
假如: LED连接在GPIOC_Pin_13, 设置为通用推挽输出,最高速度50MHz,控制LED亮
使用的寄存器是: GPIOC_CRH
MOD位为: GPIOC_CRH  == 11
CNF位为: GPIOC_CRH  == 00
比如: LED要亮
   要设置GPIOC_ODR = 0

及时时钟寄存器底子地址: 0x4002 1000
APB2 外设时钟使能寄存器(RCC_APB2ENR) 偏移地址:0x18 -- 0x4002 1018
   GPIOC的时钟使用RCC_APBENR的bit, 为1使能,为0失能




 

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
页: [1]
查看完整版本: ARM体系架构