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[1:0]=00):

00:模拟输入模式

01:浮空输入模式(复位后的状态)

10:上拉/下拉输入模式

11:保留

在输出模式(MODE[1:0]>00):

00:通用推挽输出模式

01:通用开漏输出模式

10:复用功能推挽输出模式

11:复用功能开漏输出模式

假如: LED连接在GPIOC_Pin_13, 设置对应的寄存器

使用的寄存器是: GPIOC_CRH

MOD位为: GPIOC_CRH[21:20]  == 11

CNF位为: GPIOC_CRH[23:22]  == 00

数据寄存器IDR或者ODR的每一位对应一个引脚的输入或者输出数据

比如: LED要亮

   要设置GPIOC_ODR[13] = 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[21:20]  == 11

CNF位为: GPIOC_CRH[23:22]  == 00

比如: LED要亮

   要设置GPIOC_ODR[13] = 0

实时时钟寄存器基础地址: 0x4002 1000

APB2 外设时钟使能寄存器(RCC_APB2ENR) 偏移地址:0x18 -- 0x4002 1018

   GPIOC的时钟使用RCC_APBENR的bit[4], 为1使能,为0失能





 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值