嵌入式与微机原理总复习

嵌入式与微机原理总复习复习大纲1. 概述1.1. 计算机的发展简史1.1.1. 计算机的诞生1.1.2. 现代计算机发展历程1.1.3. 计算机的类型1.2. 计算机系统的组成1.2.1. 计算机硬件1.2.1.1. 存储器1.2.1.2. 运算器1.2.1.3. 控制器1.2.1.4. 输入设备1.2.1.5. 输入设备1.2.1.6. 适配器1.2.1.7. 总线1.2.2. 计算机软件1.2.2.1. 计算机软件分类1.2.2.2. 计算机软件的发展1.3. 计算机中数的表示方法1.3.1. 进位计数制1.3.2. 有符号数的原码、反码和补码表示1.3.3. 定点数和浮点数1.3.4. 其他信息编码1.4. 嵌入式系统简介1.4.1. 嵌入式系统的基本概念1.4.2. 嵌入式系统的硬件1.4.3. 嵌入式系统软件1.4.4. 嵌入式系统的发展概况1.4.5. 典型嵌入式处理器简介2. 计算机系统的基本结构与工作原理2.1. 计算机系统的基本结构与组成2.1.1. 计算机的层次模型2.1.2. 基于冯诺依曼架构的模型机系统结构2.2. 模型机存储器子系统2.2.1. 存储器的组织和地址2.2.2. 字的对齐——对准存放2.2.3. 小端格式和大端格式2.2.4. 存储器操作2.2.5. 存储器的分级2.3. 模型机CPU子系统2.3.1. 运算器2.4.2. 控制器2.4.3. 寄存器阵列2.4.4. 地址与数据缓冲器2.4.5. 数据通道2.4. 模型机指令集和指令执行过程2.4.1. 模型机指令集2.4.2. 指令周期2.4.3. 模型机指令执行流程2.5. 计算机体系结构的改进2.5.1. CISC和RISC2.5.1. 流水线技术2.5.3. 超标量处理器和多发射技术2.5.4. 超线程处理器2.5.5. 多处理器计算机和多计算机系统2.5.6. 多核处理器2.6. Intel x86典型微处理器简介2.6.1. Intel 8086处理器2.6.2. Intel Pentium处理器2.7. ARM嵌入式处理器简介2.7.1. ARM体系结构、ARM处理器和ARM内核2.7.2. ARM处理器的特点2.7.3. 典型ARM内核的基本结构2.8. 计算机性能评测2.8.1. 定性描述指标2.8.2. 定量指标描述3. 存储器系统3.1. 概述3.1.1. 存储器的类型及特点3.1.1.1. 半导体存储器3.1.1.2. 磁介质存储器3.1.1.3. 光存储器3.1.2. 微机系统的存储体系架构3.1.3. 辅助存储器主要接口标准3.2. 半导体存储芯片的基本结构和性能指标3.2.1. 随机存取存储器RAM3.2.2. 只读存储器ROM3.2.3. 存储芯片的性能指标3.3. 内存条性能的改进3.3.1. 内存条的组成3.3.2. 内存条的演变3.4. 存储系统的层次架构3.4.1. 存储系统的分层管理3.4.2. 虚拟存储器与地址映射3.5. 高速缓冲存储器Cache3.5.1. 高速缓冲存储器Cache的原理3.5.2. 高速缓冲存储器Cache的基本结构3.5.3. 地址映射与转换3.5.4. Cache更新与替换策略3.5.5. 影响Cache性能的因素3.6. 存储器系统设计3.6.1. 主存储器系统设计技术3.6.2. 存储器系统扩展方式3.6.3. 嵌入式存储器系统设计4. 总线和接口4.1. 总线技术4.1.1. 总线技术概述4.1.1.1. 总线的概念4.1.1.2. 总线的分类4.1.1.3. 总线的结构4.1.2. 总线仲裁4.1.2.1. 集中式仲裁4.1.2.2. 分布式仲裁4.1.3. 总线操作与时序4.1.3.1. 同步总线时序4.1.3.2. 异步总线时序4.1.3.3. 半同步总线时序4.1.3.4. 周期分裂式时序4.2. 片内总线AMBA4.2.1. AMBA总线概述4.2.2. AHB总线4.2.2.1. AHB系统的构成4.2.2.2. AHB信号定义4.2.2.3. AHB的数据传输过程及“流水线”4.2.2.4. AHB的突发传输4.2.2.5. AHB的译码4.2.2.6. AHB的仲裁4.2.2.7. AHB主机接口及时序参数4.2.2.8. AHB从机接口及流水线分离4.2.3. AXI总线4.3. 系统总线/外部总线4.3.1. PCI4.3.2. PCI Express4.3.3. USB4.3.4. 典型的计算机总线系统4.4. 输入/输出接口4.4.1. 输入/输出接口概述4.4.1.1. I/O接口的功能4.4.1.2. I/O接口的分类4.4.1.3. I/O接口规范的常规内容4.4.1.4. I/O接口的结构4.4.1.5. I/O端口编址4.4.2. 输入/输出接口的数据传送方式4.4.2.1. 无条件传送方式4.4.2.2. 查询传送方式4.4.2.3. 中断传送方式4.4.2.4. 直接存储器访问(DMA)方式4.4.3. 并行接口4.4.3.1. 无握手信号的并行接口4.4.3.2. 带握手信号的并行接口4.4.3.3. 可编程并行接口(GPIO)4.4.4. 串行接口4.4.4.1. 串行接口概述4.4.4.2. 异步串行接口4.4.4.3. I2C接口及总线4.4.4.4. SPI接口及总线5. ARM处理器体系结构和编程模型5.1. ARM体系结构与ARM处理器概述5.1.1. 指令集体系结构与微架构5.1.2. ARM处理器体系结构简介5.1.3. ARM处理器主要产品系列简介5.1.3.1. ARM处理器的特点5.1.3.2. ARM处理器相关产品的层次关系5.1.3.3. ARM处理器产品命名规则5.1.3.4. ARM7系列5.1.3.5. ARM9系列5.1.3.6. ARM11系列5.1.3.7. Cortex-A5.1.3.8. Cortex-R5.1.3.9. Cortex-M5.2. Cortex-M3/M4处理器结构5.2.1. Cortex-M3/M4处理器概述及指令集架构5.2.1.1. Cortex-M3/M4主要特性5.2.1.2. Cortex-M3/M4所支持的指令集5.2.2. Cortex-M3/M4处理器结构5.2.2.1. 内核5.2.2.2. 处理器5.2.2.3. 处理器系统5.2.3. 存储器管理5.2.3.1. 存储器管理特性5.2.3.2. 存储器映射5.2.4. 总线系统5.2.4.1. 总线系统结构5.2.4.2. 各类总线的连接对象5.2.5. 异常与中断处理5.2.5.1. 嵌套向量中断控制器NVIC5.2.5.2. 中断向量表5.2.5.3. 系统节拍定时器SysTick5.3. Cortex-M3/M4的编程模型5.3.1. 操作状态与操作模式5.3.1.1. 操作状态5.3.1.2. 操作模式和特权等级5.3.2. 常规寄存器5.3.2.1. 通用寄存器:R0~R125.3.2.2. 栈指针:R135.3.2.3. 链接寄存器:R145.3.2.4. 程序计数器:R155.3.3. 特殊寄存器5.3.3.1. 程序状态寄存器5.3.3.2. 三个中断屏蔽寄存器5.3.3.3. CONTROL寄存器5.3.3.4. 系统控制块SCB5.3.4. 堆栈结构5.3.4.1. 堆栈的作用和堆栈类型5.3.4.2. Cortex-M处理器的堆栈模型5.3.4.3. Cortex-M3/M4处理器中的双堆栈5.4. Cortex-M处理器存储系统5.4.1. 存储器映射5.4.2. 连接存储器和外设5.4.3. 存储器的端模式5.4.4. 非对齐数据的访问5.4.5. 位段操作5.4.5.1. 位段与位段别名5.4.5.2. 位段操作的优点5.4.5.3. C程序实现位段操作5.4.6. 存储器访问权限5.4.7. 存储器访问属性5.4.8. 排他访问5.4.9. 存储器屏障5.4.10. MCU中的存储器系统5.5. Cortex-M处理器的异常处理5.5.1. Cortex-M异常管理模型5.5.1.1. 异常类型5.5.1.2. 异常状态5.5.1.3. 异常处理程序5.5.1.4. 异常向量表5.5.1.5. 异常的优先级5.5.1.6. 中断优先级分组5.5.1.7. 异常流程5.5.2. 向量表重定位机制5.5.3. 中断请求和挂起5.5.4. NVIC寄存器5.5.4.1. 中断的使能和禁止5.5.4.2. 中断挂起和中断清除5.5.5. SCB寄存器6. ARM指令系统6.1. ARM处理器指令集概述6.1.1. ARM的不同指令集6.1.2. ARM指令集扩展6.2. T32指令格式6.2.1. 16比特指令二进制格式6.2.2. 32比特指令二进制格式6.2.3. T32指令的汇编语法6.2.4. T32的条件执行指令6.2.5. T32指令格式示例6.3. T32指令集寻址方式6.3.1. 立即数寻址6.3.2. 寄存器寻址6.3.3. 寄存器间接寻址6.3.4. 寄存器移位寻址6.3.5. 寄存器偏移寻址6.3.6. 前变址寻址6.3.7. 后变址寻址6.3.8. 多寄存器寻址6.3.9. 堆栈寻址6.3.10. PC相对寻址6.4. Cortex-M3/M4指令集6.4.1. 处理器内的数据传送指令6.4.2. 存储器访问指令6.4.3. 算术运算指令6.4.4. 逻辑运算指令6.4.5. 移位运算6.4.6. 数据格式转换6.4.7. 位域处理指令6.4.8. 比较和测试指令6.4.9. 程序流控制指令6.4.9.1. 无条件跳转和函数调用指令6.4.9.2. 条件跳转6.4.9.3. 比较和跳转6.4.9.4. 条件执行6.4.9.5. 按跳转表跳转6.4.10. 饱和运算6.4.11. 其他杂项指令6.4.11.1. 休眠模式指令6.4.11.2. 异常相关指令6.4.11.3. 空指令和断电指令6.4.12. Cortex-M4特有指令7. ARM程序设计7.1. ARM程序开发环境7.1.1. 常用ARM程序开发环境7.1.2. MDK开发环境简介7.2. ARM汇编程序中的伪指令7.2.1. 符号定义伪指令7.2.2. 数据定义伪指令7.2.3. 汇编控制伪指令7.2.4. 其他常用的伪指令7.2.5. 汇编语言中常用的符号7.2.6. 汇编语言中常用运算符和表达式 7.3. ARM汇编语言程序设计7.3.1. ARM汇编语言的语句格式7.3.2. ARM汇编语言程序结构7.3.3. ARM汇编程序设计实例7.4. ARM汇编语言与C/C++的混合编程7.4.1. C语言与汇编语言之间的函数调用7.4.2. C/C++语言与汇编语言的混合编程8. 基于ARM微处理器硬件与软件系统设计开发8.1. 嵌入式硬件与软件系统设计与开发综述8.1.1. 概述8.1.2. 嵌入式生态系统8.1.3. 开发环境、开发工具和调试方式8.1.4. 嵌入式系统开发过程8.2. ARM内核常用微处理器8.2.1. 三星S3C2440A8.2.2. 恩智浦LPC21328.2.3. 意法半导体STM328.3. 最小硬件系统8.3.1. 微处理器最小硬件系统8.3.2. S3C2440A最小硬件系统8.3.3. STM32最小硬件系统8.3.4. MCU及其周围电路设计8.3.4.1. 电源电路8.3.4.2. 复位电路8.3.4.3. 时钟电路8.3.4.4. 调试和下载电路8.3.4.5. 启动电路8.3.4.6. 启动代码和启动过程8.4. 嵌入式软件系统设计8.4.1. 系统结构及工作流程8.4.2. 嵌入式操作系统8.4.3. 程序开发模式8.4.4. 软件开发流程8.5. ARM中的GPIO8.5.1. 概述8.5.2. 工作原理8.5.2.1. 内部结构8.5.2.2. 工作模式8.5.2.3. 输出速度8.5.2.4. 复用功能重映射8.5.2.5. 外部中断映射和事件输出8.5.2.6. STM32F10x的GPIO主要特性8.5.3. 相关库函数及寄存器8.5.3.1. 库函数8.5.3.2. 常用寄存器8.5.3.3. AFIO寄存器8.5.4. 应用与举例8.6. 定时器8.6.1. 概述8.6.2. 基本定时器TIM6和TIM78.6.2.1. 内部结构8.6.2.2. 时钟源8.6.2.3. 计数模式8.6.2.4. 基本工作原理8.6.2.5. 主要特性8.6.3. 通用定时器TIM2~TIM58.6.3.1. 内部结构8.6.3.2. 时钟源8.6.3.3. 计数模式8.6.3.4. 普通输入捕获模式8.6.3.5. PWM输入捕获模式8.6.3.6. 比较输出模式8.6.4. 高级定时器TIM1和TIM88.6.5. 主从模式、触发与同步8.6.5.1. 主从模式8.6.5.2. 触发8.6.5.3. 从模式下的工作模式8.6.5.4. 定时器级联及同步8.6.6. 相关库函数及寄存器8.6.6.1. 库函数8.6.6.2. 常用寄存器8.6.7. 小结及应用要点8.6.7.1. 定时器配置要点8.6.7.2. PWM程序实现步骤8.6.7.3. PWM程序实现的3个要点8.7. 中断控制器8.7.1. 中断系统综述8.7.1.1. 嵌套向量中断控制器NVIC8.7.1.2. 中断优先级8.7.1.3. 中断向量表8.7.1.4. 中断服务函数ISR8.7.1.5. 中断设置过程8.7.2. 外部中断/事件控制器EXTI8.7.2.1. 内部结构8.7.2.2. 工作原理8.7.3. 相关库函数及寄存器8.7.3.1. 库函数8.7.3.2. 常用寄存器8.7.4. 小结及应用要点8.8. USART8.8.1. 主要特性8.8.2. 内部结构8.8.3. USART中断8.8.4. 相关库函数及寄存器8.8.4.1. 库函数8.8.4.2. 常用寄存器8.8.5. 小结及应用要点8.8.5.1. 库函数开发STM32F103外设过程8.8.5.2. STM32F10x标准外设库函数的分类和命名8.8.5.3. USART配置的一般步骤8.8.5.4. 注意事项8.9. SPI8.9.1. SPI工作原理8.9.1.1. 主要特性8.9.1.2. 内部结构8.9.1.3. SPI主模式8.9.1.4. SPI从模式8.9.1.5. SPI状态标志和中断8.9.1.6. SPI发送/接收数据8.9.2. SPI相关库函数及寄存器8.9.2.1. 库函数8.9.2.2. 常用寄存器8.9.3. SPI小结与应用要点8.10. I2C8.10.1. I2C工作原理8.10.1.1 主要特性8.10.1.2. 内部结构8.10.1.3. I2C主/从模式8.10.1.4. I2C中断8.10.2. I2C相关库函数及寄存器8.10.2.1. 常用库函数8.10.2.2. 初始化结构体8.10.2.3. 典型库函数8.10.3. I2C小结及应用要点附录中英文术语对照表

复习大纲

1. 概述

1.1. 计算机的发展简史

1.1.1. 计算机的诞生

  1. 布莱兹·帕斯卡(Blaise Pasca):基于齿轮结构的机械加减法器

  2. 莱布尼茨(Gottfried Wilhelm Leibniz):可进行乘法、除法和自乘运算的机械计算器

  3. 查尔斯·巴贝奇(Charles Babbage):基于齿轮结构的差分机和分析机

  4. 阿兰·图灵(Alan Turing):图灵机

  5. 莫克利(John Mauchly)、艾克特(Eckert)团队:ENIAC(电子数字积分器和计算器)

    • 世界上第一台数字式电子计算机
  6. 冯诺依曼(Von Neumanm):EDVAC(离散变量自动电子计算机)

    • 确定计算机五个构成部分:运算器,控制器,存储器,输入设备,输出设备

    • 三方面重大改进

      • 二进制
      • 存储程序
      • 程序执行顺序可通过“条件转移”指令自动完成
  7. 莫里斯·威尔克斯(Maurice Wilkes):EDSAC

    • 第一台存储程序式电子计算机

1.1.2. 现代计算机发展历程

1.1.3. 计算机的类型

1.2. 计算机系统的组成

计算机硬件: 构成计算机的物理部件

计算机软件: 按特定顺序组织的指令和数据集合

1.2.1. 计算机硬件

1.2.1.1. 存储器

主存储器

辅助存储器


1.2.1.2. 运算器

1.2.1.3. 控制器

1.2.1.4. 输入设备

1.2.1.5. 输入设备

1.2.1.6. 适配器

1.2.1.7. 总线

1.2.2. 计算机软件

1.2.2.1. 计算机软件分类

按特定顺序组织的计算机数据和指令的集合,可分为:

系统软件

应用软件

中间件软件

1.2.2.2. 计算机软件的发展

1.3. 计算机中数的表示方法

1.3.1. 进位计数制

10进制

二进制

16进制 (两位16进制表示1字节)

位、字节、字和字长

1.3.2. 有符号数的原码、反码和补码表示

原码

反码

补码

1.3.3. 定点数和浮点数

1.3.4. 其他信息编码

BCD编码

ASCII码——美国信息交换标准代码

字符串表示方法

1.4. 嵌入式系统简介

1.4.1. 嵌入式系统的基本概念

1.4.2. 嵌入式系统的硬件

嵌入式微处理器 (EMPU)

嵌入式微控制器 (EMCU)

数字信号处理器 (DSP)

片上系统 (SOC)

1.4.3. 嵌入式系统软件

分为嵌入式操作系统和嵌入式应用软件

1.4.4. 嵌入式系统的发展概况

1.4.5. 典型嵌入式处理器简介

ARM

MIPS

2. 计算机系统的基本结构与工作原理

2.1. 计算机系统的基本结构与组成

2.1.1. 计算机的层次模型

分层目的:分析计算机各个部件之间的逻辑关系

层次模型发展历程

  1. 最初阶段:只有两层

    • 硬件层:逻辑电路
    • 软件层:指令系统

  2. 第二阶段:微程序 vs RISC

    • 微程序设计思想 → 三层模型

      • 一条指令可以分解为多个微操作
      • 微操作可以用微指令实现
      • 多条微指令组成微程序实现指令功能
      • 微程序存储在控制ROM中,执行时逐条读出完成微操作

    • 微程序

      • 微程序简化了控制器硬件,并可实现复杂指令

      • 增加新指令,引入新的寻址方式,导致

        • 芯片中的器件数量增加
        • 芯片功耗不断增大
        • 而计算机性能与电路规模不成比例
    • RISC

      • 二八定律

        • 80%的时间运行的是占总量不到20%的简单指令
        • 80%的任务是由占总量不到20%的电路完成的
      • 为提高性能,应该:

        • 减少指令数量,一条复杂指令用多条简单指令替代
        • 取消微程序,指令功能由硬件电路(硬核)实现
  3. 第三阶段:操作系统

    • 早期计算机没有操作系统,必须“手工”对计算机进行管理,如任务调度、内存管理、I/O控制等
    • 第一个真正的操作系统:1964年可运行在不同规格的IBM System/360系列大型机的OS/360
    • 操作系统负责管理计算机硬件资源和用户作业,提供了人机交互界面、多条用户命令和多种子程序调用接口,极大简化了计算机操作、管理的复杂性

  4. 第四阶段:编程语言

    • 使用各种语言编写的程序,必须经过相应的编译(或解释)程序进行处理后,计算机才能识别和执行

2.1.2. 基于冯诺依曼架构的模型机系统结构

结构特点

  1. 以CPU为核心(现代计算机逐步转化为以存储器为核心)
  2. 单总线系统(类似于快慢车道不分的混合式交通)
  3. 指令和数据使用同一条总线(冯诺依曼架构的主要缺陷)

2.2. 模型机存储器子系统

2.2.1. 存储器的组织和地址

计算机的分体结构

问题描述:若总线宽度为16位、32位或64位,CPU访问存储器时,为一次能够传输一个完整的字(2/4/8字节),或根据需要一次传送这个字中的一部分字节,应如何组织存储器和连接存储器与总线?

以32位模型机为例,总容量为232的存储器分成4个存储体,每个存储体为230,分别与32位数据总线按下图连接,每个存储体只需30条地址线,用字节选择信号进行选择

Intel 8086系统存储器的分体结构

Intel 8086数据总线位宽为16位,地址总线位宽为20位

2.2.2. 字的对齐——对准存放

2.2.3. 小端格式和大端格式

2.2.4. 存储器操作

计算机运行时所需的指令数据都存放在存储器中。一条指令在执行之前必须将这条指令完整地从存储器取出并传送到CPU中;指令执行时所需的操作数和操作结果有时也需要在CPU和存储器之间进行传送

两个最基本操作:读出和写入

读操作

写操作

连续数据读写

2.2.5. 存储器的分级

对存储器的要求:速度快、容量大、成本低

分级存储体系结构

2.3. 模型机CPU子系统

模型机CPU内部结构:

2.3.1. 运算器

基本组成

算术逻辑单元ALU:运算器的核心

累加器ACC:特殊寄存器

暂存器

标志寄存器:也称为程序状态寄存器

2.4.2. 控制器

整个CPU的指挥控制中心

功能和作用

根据指令中的操作码和时序信号,产生各种控制信号,对系统各个部件的工作过程进行控制,指挥和协调整个计算机有序地工作

控制器主要构成

指令寄存器IR

指令译码器ID

操作控制器OC

程序计数器PC

控制器的工作过程:

  1. 根据程序计数器的内容获取下一条指令的存放地址
  2. 通过总线从存储器中取出这条指令并存放到指令寄存器中(取指)
  3. 指令寄存器的输出直接接到指令译码器的输入
  4. 指令操作码送入到指令译码器,由指令译码器对操作码进行分析和译码,识别出应执行什么样的操作
  5. 操作控制器确定操作时序,产生所需的各种控制信号并发送到相关部件,控制这些部件完成指令规定的操作
  6. 地址生成部件根据指令特征将地址码转换成有效地址,送往地址缓冲器
  7. 对于转移指令,所生产的转移地址被转入程序计数器,实现程序的转移

微操作

控制器的实现方式

  1. 微程序控制器

    • 简介

      • 指令执行过程看作多个微操作序贯执行完成的
      • 对每个微操作进行编码,形成微操作码,微操作码可由简单电路产生微操作控制信号
      • 执行顺序控制位:指示后续微操作的执行顺序
      • 微操作码+执行顺序控制位=微指令
      • 指令→一段由若干微指令编排而成微程序
      • 所有指令对应的微程序都存放在控制存储器CM中逐条读出,其中微操作码经过译码产生微操作控制信号
    • 结构

      • 微地址:微指令在控制存储器CM中的存放地址
      • CLK:作用等于读信号

    • 工作原理和过程

      • 计算机指令分为操作码操作数地址两部分
      • 操作码由指令译码器译码,译码结果是该指令对应的微程序在CM中的首地址
      • 该地址经微地址译码器译码后,从CM中读出第一条微指令,其中微操作码部分送往微操作码译码器进行译码,生成相应的控制信号以实现规定的微操作
      • 执行顺序控制位送往微地址形成电路,生成下一条微指令的微地址
      • 不断重复上述过程,直到这段微程序全部执行完毕
  2. 硬连线控制器

    • 简介

      • 也称为组合逻辑控制器,最早采用的控制器设计方法
      • 把控制器看作专门产生固定时序的控制信号的逻辑电路,以使用元件少和速度快作为设计目标
      • 因指令功能的多样性和差异性,导致所实现的控制器逻辑电路复杂、规模庞大,并且一旦形成就无法变更,除非重新设计和布线
    • 设计步骤

      • 输出:需要产生的微操作控制信号
      • 输入:微操作信号类型、执行条件和时序
      • 列出逻辑表达式,经过化简,设计相应的逻辑电路
    • 一般结构

    • 特点:速度快,电路复杂,不支持复杂指令,调试和改动困难,一度被微程序取代。近年因RISC的兴起和VLSI的进步,再度兴起

2.4.3. 寄存器阵列

2.4.4. 地址与数据缓冲器

CPU内部总线与系统总线之间的接口,提供地址和数据传送缓冲,同时增加CPU的系统总线驱动能力

2.4.5. 数据通道

计算机各部件按功能划分为两大阵营:控制单元CU执行单元EU

CU就是控制器,也是计算机中指令流的终点。控制器的组成包括指令寄存器、指令译码器和操作控制器。负责指令译码,生成相应的控制信号,控制执行单元完成指令规定的各种操作

EU负责指令执行,如生成地址、读取和传送数据、计算和处理数据、存储结果、更新PSR和PC。执行单元包括运算器、寄存器组、内部总线以及系统总线接口

在指令执行过程中,数据是在运算器、寄存器阵列和系统总线接口之间通过内部总线进行传送,所以这几个部件也被称为数据通道

2.4. 模型机指令集和指令执行过程

2.4.1. 模型机指令集

指令

根据计算机组成的层次结构,可以分为:微指令机器指令宏指令

指令系统

一台计算机中所有指令的集合称为这台计算机的指令系统

汇编指令

定长指令

2.4.2. 指令周期

计算机运行流程

开始 → 取指 → 执行 → 取指 → 执行 → ……

指令周期

开始取指到完成指令操作的时间

CPU时间

T周期

image-20200222235513291

2.4.3. 模型机指令执行流程

示例:利用模型机汇编指令编程实现如下操作:

将数据000FF000h(0x000FF000)与内存中某个字数据相加,字数据的地址位于R3寄存器中,如果相加结果没有溢出,则将0x000FF000存入由R3+80h指定的内存单元,然后停机;如果溢出,直接停机

模型机汇编语言源程序片段:

image-20200225223527242

模型机系统结构:

image-20200225223636964

用汇编语言编写的程序称为汇编语言源程序,简称汇编程序。将其转换成机器语言的过程称为汇编,能够实现汇编功能的软件称为汇编器或者汇编软件

汇编后的机器指令顺序存放,若指令长度为4字节,后一条指令地址等于前一条地址加4(PC的单位为字节)

模型机结构假设:

  1. 模型机是32位,数据总线32位,地址总线32位
  2. RISC结构,定长指令设计,每条指令长度也是32位
  3. 待运行程序的首地址为0x2000 0000
  4. 第一条指令的机器码为“E3 A0 06 FF”

执行过程:

  1. 第一条:源操作数是立即数(取指时能从指令编码中立即得到的数),被装入R0寄存器后指令执行完毕

    • 根据程序的名字,把0x20000000装入程序计数器PC

    • 程序计数器PC内容0x20000000送至地址缓冲器/驱动器地址总线的输出经地址译码器译码,寻址内存单元

    • 操作控制器OC发读信号,将“E3 A0 06 FF”读出到数据总线

    • 由于是取指操作,数据总线上的数据被装入指令寄存器IR

    • 程序计数器PC值自动加4(假设PC内容的单元是字节),指向下一条指令的存放地址

      • 流水线处理器取指后立刻更新,以便能够立即取下一条指令
      • 另一种策略是临近指令执行结束时再更新,可根据执行结果确定该如何更新
    • 指令译码器ID对操作码译码,操作控制器OC产生相应的控制信号

    • 指令的地址码部分对应着汇编指令的操作数部分。本条指令中,源操作数为立即数#0x000FF000,目的操作数是R0寄存器

    • 操作控制器OC输出的控制信号作用下,立即数#0x000FF000经地址形成部件和地址驱动器送到地址总线,再经地址译码后寻址到源操作数存放的内存单元

    • 操作控制器OC发出读信号,将源操作数读出到数据总线,然后加载到R0寄存器

  2. 第二条:Load操作,从内存取操作数到R1,操作数地址由R3提供

    • 把第二条指令的地址0x20000004 装入程序计数器PC, 程序计数器的内容0x20000004 送到地址形成部件,地址形成部件产生的地址信号经地址缓冲器/驱动器和地址总线,被送到地址译码器进行译码,寻址指令存放的内存单元
    • 操作控制器发读信号,将0x20000004 单元的内容“LDR R1, [R3]”读出,由于是取指操作,“LDR R1, [R3]”经过数据总线被存入到指令寄存器IR
    • 如果程序计数器的单位是字节,则PC 自动加4,指向下一条指令的存放地址
    • 指令译码器ID 对指令操作码进行译码,操作控制器OC 按照操作时序发出相应的控制信号
    • 指令的地址码部分对应着汇编指令的操作数部分。本条指令中,存放源操作数的内存地址位于R3 寄存器中,目的操作数是R1 寄存器
    • 在操作控制器输出的控制信号作用下,R3 寄存器的内容经地址形成部件和地址驱动器送到地址总线,再经地址译码后寻址到源操作数存放的内存单元
    • 操作控制器发出读信号,将源操作数读出到数据总线,然后加载到R1寄存器。
  3. 第三条:ADD运算,R0与R1相加,结果存入R1寄存器,完成运算后更新到FR中相关状态位

  4. 第四条:条件转移,溢出则跳转执行标号为L2的指令,PC=PC+m(m是转移目的指令与转移指令之间的相对距离);否则继续执行下一条指令

  5. 第五条:Store操作,源操作数是R0寄存器的内容,目的操作数的地址是R3寄存器的内容再加上偏移量80h

  6. 第六条:HTL停机,持续执行空操作

总结与讨论

2.5. 计算机体系结构的改进

2.5.1. CISC和RISC

CISC:指令数量多、功能丰富、可实现复杂操作

RISC

CISC & RISC借鉴与融合

2.5.1. 流水线技术

流水线原理

image-20200226210758799

image-20200226210853633

流水线中技术存在的主要问题

流水线高效运行的前提:保持畅通,不发生断流

指令执行过程中可能发生的三种相关冲突:

2.5.3. 超标量处理器和多发射技术

2.5.4. 超线程处理器

2.5.5. 多处理器计算机和多计算机系统

多处理器计算机

image-20200226223649557

多计算机系统

image-20200226224012666

分布式计算机系统

image-20200226224419061

2.5.6. 多核处理器

2.6. Intel x86典型微处理器简介

2.6.1. Intel 8086处理器

image-20200226234118820

2.6.2. Intel Pentium处理器

image-20200226234729828

2.7. ARM嵌入式处理器简介

2.7.1. ARM体系结构、ARM处理器和ARM内核

ARM体系结构

ARM处理器和ARM内核

2.7.2. ARM处理器的特点

2.7.3. 典型ARM内核的基本结构

ARM7TDMI——ARM7系列基本型产品

ARM920T基本结构和特点

2.8. 计算机性能评测

2.8.1. 定性描述指标

机器字长

计算机中的字长不仅影响计算精度,也影响运算速度。64位计算机的性能显然高于32位

存储容量

在计算机存储系统中,高速缓存和内存(主存)容量和类型是评价计算机系统性能的两项重要指标

一般来说,高速缓存和内存容量越大、存取速度越快,计算机的处理能力就越强

总线带宽和数据吞吐速率

一般来说,总线带宽取决于总线结构、位宽、主频等。数据吞吐速率还与存储器的存取速度、传送方式、数据的组织形式以及外设接口速度等因素有关

能耗与环保

关于CPU效能的指标主要有EPI,EPI指标越低,表明CPU的能源效率越高

计算机的环保指标:耗电量、辐射、噪声、各种器件中有害物质的含量、各种废弃物的可处理性等

RASIS特性

2.8.2. 定量指标描述

定量描述指标:速度

一般来说,一台计算机的主频高、CPU数量或者内核数量多、高速缓存和主存容量大、总线传输速率高,表明计算机运算速度也快

早期指标:MIPS

对于执行相同的任务,RISC计算机相比CISC计算机要花费更多的指令,MIPS对CISC和RISC不能客观评价

现在指标:基准测试

3. 存储器系统

3.1. 概述

3.1.1. 存储器的类型及特点

3.1.1.1. 半导体存储器

原理

半导体存储器是一种以半导体电路作为存储媒体的存储器,内存储器就是由成为存储器芯片的半导体集成电路组成

分类

  1. 按其功能分

    • 随机存取存储器RAM
    • 只读存储器ROM
  2. 按地位和作用分

    image-20200305144425236

  3. 按结构和工艺分

    • TTL(Transistor-Transistor Logic)
    • COMS(Complementary metal-oxide-semiconductor)
  4. 按存储信息的可保存性分

    • 易失性存储器
    • 非易失性存储器
  5. 按存储器在计算机中的功能分

    • 高速缓冲存储器(Cache)
    • 主存储器
    • 辅助存储器(外存储器)

优点

缺点


3.1.1.2. 磁介质存储器

原理

利用磁性介质的磁极化来存储信息

分类

特点

磁芯存储器结构和工作方式

磁芯在导线上流过一定电流情形下会被磁化或者改变磁化方向,实现通过实验和材料的工艺控制得到这个能够让磁芯磁化的电流最小阈值。根据磁化时电流的方向磁芯可产生两个相反方向的磁化,这就可作为0和1的状态来记录数据。每个磁芯都有XY互相垂直的两个方向的导线穿过,另外还有一条斜穿的读出线,这些线组成阵列,XY分别做两个不同方向的寻址

磁盘结构和工作方式

磁带结构和工作方式


3.1.1.3. 光存储器

原理

光盘上刻有凹点和空白,光照射后辐射强度不同,接收电路再转化为0、1地数字信号

分类

光驱结构和工作方式

特点


3.1.2. 微机系统的存储体系架构

微型计算机系统的存储体系架构是分层次的,离CPU越近的存储器,速度越快,每字节的成本越高,同时容量越小。按照与CPU由近到远的距离,有

寄存器
高速缓存
内存/主存
本地磁盘
网络存储

按照访问速度快慢和容量,有

CPU内核
寄存器堆
高速缓存
主存储器
联机外存储器
脱机外存储器

简单的二级结构:内存+外存

完整的四级结构:寄存器+Cache+主存+辅存(联机、脱机外存)

image-20200305151232929

image-20200305151248536


  1. 寄存器

    • 组成

      • 采用触发器,构成中央处理器CPU中地一部分
    • 功能

      • 暂存指令、数据和地址
    • 特点

      • CPU处理的数据先提取到寄存器。有限存储容量,高速
  2. 高速缓冲存储器Cache

    • 组成

      存在于CPU与内存之间,由静态存储芯片SRAM组成

    • 功能

      CPU向内存读取数据时,首先查询Cache存储体缓存区是否有对应数据,如果有则直接读取,没有再从内存中读取

    • 特点

      • 成本高,容量比较小。但速度比内存高得多,近于CPU的速度
      • 系统动态管理缓存中的数据,如果有数据访问频率降低到一定值,就从Cache存储体中移除,而将内存中访问更加频繁的数据替换进去
  3. 主存储器

    • 组成

      • 主存储器,简称内存,是计算机运行过程中的存储主力,主要由DRAM和ROM组成
      • 在一些特殊类型或者小容量应用场合,如,在嵌入式系统中,也采用SRAM作为主存
    • 功能

      程序的运行都是在内存中进行。存储指令(编译好的代码段),运行中的各个静态,动态,临时变量,外部文件的指针等等

    • 特点

      成本较高,容量比较大,速度高,但比Cache低得多

  4. 辅存

    • 联机外存储器

      • 组成:主要为磁介质的机械硬盘、固态硬盘SSD

      • 功能:存储需要永久存储的文件

      • 特点:

        • 磁介质机械硬盘空间大,价格便宜
        • 固态硬盘在接口的规范和定义、功能及使用方法上与普通机械硬盘完全相同,在产品外形和尺寸上也完全一致
    • 脱机外存储器

      • 移动硬盘、光盘、U盘、Flash等便携式存储器,便于携带

3.1.3. 辅助存储器主要接口标准

常将联机、脱机存储器称为辅助存储器。辅助存储器接口,主要包括硬盘接口标准、Flash存储卡的接口标准等。通用的接口标准为不同类型辅助存储器产品提供接入的互换性,便于产品升级和维护

微机常用存储接口:

IDE
ATA&PARA
SCSI
SATA
SAS

嵌入式设备常用存储接口:

SD
eMMC
UFS

image-20200305152815295


  1. IDE接口

    • IDE又称为ATA,用40/80针排线连接PC机和硬盘,16位双向总线并行传送,盘体与控制器集成一起以减少接口电缆长度,提高传输可靠性
    • 后发展为Ultra DMA,最快的Ultra DMA133接口的时钟达到133MHz
    • 由于采用并行接口传输数据,也称为PATA硬盘

  1. SCSI接口

    • 并行接口,用于计算机及其周边设备之间(硬盘、软驱、光驱、打印机、扫描仪等)系统级接口的独立处理器标准
    • 配专门SCSI控制卡,最多连15个硬盘,也可驱动其他SCSI接口外设
    • 优点:CPU占用率低,多任务并发操作效率高,转速高,传输速度快,更稳定,支持热插拔,连接设备多,连接距离长等
    • 成本高,多用于中高端的服务器和工作站。主流的Ultra 320SCSI的速度为320MB/s

  1. SATA接口

    • SATA使用了差动信号系统,能有效滤除噪声
    • 4针串行点对点传输数据,一次传一位,但总线8位,每时钟周期能传送1字节,并用数据包传送,速率达150MB/s
    • 接口结构简单,能减小功耗,支持热插拔,还能对传输指令进行检查,并自动纠错,传输可靠性高
    • SATA2和SATA3是最新硬盘接口,传输速度分别达到300MB/s和600MB/s
  2. SAS接口

    • 串行连接SCSI接口
    • 新一代SCSI技术,它和SATA接口那样采用串行技术来获得更高的传输速度,并通过缩短连线来改善内部空间等
    • SAS的接口技术可以向下兼容SATA,而SATA系统不兼容SAS

  1. SD接口

    • SD卡的数据传送和物理规范由MMC(Multi Media Card)发展而来,大小和MMC卡相似,长宽和MMC卡一样,比MMC卡厚0.7mm
    • SD卡集成了闪存记忆卡控制器、MLC(Multilevel Cell)和NAND闪存,通过9针的接口界面与专门的驱动器相连接
    • SD卡系统是一个新的大容量存储系统,提供了一个便宜的、结实的卡片式的存储媒介
    • SD卡的低耗电和广供电电压,可以满足移动电话、电池应用。使用非常有效的数据压缩比如MPEG,SD卡可以提供足够的容量来存储多媒体数据
    • SD卡衍生类型Micro SD(T-Flash,简称TF)卡,具有更小的尺寸,在大部分场合替代了常规的SD卡,成为脱机外存储器的主流

image-20200305154716470


  1. eMMC接口

    • 嵌入式存储器接口

      • 嵌入式MMC,基于MMC协议的内嵌式存储器标准规格。主要针对使用成本较低的数据存储和传播媒体产品,手机或平板电脑等产品
      • eMMC=控制器+NAND Flash+MMC标准封装接口
      • eMMC封装为MCP芯片。为BGA封装
      • eMMC支持MMC、SPI模式
    • 特点

      • 接口速度高达每秒400MBytes
      • 不需处理其它复杂的NAND Flash兼容性和管理问题,简化了存储器的设计
      • eMMC加快了新产品更新速度,减少研发成本,缩短新产品研发周期
      • eMMC为半双工方式。将有被全双工的UFS取代的趋势

  1. UFS

    • UFS,即“通用闪存存储”,同样是一种内嵌式存储器的标准规格,由JEDEC(Joint Electron Device Engineering Council)发布。同样是整合有主控芯片的闪存,不过其使用的是PC平台上常见的SCSI结构模型并支持对应的SCSI指令集

    • UFS是UFSHCI标准JESD223的扩展

    • UFSHCI标准定义了UFS驱动程序和UFS主机控制器之间的接口。除寄存器接口外,它还定义了系统内存中的数据结构,用于交换数据,控制和状态信息

    • 技术特点

      • 串行传输,全双工,同一通道允许读写传输,读写能够同时进行,单通道带宽达1.5GB/s以上,传输效率有效提高
      • 抗EMI和串扰
      • 差分信号可以使用较低的电压,并且由于提高了抗噪声性能,获得更好的信噪比(SNR)
      • 差分信号集成到UFS卡,降低接收器电路复杂性
      • CLK线上的电阻,通过阻尼减少信号失真和EMI
      • 电源电容,去耦以及储能

3.2. 半导体存储芯片的基本结构和性能指标

电子计算机主板上主要采用半导体存储器,称为内存

内存用来存放当前执行的数据程序,有易失性和非易失性两种

RAM:易失性存储器,仅用于暂时存放程序和数据,关闭电源或断电数据会丢失

ROM:非易失性存储器,用于存放程序或静态数据,即使断电,数据也不会丢失

3.2.1. 随机存取存储器RAM

简介


静态RAM(SRAM)

  1. 特点

    • 双稳态触发器(SR锁存器)存储信息
    • 速度快(双极型<5ns,MOS型几十~几百ns ),不需刷新,外围电路比较简单,但集成度低(存储容量小,约1Mbit/片),功耗大
    • SRAM被广泛地用作高速缓冲存储器Cache
    • 对容量为的SRAM芯片,其地址线数=;数据线数=。反之,若SRAM芯片的地址线数为,则可以推断其单元数为个。如,地址线分别为13、10根,则单元数为
  2. 基本存储电路

    image-20200305155648090

    • 管组成双稳态锁存器,用于记忆1位二值代码
    • 截止 → A为高电平 → 导通 → B为低电平 → 截止 → 状态“1”
    • 导通 → A为低电平 → 截止通 → B为高电平 → 导通 → 状态“0”
    • 控制管 实现状态控制
  3. 工作原理

    • 保持状态

      image-20200305155840968

    • 读出状态

      选择线通过译码控制为高电平

      image-20200305155907768

    • 写入状态

      选择线通过译码控制为高电平

      image-20200305155940157

  4. 静态RAM芯片结构

    静态RAM芯片内部由多个基本存储电路单元组成,容量为单元数与数据线位数之乘积

    为了选中某一个单元,往往利用矩阵式排列的地址译码电路:行选择信号 + 列选择信号

    • 例如,1K单元的内存需10根地址线,其中5根用于行译码,另5根用于列译码
    • 译码后在芯片内部排列成32条行选择线和32条列选择线,这样可选中1024个单元中的任何一个,而每一个单元的基本存储电路的个数与数据线位数相同

    常用的典型SRAM芯片有6116、6264、62256、628128等

    以6116芯片为例:

    image-20200305160302944

    • 6116芯片的容量为

    • 2048个存储单元需11根地址线

      • 7根用于行地址译码输入,4根用于列译码地址输入
      • 每条列线控制8位,形成了128×128个存储阵列,即16384个存储位
    • 6116控制线有三条:片选CS#、输出允许OE#和写入允许(读写控制)WE#

    • 工作过程:

      • 读出

        • 地址输入线送来的地址信号经地址译码器送到行、列地址译码器
        • 译码后选中一个存储单元(8个存储位)
        • 由CS#、OE#、WE#构成读出逻辑(CS#=0,OE#=0,WE#=1)
        • 打开右面的8个三态门,被选中单元的8位数据经I/O电路和三态门送到D7~D0输出
      • 写入

        • 地址输入线送来的地址信号经地址译码器送到行、列地址译码器
        • 译码后选中一个存储单元(8个存储位)
        • 由CS#、OE#、WE#构成写入逻辑(CS#=0,OE#=1,WE#=0)
        • 打开左边的三态门,从D7~D0端输入的数据经三态门和输入数据控制电路送到I/O电路,从而写到存储单元的8个存储位中
      • 无读写操作

        • CS#=1,即片选处于无效状态,输入输出的三态门均为高阻状态,存储器芯片与系统总线断开

动态RAM(DRAM)

  1. 特点

    • DRAM是靠MOS电路中栅极电容存储信息,电容上的电荷会逐渐泄漏
    • 需要定时充电以维持存储内容不丢失(称为动态刷新),动态RAM需要设置刷新电路,相应外围电路就较为复杂。刷新定时间隔一般为几微秒~几毫秒
    • 集成度高(存储容量大,可达1Gbit/片以上),功耗低,但速度慢,约为SRAM的一半,需要刷新
    • DRAM在微机中应用广泛,如微机中的内存条(主存)、显卡上的显示存储器几乎都是用DRAM制造的
  2. 存储原理

    image-20200305160647224

    • 存储单元由1个MOS管1个小电容构成

      • 电容C充满电荷便保存了逻辑"1"
      • 电容C无电荷为逻辑“0”
    • 数据输入输出端连数据总线的某一位Di(位线)

    • 低位地址(如A0~ A7)译码产生行选信号X,高位地址(如A15~A8)译码产生列选信号Y。X、Y都为高电平时该单元被选中

    • 刷新操作:

      • 电容C上保存的电荷会逐渐泄漏。故DRAM使用过程中需要及时向保存“1”的那些存储单元补充电荷,也就是对电容C进行预充电,这一过程称为DRAM的刷新
      • 刷新逐行进行,当某一行选择信号X为“1”时,选中了该行,电容上信息送到刷新放大器上,刷新放大器又对这些电容立即进行重写。刷新时,列选择信号Y为“0”,因此电容上信息不会被送到数据总线上
      • 温度升高会加快电容放电,因此两次刷新的间隔不能太短,规定为1~100ms。在70°C时的典型刷新间隔为2ms,绝大多数刷新电路按此标准设计
    • 写操作时,X=1Y=1Q和T管均导通,要写入的值(0或1)从Di加到C

    • 读操作时,Q和T同样导通,存储在C上电荷通过Q刷新放大器和T输出到Di

  3. DRAM芯片举例

    • 常见小容量DRAM芯片有:

      • 64K×1位-4164/2164
      • 256K×1位-41256
      • 1M×l位-21010
      • 256K×4位-21014
      • 4M×1位-21040... ...等
    • 大容量DRAM芯片有:

      • 16M×16位
      • 64M×4位
      • 32M×8位
      • 256M×4位
      • 512M×4位(DDR结构)...等
    • DRAM芯片举例:Intel 2164A

      • 单管存储电路设计,容量:64K×1位
      • 数据线有二根:数据输入和输出
      • 8根地址输入脚A7~A0,分时接收8位行、列地址;
      • 行和列地址选通信号RAS#和CAS#输入端;
      • 读写命令WE# , 0-写,1-读

    以Intel 264A为例

    image-20200305161411662

    • Intel 264A的地址线与寻址

      • 容量为64K×1位,即片内有65536个存储单元,每个单元只有1位数据,用8片2164A才能构成64K字节的存储器。若想在2164A芯片内寻址64K个单元,则需要用16条地址线。但为减少地址线引脚数目,地址线又分为行地址线和列地址线,进行分时工作,这样DRAM对外部只需引出8条地址线
      • 芯片内部有地址锁存器,利用多路开关,由行地址选通信号RAS,把先送来的8位地址送至行地址锁存器加以锁存。由随后出现的列地址选通信号CAS把后送来的8位地址送至列地址锁存器加以锁存
    • 64K×1存储主体,设计成4个128×128矩阵

    • 4个128路刷新放大器,接收由行地址选通的4×128个存储单元信息,经放大后再写回原存储单元进行刷新

    • 16位地址分为行地址A7~ A0和列地址A15~A8,以分时复用方式,分两次送入芯片。行地址在先,列地址随后,各由一个8位地址锁存器保存

    • 两次送来的8位地址信息的最高位(A7和A15),形成RA7和CA7去控制4选1的I/O门电路,从4个矩阵中选择1个进行读/写

    • 行/列地址译码器对行/列地址的低7位进行译码,从某个128×128个单元中选择1个进行读/写

    • 行地址到达,选通信号RAS#变低;列地址到达,选通信号CAS#变低。经行/列时钟缓冲器协调后,有序控制行/列地址的选通以及数据读/写或刷新

    • 要写入的1位数据从脚输入,由数据输入缓冲器暂存;准备从脚读出的1位数据,也先由输出缓冲器暂存

    • 写允许WE#以及RAS#、CAS#信号, 通过写允许时钟缓冲器控制后, 决定打开哪个数据缓冲器

  4. DRAM存储条

    • 内存条

      • PC配置的内存已高达16GB、32GB,服务器更高达256GB,要求更高的DRAM集成度
      • 容量为1G位以及更高集成度的存储器芯片已大量使用。通常,把这些芯片放在内存条上形成更大存储容量,用户只需把内存条插到系统板上提供的存储条插座上即可使用。
      • 内存条标准化,实现通用和互换,便于维护和升级
    • 内存条的主要技术指标

      • 容量:用户最关心的指标,每种内存条都有多种容量规格
      • 时钟频率:内存芯片的基本工作频率,即表5.2中列出的时钟频率
      • 数据速率:芯片上每根引脚可传输数据的速率
      • 数据宽度:可同时传输数据的位数,现大多为64位
      • 奇偶校验:在每1字节外增加了1位,用作出错检测
      • ECC功能:出错检查和修正功能
      • ......
    • 存储条示例

      image-20200305161709682

      • 图中是采用HYM59256A存储芯片,构成256K×9位存储容量的存储条

      • 其中,2片256K×4位的存储芯片通过位扩展形成256K字节的存储单元,1片256K×1位的存储芯片作为奇偶校验

      • 引脚

        • A8~A0为地址输入线。
        • DQ7~DQ0为双向数据线,PD为奇偶校验数据输入,PCAS#为奇偶校验的地址选通信号,PQ为奇偶校验数据输出。
        • WE#为读写控制信号,RAS#、CAS#为行、列地址选通信号。
        • VDD为电源(+5V),VSS为地线。
        • 30个引脚定义是存储条的通用标准之一

3.2.2. 只读存储器ROM

只读存储器(ROM)掉电后信息不会丢失(非易失性或不会挥发性),弥补了RAM的不足,因此成为计算机中的一个重要部件

ROM包括掩模ROM、PROM、EPROM、EEPROM等多种类型

掩模ROM和PROM已淘汰,广泛使用的是EEPROM 和Flash

注意:


掩膜ROM

image-20200305164708204


可编程ROM(PROM)

image-20200305165024053


EPROM


电可擦除可编程ROM(EEPROM,E2PROM)


快闪存储器Flash


3.2.3. 存储芯片的性能指标

存储容量

在一个存储器中容纳的存储单元总数通常称为该存储器的存储容量

存储容量可以用位数、字数或字节数来表示

以位数表示的存储器芯片容量计算:存储器芯片容量=单元数×数据线位数

存储器芯片是以存储1位二进制数(bit)为最小单位

存放一个机器字的存储单元,通常称为字存储单元,相应的单元地址叫字地址。而存放一个字节的单元,称为字节存储单元,相应的地址称为字节地址

如果计算机中可编址的最小单位是字存储单元,则该计算机称为按字编址的计算机。如果计算机中可编址的最小单位是字节,则该计算机称为按字节编址的计算机

一个机器字可以包含数个字节,所以一个存储单元也可以包含数个能够单独编址的字节地址

虽然微型计算机的字长已经达到16位、32位,甚至64位,但其内存仍以一个字节为一个单元

计算机存储单位换算表:

中文单位中文简称英文单位英文简称进率(Byte=1)
比特bitb0.125
字节字节ByteB1
开字节KiloByteKB210
兆字节MegaByteMB220
吉字节GigaByteGB230
太字节TeraByteTB240
拍字节PetaBytePB250
艾字节ExaByteEB260
泽字节ZettaByteZB270
尧字节YottaByteYB280
布字节BronteByteBB290

存取时间和存取周期


其他指标

3.3. 内存条性能的改进

内存条的特点:

3.3.1. 内存条的组成

内存条
内存颗粒
PCB电路板
SPD芯片
引脚/俗称金手指
阻容元件

内存颗粒

SPD芯片

PCB电路板

引脚/金手指

排阻和电容


3.3.2. 内存条的演变

SIMM
FPM_DRAM&EDO_DRAM
SDR_SDRAM
RDRAM
DDR_SDRAM五代
  1. SIMM

    • 最初的内存是直接以DIP封装芯片的形式安装在主板的DRAM插座上
    • 最早的30脚SIPP(Single In-line Pin Package)接口,针脚的定义与30脚SIMM一样。SIPP很快就被SIMM取代,两侧金手指传输相同的信号
    • 早期的内存频率与CPU外频不同步,采用异步DRAM。可细分为FPM DRAM(Fast Page Mode DRAM)、EDO DRAM(Extended Data Out DRAM),常见接口为30脚SIMM与72脚SIMM,工作电压都是5V
    • 第一代SIMM内存为30个引脚,单根内存数据总线为8位,用在16位数据总线处理器上需要两根,用在32位数据总线处理器上则需要四根
    • 随后出现了72脚SIMM内存,单根内存位宽增加到32位,一根就可以满足32位数据总线处理器,拥有64位数据总线的奔腾处理器则需要两根
  2. FPM DRAM & EDO DRAM

    • 传统DRAM的访问,需要经过“发送行址—发送列址—读写数据”3个阶段,一次访问时间是每个阶段所需时间之和
    • FPM(Fast Page Mode,快速页面模式对地址连续(列址相同)的多个单元进行读写访问。除访问第一个数据之外,后续访问只需要经历“发送行地址—读写数据”2个阶段,从而缩短了访问时间
    • EDO(Extended Data Out,扩展数据输出)是对传统DRAM存取技术的改进。它取消了主板与内存两个存储周期之间的时间间隔,每隔2个时钟脉冲周期传输一次数据,大大地缩短了存取时间。在输入下一个行地址时,仍然允许数据输出进行,扩展了数据输出的时间,“EDO”因此得名
  3. SDR SDRAM (Single Data Rate SDRAM)

    • SDRAM(Synchronous DRAM,同步动态随机存取内存)

    • 传统DRAM采用“异步”的方式进行存取,存储器的吞吐速率受限从而导致系统性能难以提高

    • SDRAM采用同步方式进行存取。送往SDRAM的地址、数据和控制信号都在一个时钟信号的上升沿被采样和锁存,SDRAM输出的数据也在另一个时钟上升沿锁存到芯片内部的输出寄存器

    • SDRAM收到地址和控制信号之后,在内部进行操作。在此期间,处理器和总线主控器可以处理其它任务(例如,启动其它存储体的读操作),无需做无谓等待,从而提高了系统性能

    • 输入地址、控制信号到数据输出所需的时钟个数可以通过对芯片内“方式寄存器”的编程来确定

    • SDRAM芯片支持“突发总线模式(Burst)”进行读写操作。当对一组相邻的存储单元进行访问时,第一个地址给出后,后续地址自动生成,无需再发,可以进行连续读写,大大提高了速度

      • SDRAM增加了时钟信号内存命令的概念。内存命令的类型取决于时钟上升沿上的CE#、RAS#、CAS# 和WE#信号状态
      • SDRAM工作电压为3.5V,采用168线带两个缺口的DIMM插槽。早期时钟频率为66M,后来多为133M,可进行64位的读写。产品规格用时钟频率表示,如pc100或pc133表示其时钟频率为100M或133M
      • SDRAM的存在时间相当长,Intel奔腾2、奔腾3与奔腾4,以及Slot 1、Socket 370与Socket 478的赛扬处理器,AMD的K6与K7处理器都可使用SDRAM内存条
  4. RDRAM (Rambus DRAM)

    • Intel与Rambus合作并推出了Rambus DRAM内存条以代替SDR SDRAM,简称为RDRAM

    • 与SDRAM不同,采用了新的高速简单内存架构,减少数据复杂性,提高整个系统性能

      • RDRAM内部引入了RISC依靠高时钟频率来简化每个时钟周期的数据量
    • RDRAM采用RIMM(Rambus In-line Memory Module)插槽,184脚,总线位宽16位,插两条组建双通道时就是32位,工作电压2.5V,频率有600、700、800、1066MHz等

      • RIMM与DIMM的外型尺寸差不多,金手指同样也是双面的
    • RDRAM内存条通常都是用在Socket 423的奔腾4平台上,搭配Intel 850芯片组使用。由于RDRAM的制造成本高,使得RDRAM的价格居高不下。同时由于奔腾4平台的成本相对较高,最终导致RDRAM被DDR SDRAM替代

  5. DDR SDRAM (Double Data Rate SDRAM)

    • DDR(Double Data Rate)SDRAM(双倍速率同步内存),原来的SDRAM被称为SDR SDRAM

    • SDR仅在时钟脉冲的上沿进行一次写或读操作,DDR内部有两个乒乓交替工作的存储体,还有2bit的预取缓冲,可在时钟上沿和下沿都进行一次对等的写或读操作,至少在理论上DDR的数据传输能力比同频率的SDR提高了一倍

    • DDR内存条的工作电压是2.5V,共有184线,金手指只有一个“缺口”

      • DDR工作频率有100/133/166/200/266MHz等。所谓双倍速率就是传输速率是工作频率的两倍,因此型号上所标识的是工作频率×2,即标称为DDR200、266、333、400和533,容量128/256/512MB等,主要用于P4级别的64位PC机

      • DDR内存条最初只有单通道,后来出现了支持双通芯片组,让内存的带宽直接翻倍,两根DDR-400内存条组成双通道,可以满足FBS800MHz的奔腾4处理器

        • 能用DDR内存条的CPU很多,除Intel与AMD外,还有NVIDIA、VIA、ALI、ATI等厂家
  6. DDR2 SDRAM

    • DDR2内存采用了4bit预读取(类似于快餐店里的备餐)技术,数据通过四条线路串行传输到I/O缓存区,使工作频率为100MHz的内存可实现400MHz的数据传输频率,因此称为DDR2-400,其带宽为(100MHz×4)×(64b/8b)=3200MB/s=3.2GB/s

    • 数据预取以及多路串行传送,实际数据传送速率相同时的功耗更低;或同样的功耗下拥有更快的传送速率

      • DDR2有240个金手指,DDR是184个,两者的防呆缺口位置不同
      • DDR2采用CAS、OCD、ODT等技术提高信号完整性
      • DDR2的标准电压下降至1.8V,相较上代产品更为节能
      • DDR2的频率从400MHz到1200MHz,主流的是DDR2-800
      • 容量从256MB至最大4GB,4GB的DDR2内存条应用很少
      • DDR2在2004年6月与Intel的915/925主板同步推出,伴随了大半个LGA 775时代
  7. DDR3 SDRAM

    • 在DDR2基础进一步改进为8位预取,如100MHz的DDR3-800,带宽可达到: (100MHz×8)×(64b/8b)=6.4GB/s

    • 预存比特数 vs 数据传送速率

      • 提高预存比特数需要将I/O控制器的频率再次翻倍,并且增加数据线数量,在I/O芯片频率已经很高时,技术难度和成本都会大幅增加
    • 其他特性

      • DDR3的工作电压1.5V,240线,容量512MB和1/2/4/8GB,单条16GB的DDR3内存比较少。
      • DDR3还采用CWD、Reset、ZQ、STR、RASR等新技术,让内存在休眠时也能够随着温度变化去控制对内存颗粒的充电频率,以确保系统数据的完整性。
      • DDR3内存条随着Intel在2007年发布3系列芯片组一同到来。
      • 支持DDR3内存的平台有Intel后期的LGA 775主板P35、P45、x38、x48等,LGA 1366平台,LGA 115x系列全都支持。还有LGA 2011的x79,AMD方面AM3、AM3+、FM1、FM2、FM3接口的产品均支持DDR3
  8. DDR4 SDRAM

    • DDR4是目前的主流,相比DDR2和DDR3有以下几项关键技术

      • Bank Group架构。使用2个或4个可选择的采用8n预取Bank Group分组,每个Bank Group可以独立读写数据,如果是2个独立的Bank Group,相当于将内存预取值提高到了16n,如果是4个独立的Bank Group,则等效的预取值提高到了32n。

      • 点到点传输。每个通道只连接一根内存条,消除了共享传输带来的性能瓶颈。

      • 3D堆叠。在散热允许情况下,采用3D堆叠封装技术,使得单根内存条的容量从目前8GB提高到64GB。

      • 其他技术变化

        • DDR4功耗明显降低,电压达到1.2V,传输速度从2133 MT/s起,最高可达4266 MT/s
        • DDR4增加了DBI(Data Bus Inversion,数据总线反转)、CRC(Cyclic Redundancy Check,循环冗余校验)、CA parity等功能,增强了信号的完整性、改善数据传输及储存的可靠性
  9. DDR5 SDRAM

    • 主导内存标准制定的JEDEC(Joint Electron Device Engineering Council)规范组织,虽然之前宣布2018年正式发布DDR5标准,但实际上并没有,最终规范要到2020年才能完成。

    • DDR5主要特性是芯片容量,而不仅仅是更高的性能和更低的功耗。

      • 内存带宽在DDR4基础上翻倍,从8位翻倍到16位。
      • 频率最低4800MHz,最高6400MHz。
      • 电压则从1.2V降至1.1V,功耗减少30%。
      • 每个模块使用两个独立的32/40位通道,支持ECC(Error Correcting Code)。
    • 此外,DDR5将具有改进的命令总线效率,更好的刷新方案以及增加的存储体,以获得额外的性能,提高总线效率

小结:

3.4. 存储系统的层次架构

3.4.1. 存储系统的分层管理

3.4.2. 虚拟存储器与地址映射

虚拟存储器简介

image-20200310131447780


段式虚拟存储器


页式虚拟存储器


段页式虚拟存储器

3.5. 高速缓冲存储器Cache

3.5.1. 高速缓冲存储器Cache的原理

Cache的意义

CPU与DRAM的发展现状

CPU和主存储器的速度总是有差距,CPU的发展一直是提高速度为核心目标;主存的发展则一直以提高容量为核心目标

image-20200310140747608

程序访问的局部性原理

image-20200310140827251

在主存与CPU之间设置Cache

Cache的基本运行原理

Cache的组织方式

Cache的管理

Cache管理的基本问题


3.5.2. 高速缓冲存储器Cache的基本结构

计算机的Cache系统基本组成

  1. Cache模块(SRAM)
  2. 主存(DRAM)
  3. Cache控制器

image-20200310153543372


Cache的基本结构

image-20200310153707998


Cache控制器的控制行为


影响命中率的因素

影响命中率的因素:Cache容量、存储单元组数目和组大小、地址映射方案、联想比较策略、数据替换算法、写操作处理方法、程序本身特性等

命中率的计算:


3.5.3. 地址映射与转换


全相联映射

image-20200310154455649


直接相联映射

image-20200310155145543


组相联映射

image-20200310220818427

3.5.4. Cache更新与替换策略

读取结构

  1. 贯穿读出(Look Through)

    • 该方式将Cache隔在CPU与主存之间
    • CPU对主存的所有数据请求都首先送到Cache,由Cache在其中查找
    • 如果命中,则切断CPU对主存的请求,并将数据送出
    • 不命中,则将数据请求传给主存
    • 优点:降低了CPU对主存的请求次数
    • 缺点:延迟了CPU对主存的访问时间
  2. 旁路读出(Look Aside)

    • CPU同时向Cache和主存发出数据请求
    • 由于Cache速度更快,如果命中,则Cache在将数据回送给CPU的同时,还来得及中断CPU对主存的请求
    • 不命中,则Cache不做任何动作,由CPU直接访问主存
    • 优点:没有时间延迟
    • 缺点:每次CPU都存在主存访问,从而占用一部分总线时间

写入更新策略

当CPU对Cache数据做了修改之后,应修改主存相应位置内容

  1. 写通方式(Write Through)

    • 从CPU发出的写信号送到Cache的同时,也写入主存,保证主存的数据能同步更新
    • 优点:操作简单,较好地保持了Cache与主存内容的一致性,可靠性高
    • 缺点:由于主存的慢速,降低了写速度并占用了总线时间,没有发挥Cache高速访问优势
  2. 写回方式(Write Back)

    • 更新数据只写到Cache,而主存中的数据不变
    • 在Cache中设置“修改标志位”,Cache中有被修改的数据时,该标志位置“1”
    • 每次Cache有数据更新时,判断该标志位。只有该标志位为1,即Cache中的数据被再次更改而需要换出时,才将原更新的数据写入主存相应的单元中,然后再接受再次更新的数据
    • 优点:克服了写通方式写速度低的问题,有利于提高CPU执行效率
    • 缺点:有Cache与主存数据不一致的隐患,控制也较复杂

替换策略

Cache一个块对应主存多个块,块大小相同。主存数据块装入Cache时,如果相应位置被其他块占用,则必须替换掉旧块,以新块填充

  1. 随机(Random)替换策略

    • 随机确定需要替换的Cache块,不管Cache块过去、现在及将来的使用情况,而随机地选择某块进行替换
    • 优点:方法最简单,易硬件实现,速度快
    • 缺点:被换出的数据可能马上就需要再次使用,增加了映射装入次数,降低命中率和效率
  2. 最不经常使用(Least Frequently Used,LFU)替换策略

    • 将一段时间内被访问次数最少的块替换出去
    • 每块设置一计数器,从0开始计数,每访问一次,被访块的计数器就增1
    • 需要替换时,将计数值最小的块换出,同时将所有块的计数器清零
    • 优点:方法较简单,较易硬件实现
    • 缺点:统计的是各块两次替换间的访问次数,不能严格反映近期被访问情况。新调入的块很容易被替换出去
  3. 先进先出(FIFO)替换策略

    • 根据进入Cache的先后次序来替换,先调入的Cache块被首先替换掉
    • 优点:不需要随时记录各个块的使用情况,容易实现,且系统开销小
    • 缺点:一些需要经常使用的程序块可能会被调入的新块替换掉
  4. 近期最少使用(Least Recently Used,LRU)替换策略

    • 将CPU近期最少使用的块作为被替换的块
    • 需要随时记录Cache中各块的使用情况,以便确定哪个块是近期最少使用的块
    • 为每个块设置一个“未访问次数计数器
    • 每次Cache命中时,命中块的计数器清0,其它各块的计数器加1
    • 每当有新块调入时,将计数值最大的块替换出去
    • 优点:确保新加入的块保留,还可把频繁调用后不再需要的数据淘汰掉,提高Cache利用率和命中率。硬件实现并不困难

3.5.5. 影响Cache性能的因素

Cache脱靶的原因

  1. 分块太小

    程序开始执行时,主存块逐步复制进Cache,因此容易脱靶,需经过一段时间后Cache才装满。首次执行产生脱靶的次数,与分块大小有关,块越大,不命中次数就越小

  2. 容量太小

    不能将所需指令和数据都调入Cache,因此频繁的替换,导致CPU访问慢速主存次数增多

  3. 替换进Cache的主存块过大或过多

    • 替换进Cache的主存块数目太多,会把下次要访问的指令或数据替换出去
    • 数据块太大,替换所传数据量越大
    • Cache所含块数减少,少数块刚装入就被覆盖掉

提高Cache性能的方法

  1. 增大Cache容量来降低不命中率

    Cache太小致命中率太低,过大改善不明显。一般选Cache与内存容量比4:1000,命中率90%以上。每块取4~8字节(或字)较好

  2. 通过结构设计减少不命中次数

    指令、数据分开存储,存取比例不一样,可将两类Cache分开,并采用二级、三级Cache结构

  3. 通过预取技术提高命中率

    预测将要访问的指令和数据,提前将下条要执行指令取入Cache,提高CPU取指令的速度

3.6. 存储器系统设计

3.6.1. 主存储器系统设计技术

  1. CPU总线的负载能力

    CPU通过总线直接驱动负载的能力有限,应根据需要连接的存储器芯片参数,考虑在总线上增加缓冲器或驱动器,增大CPU的负载能力

  2. CPU时序与存储器存取速度间的配合

    CPU要对存储器频繁读/写,选芯片时要考虑其存取速度能否与CPU读/写时序匹配

  3. 存储器的地址分配和片选

    需要为存储器分配地址范围。由于每块芯片存储容量有限,一个存储器系统可能是由多块芯片组成,要重点考虑容量的扩充方案片选信号的形成

  4. 控制信号的连接

    CPU提供的存储器控制信号,如CS#、OE#、WE#等,应与存储器的相关引脚正确连接,才能实现读/写等控制功能

3.6.2. 存储器系统扩展方式

位扩展

image-20200310223259606

在存储器芯片字数不变的前提下,进行数据的位数扩展

举例:1M×1位的芯片扩展为1M×8位的RAM并与CPU总线连接


字扩展

image-20200310223455820

在存储器芯片的位数满足的前提下,进行字数扩展

举例:存储器芯片为256K×8位,采用4片进行字扩展为1M×8位的RAM,并与CPU总线连接


复合扩展

在位长和字数均不足时,采用复合扩展方式

举例:如将256K×1位的芯片扩展为1M×8位的存储器系统

3.6.3. 嵌入式存储器系统设计

存储结构特点

嵌入式微处理器内置小容量NOR Flash内存和小容量的SRAM

嵌入式系统的存储器扩展


NOR Flash内存的存储器扩展设计

image-20200310224339106

HY29LV160 NOR Flash芯片

ARM微处理器对NOR Flash的访问不需要其他任何软件的设置,系统在上电复位后,从NOR Flash的0X0地址开始执行第1条指令,即开始执行NOR Flash存储器的启动代码


NAND Flash内存的存储器接口设计

image-20200310224858264

NAND Flash与嵌入式微处理器的连接,通过NAND Flash控制器实现

NAND Flash 是以存储外设方式存在,故ARM微处理器对NAND Flash的访问,是通过NAND Flash控制器接口进行


SDRAM的存储器扩展设计

SDRAM作为同步动态存储器,是利用同一个时钟信号同步控制DRAM的地址、数据和控制信号。从而保持SDRAM的时钟频率与系统前端时钟频率,保证CPU对存储器的访问速度与处理速度一致

嵌入式系统采用SDRAM或者SRAM作为系统的主存储器器,用于保存程序运行过程中的实时数据或者存储从外存装入的程序或数据

在SDRAM与ARM微处理器进行电路连接时,要根据实际,对扩展主存容量、芯片粒数、单元数、芯片位宽与Bank之间的关系进行配置

ARM微处理器SDRAM控制器Bank地址配置:

image-20200310225019610

HY57V561620T SDRAM的引脚定义:

image-20200310225109482

ARM微处理器与HY57V561620T SDRAM的连接示意图:

image-20200310225138517

HY57V561620T的存储器组织为4M×16位×4Banks,从而构成32MB的总存储容量

4. 总线和接口

计算机不同部件间,如从硬盘到处理器、从CPU到内存,从内存到显卡,都需要进行数据传输。总线提供了一种经济的思路:把不同计算机部件均接到一个公共的通道上

4.1. 总线技术

4.1.1. 总线技术概述

4.1.1.1. 总线的概念
  1. 总线的作用

    总线:计算机系统内部或者计算机系统之间传输信息的公共信道。总线是由一些电导体的互连组成,其具体形式可以是印刷线路、各种连接器、多路电缆等

    • 系统早期的互联方式——分散连接

      • 内部连线十分复杂,布线困难,扩展性差
      • 效率高
    • 现代的系统互连方式——总线连接

      • 优点:简洁、协调、扩展性好
      • 缺点:有共享竞争问题
  2. 接口的作用

    • 计算机数据处理过程中存在大量数据交换

      • CPU和计算机其他部件/外设之间
      • 计算机不同部件/外设间:内存到显卡、网卡到内存...
    • 外部设备种类繁多、差异大

      • 信号形式:数字/模拟、电压/电流...
      • 速度:摄像头30帧/s、键盘2-6次/s、打印机1-30页/s...
    • 需要中间环节来协调

      • 中间环节就是输入/输出(Input/Output,I/O)接口
      • 接口电路起转换、缓冲速度匹配作用
  3. 总线与接口的区别与联系

    • 电路单元之间的硬件电路

      • 接口包括了电路单元之间的硬件电路
      • 总线不仅包括分时共享传输线路和相关电路,也包括传输和管理信息的规则(即协议)(硬件+协议
      • 挂接在总线上的电路单元一定需要相应的接口电路。
    • 点到点连接和多点互联

      • 两个电路单元连接需要接口电路,未必需要总线协议。
      • 多个电路单元互联,每个电路单元不仅要有接口电路,还需要按照总线协议来规范。
    • 有时候并不做严格区分

      • 广义的接口还包括了接口电路相应的驱动程序
  4. 总线的意义

    考虑一个具有个电路模块的计算机系统,若模块间两两采用直接连接的方式,则实现所有模块互联共需要组连接线

  5. 总线的基本特性

    • 总线的两个基本特性:共享分时

    • 共享:当多个部件连接在同一组总线上,各部件之间相互交换的信息都可以通过这组总线传送

    • 分时:是指任意时刻只能有一个设备向总线发送信息,但是允许多个部件同时从总线接受相同信息(广播)

      • 分时是制约系统性能的瓶颈
  6. 总线的主要性能指标

    • 总线频率

      • 每秒能够发起数据传输的最大次数(Transfer/s,T/s),也称总线传输速率,常用单位MHz
      • 许多总线每个时钟周期能发起一次传送,总线频率就等于总线时钟频率
      • 总线频率越高,传输速度越快
      • 如ISA/EISA的总线频率为8MHz,PCI有33.3MHz和66.6MHz两种总线频率
    • 总线宽度

      • 总线可同时传输的数据位数,也称总线位宽。例如,8位总线、16位总线、32位总线等
      • 总线越宽,相同时间内能传输更多的数据
    • 总线带宽

      • 又称总线最大数据传输速率,单位MB/s。影响带宽的因素有总线宽度、总线频率等,并行总线的带宽为:

        带宽(MB/s)=总线宽度/8×总线频率

        • 例:求33.3MHz@32位总线的带宽

          总线带宽=32b/8×33.3 MHz =133.2MB/s

      • 并行总线一次能传输多位数据,但信号间存在干扰,频率越高,位宽越大,干扰越严重,带宽难于提高

      • 串行总线可通过较高的总线频率获得较大的总线带宽。此外,为弥补一次只能传送一位数据的不足,串行总线常用多条管线传输,其带宽为:

        带宽=总线频率×管线数

    • 同步方式

      • 同步总线:主、从模块之间严格按照确定的时钟进行数据传输,传送速率较高,但是对模块的速度有要求
      • 异步总线:主、从模块之间通过应答握手确保可靠传送,适应性广灵活性高,但会减小总线带宽
    • 总线复用

      在一条线路上,不同的时刻传送不同的内容,例如某一时刻传输地址,另一时刻传输数据或命令信号,以减少总线的信号线数量,并提高信号线的利用率

    • 信号线数

      数据、地址、控制和电源总线数的总和。信号线数量与总线的性能不成正比

    • 总线控制方式

      包括并发工作、自动配置、仲裁方式、逻辑方式、计数方式等

    • 寻址能力

      指地址总线的位数及所能直接寻址的存储器空间大小

    • 总线的定时协议

      为使源与目的同步,需要有信息传送的时间协议。分为同步总线定时、异步总线定时、半同步总线定时

    • 负载能力

      指总线上最多能连接的器件数,一般指总线上的扩展槽的个数

  7. 总线特性

    • 为了保证总线与部件之间机械上的可靠连接,必须规定其机械特性
    • 为了保证电气上正确连接,必须规定其电气特性
    • 为了正确传输信息,必须规定其功能特性规程特性

4.1.1.2. 总线的分类

按物理接口分类:电缆式、主板式、背板式

按总线信号传输类型分类:数据总线、地址总线、控制总线、电源总线

按控制特性分类:同步总线、异步总线、半同步总线

按通信方式分类:串行总线和并行总线

按总线位置分类

片上总线的由来:片上系统SoC的发展,采用片上总线来描述芯片内部使用的总线(实际涵盖传统内总线及外总线的定义)

总线的层次结构:

image-20200316232909775

外总线的分层结构:

image-20200316233124949

总线按功能分类

image-20200316233521896

按数据传输方式分类

过去,内总线一般为并行总线,系统外总线多采用串行总线

按时序控制方式分类

按时分复用方式分类


4.1.1.3. 总线的结构

单总线

image-20200317000853358

双总线:面向CPU的双总线结构

image-20200317001044853

双总线:面向存储器的双总线结构

image-20200317001149503

典型的三总线结构

image-20200317001302390

注意:任意时刻只有一套总线能够使用,主线总线与DMA总线不能同时访问主存

四总线结构

image-20200317001353864

4.1.2. 总线仲裁

总线上的设备

总线上的设备一般分为总线主设备主控模块)和总线从设备从属模块)。常把总线主设备称作总线主机,把总线从设备称作总线从机

总线主设备是指具有控制总线能力的模块,在获得总线控制权之后能启动数据的传输

从设备能够对总线上的数据请求做出响应,但本身不具备总线控制能力

总线仲裁(bus arbitration)是在多总线主设备的环境中提出来的

总线仲裁

总线的使用权分配即总线判优控制,也称为总线使用权仲裁。当有多个主设备同时申请总线时,按一定的优先等级顺序,判定哪个主设备能优先使用总线

两种仲裁方式:

  1. 集中式:将控制逻辑(即总线仲裁器)集中在一处,分为串行仲裁、并行仲裁、循环优先权以及串并行混合等方式
  2. 分布式:将控制逻辑分散在(与总线连接的)各个部件或设备上,由各个节点按照事先约定的协议,竞争使用权

4.1.2.1. 集中式仲裁

串行仲裁

image-20200317001734647

串行仲裁是最为常见的链式仲裁(“菊花链仲裁”)

仲裁过程:

特点:

举例:

并行仲裁

image-20200317001907086

并行仲裁又称为“独立请求式仲裁”

仲裁过程:

独立请求方式的工作原理:

特点:

混合仲裁

image-20200621202544978

混合仲裁又叫多级仲裁

两级混合仲裁的结构:

仲裁过程:

特点:兼具有串行仲裁和并行仲裁的优点,既有较好的灵活性、可扩充性,又可容纳较多的设备而结构也不会过于复杂,且具有较快的响应速度


4.1.2.2. 分布式仲裁

分布式仲裁方式中,每个设备模块都包含总线访问的控制逻辑,这些设备模块共同作用,分享总线

以自举分布式的总线仲裁为例:

假定模块1~4通过BR1~4进行自举分布式仲裁。其中BR1为总线忙信号,正在使用总线的模块应将BR1置为有效;BRi为模块i的总线请求信号线,只有在BR1无效时才能发总线请求。下图中设备1的优先级最低,设备4的优先级最高(主设备4输出,主设备1只能取回)

image-20200317002200396

特点:使用多个请求线,不需要中心裁决器,每个设备独立地决定自己是否是最高优先级请求者

原理:分为申请期和裁决期

举例:NuBus(Macintoshi II中的底板式总线)和SCSI总线

4.1.3. 总线操作与时序

计算机系统中,通过总线进行信息交换的过程称为总线操作

总线设备完成一次完整信息交换的时间称为总线周期(或总线传输周期)

在含多个主控制器的总线系统中,一个总线操作周期一般分为如下四个阶段:

  1. 请求及仲裁阶段:主模块请求,仲裁机构决定把下一个总线传输周期分给哪一个请求源
  2. 寻址阶段:取得总线使用权的主模块通过总线发出本次要访问的从模块(存储器或I/O端口)地址及有关命令,通知参与传输的从模块开始启动
  3. 数据传输阶段:主模块和从模块进行数据传输,数据由源模块发出,经数据总线到达目的模块
  4. 结束阶段:主模块、从模块的有关信息均从总线上撤销,让出总线,以便下一个总线传输周期其他模块能够使用总线

总线时序是指总线操作过程中总线上各信号在时间顺序上的配合关系,即主从设备如何在时间上协调和配合,以实现可靠的寻址和数据传送

总线时序的分类:同步总线时序半同步总线时序异步总线时序周期分裂式总线时序


4.1.3.1. 同步总线时序

总线上的数据传输由统一时标控制

时标通常由CPU的总线控制部件发出,送到总线上的所有部件;也可以由每个部件各自的时序发生器发出,但是必须由总线控制部件发出的时钟信号对它们进行同步

优点:模块间的配合简单一致

缺点:主从模块之间的时间配合属强制性同步,必须按速度最慢的部件来设计公共时钟

例1:写命令

image-20200317004017775

传输周期为:

例2:读命令

image-20200317004103275

传输周期为:

STD总线的读存储器时序

image-20200317004153830


4.1.3.2. 异步总线时序

image-20200317004253883

异步总线允许各模块速度的不一致性,提高了模块的适应性

异步总线中系统没有公用的时钟,主从模块之间通信时,采用应答方式进行联络和协调工作

根据问答信号之间的关系,异步总线时序可分成不互锁方式、半互锁方式和全互锁方式(又称握手方式)

主设备在发数据的同时发选通信号STB,从设备收到数据后应答ACK;主从模块之间增加两条握手应答线

不互锁方式

image-20200317004338753

  1. 主设备发STB,高速从设备当前数据有效,间隔固定时间后,认为从设备已收到,撤销STB
  2. 从设备收到数据后发ACK应答,间隔固定时间后,撤销ACK

半互锁方式

image-20200317004458022

  1. 主设备发STB后,等待从设备的ACK应答,只有收到ACK应答后才撤销STB
  2. 从设备发ACK后,不等待主设备的应答,在间隔固定时间后,撤销ACK

全互锁方式(四边沿协议)

image-20200317004551293

  1. 主设备发STB后,等待从设备的ACK应答,只有收到ACK后才撤销STB
  2. 从设备发ACK后,等待主设备的应答(撤销STB),然后才撤销ACK

主从设备相互等待,传输可靠性最高

关于同步和异步通信方式的讨论


4.1.3.3. 半同步总线时序

半同步总线是对同步总线的一种优化,对于大多数速度较快的传送对象,均按照同步方式定时

对于系统所连接的少数速度较慢的设备,增加一条Ready/wait状态信号线,当慢速设备被访问时,可以利用这条信号线请求主模块延长传送周期

半同步总线提高了系统的适应性,但是速度依然偏慢

示例

image-20200317004823950


4.1.3.4. 周期分裂式时序

在上述各种传输过程中,占用总线使用权的主设备以及被其选中的从设备,无论是否进行数据传输,始终占据着总线资源

若对读命令过程的进一步分析:在读命令传输周期中,除了申请总线这一阶段外,其余时间主要被用于如下三个方面的开销:

  1. 主模块通过总线向从模块发送地址和命令
  2. 从模块按照命令进行读数据的必要准备
  3. 从模块经总线向主模块提供数据

周期分裂总线的思想:将一个传输周期(或总线周期)分解成两个子周期(或称子阶段)

  1. 在第一个子周期(寻址子周期,或称为地址阶段)中,主模块A获得总线使用权后,将命令、地址、A模块编号等信息发到系统总线上,由相关的从模块B接收下来。然后A模块放弃总线,供其他模块使用
  2. 在第二个子周期(数据传输子周期,或称为数据阶段)中,B模块根据所收到的命令,经过一系列的内部操作,将A模块所需的数据准备好,然后由B模块申请总线使用权,一旦获准,B模块将A模块的编号和所需数据,B模块的地址等信息送到总线上,供A模块接收

分裂式操作的技巧是总线设计中一种重要的思路:

4.2. 片内总线AMBA

4.2.1. AMBA总线概述

简介

AMBA(Advanced Microcontroller Bus Architecture)总线是ARM公司研发的一种片上总线(on-chip bus)标准

AMBA设计独立于处理器和芯片制造工艺

AMBA拥有众多第三方支持

AMBA定义了三种不同的总线:

AMBA AHBAMBA ASBAMBA APB
高性能
流水线(pipelined)操作
多总线主机(multiplebusmasters)
突发传输(bursttransfers)
分裂式操作(splittransactions)
高性能
流水线操作
多总线主机
低功耗
地址锁存和控制
接口简单
适合大多数外设

基于AMBA总线的系统:

一个基于AMBA2总线的微控制器系统如下:

image-20200317005611339

4.2.2. AHB总线

4.2.2.1. AHB系统的构成

在AMBA2中,AHB担当高性能系统的中枢总线。AHB支持处理器、片上存储器、片外存储器,以及低功耗外设单元之间的有效链接

AHB总线是支持多主机的总线,能支持高带宽、高时钟频率的数据传输操作

AHB系统要素

基于多路选择器的AHB总线互联

image-20200317082522016

AHB特点概述


4.2.2.2. AHB信号定义
  1. AMBA中信号名称的前缀规则
前缀含义及示例
T测试信号(与总线类型无关)
HAHB信号,如HREADY是表示AHB的数据传输完毕的信号,高电平有效
AASB信号,主机与仲裁器之间的单向信号
BASB信号,如BRESn为ASB复位信号,低电平有效
DASB信号,单向的ASB译码信号
PAPB信号,如PCLK表示APB使用的主时钟

所有的信号名均为大写字母,信号若为低电平有效,则信号名称的最后加小写字母n

  1. AMBA中AHB的信号
信号名称信号来源用途说明
HCLK
总线时钟
时钟源为所有总线传输提供时基,所有信号时序都与HCLK的上升沿相关
HRESTn
复位
复位控制器总线复位信号,用于复位系统和总线,低电平有效
HADDR[31:0]
地址总线
主机32位系统地址总线
HTRANS[1:0]
传输类型
主机主机表示当前传输的类型,可以是不连续、连续、空闲和忙(NONSEQUENTIAL,SEQUENTIAL,IDLE,BUSY)
HWRITE
传输方向
主机高电平时表示一个写传输,低电平时表示读传输
HSIZE[2:0]
传输大小
主机表示传输的大小,可以是字节(8位)、半字(16位)或字(32位)等,协议允许的最大传输大小是1024位
HBURST[2:0]
突发类型
主机表示传输是否组成了突发的一部分。支持4个、8个或16个节拍的突发传输,突发传输可以是增量或回环的
HPROT[3:0]
保护控制
主机提供总线访问的附加信息,指示当前传输的安全保护级别
HWDATA[31:0]
写数据总线
主机用来在写操作期间,从主机到从机传输数据。建议最小数据宽度为32位,在高带宽运行时可扩展
HSELx
从机选择
译码器每个AHB从机都有自己独立的从机选择信号,并且用该信号来表示当前传输是否打算送给选中的从机。该信号是地址总线的组合译码
HRDATA[31:0]
读数据总线
从机用来在读操作期间,由从机向主机传输数据。协议允许的数据宽度为:8、16、32、64、128、256、512、1024位
HREADY
传输完成
从机当该信号为高电平时,表示总线上的传输已经完成。在扩展传输时该信号可能会被拉低
HRESP[1:0]
传输响应
从机给传输状态提供了附加信息,提供四种不同的响应:OKAY、ERROR、RETRY和SPLIT
  1. AMBA中AHB的仲裁信号
信号名称信号来源用途说明
HBUSREQx
总线请求
主机从总线主机x传向总线仲裁器,用来表示该主机请求(控制)总线的信号。系统中每个总线主机都有一个HBUSREQx信号,最多16个总线主机
HLOCKx
锁定的传输
主机当该信号为高时,表示主机请求锁定对总线的访问,并且在该信号为低之前,其他主机不应该被允许授予总线
HGRANTx
总线授予
仲裁器该信号用来表示总线主机x目前是优先级最高的主机。当HREADY为高电平时,传输结束,地址控制信号的所有权发生改变。所以主机应在HREADY和HGRANTx都为高电平时,获得对总线的访问
HMASTER[3:0]
主机号
仲裁器表示哪个总线主机正在执行传输,被支持突发传输的从机用来确定哪个主机正在尝试一次访问
HMASTLOCK
锁定顺序
仲裁器表示当前主机正在执行一个锁定序列(sequence)的传输。该信号与HMASTER信号有相同时序
HSPLITx[15:0]
分离式传输请求
从机(支持分裂式操作)指示仲裁器,总线主机被允许重试一个分裂式操作。每位对应一个总线主机

信号后缀x表示模块x。如,HBUSREQx可能分别表示HBUSREQarm或HBUSREQdma


4.2.2.3. AHB的数据传输过程及“流水线”

在一次AHB传输开始之前,总线主机必须先获得总线访问的授权

该授权过程由总线主机向仲裁器发出一个请求信号而发起,随后仲裁器指示主机何时被授权

获得授权的主机通过提供关于地址信号、传输方向、传输宽度和传输类型等控制信号发起一次AHB传输

  1. 单个数据简单传输

    两个阶段:地址阶段和数据阶段

    image-20200317083811390

    • 地址阶段仅持续一个时钟周期,用来传输地址和控制信息

    • 数据阶段可持续一个或多个时钟周期,用来传输有效数据

    • 主机写传输应关注HADDR[31:0]HWDATA[31:0]

      主机读传输应关注HADDR[31:0]HRDATA[31:0]

    • 传输过程:

      • 第一个时钟周期的上升沿:主机把地址、控制等信息驱动到总线上(HADDR[31:0]及其他控制信号线)
      • 第二个时钟周期的上升沿:从机采样获得这些地址和控制信息,并据此把相应的数据驱动到数据总线HRDATA[31:0]
      • 第三个时钟周期的上升沿:主机在HRDATA[31:0]上采样即可获得从机响应的数据
  2. AHB的流水线机制

    地址信息和数据信息交叠的操作方式,被称为流水线机制

    image-20200317083912673

    流水线分离:

    • 2级流水线

      • 第n次传输的地址在第n-1次传输时被驱动到了地址总线上。“驱动地址”和“驱动数据”两个操作构成2级流水线操作
      • 从机因某种原因不能及时响应时,这个流水线就会被打断
    • 周期分裂式时序

      • 地址阶段和数据阶段可以被分离
      • 从机不能及时响应时,发送控制信号HSPLITx通知仲裁器
      • 仲裁器检测到HSPLITx后,知道从机当前不进行传输,则可以把总线的使用权出让给其他主机
      • 当从机做好接收数据准备后,通过控制信号HSPLITx发出重新启动传输的信号,仲裁器根据挂起操作主机的优先级决定何时再次分配总线使用权
      • 当主机获得总线使用权后,重新发送地址、控制等信息,继续刚才挂起的传输操作
  3. 单个数据简单传输中插入等待状态

    image-20200317084057056

    如果数据阶段持续一个时钟周期不足以完成数据的传输,从机可以通过HREADY信号(拉为低电平)扩展数据周期(即插入等待周期)

    传输过程:

    • 主机在HCLK上升沿之后将地址和控制信号驱动到总线上
    • 在时钟的下一个上升沿,从机采样地址和控制信号
    • 进入数据阶段,从机开始驱动适当的响应
    • 若从机在数据阶段第一个时钟周期没能准备好,则需要把HREADY拉为低电平,插入等待周期
    • 从机准备好后,拉高HREADY电平
    • 总线主机在随后的下一个时钟(第五个时钟)上升沿采样HRDATA[31:0]获得从机响应的数据

    说明:

    • 对写操作而言,总线主机必须保持数据在整个扩展期中稳定
    • 在读传输中,从机没必要提供有效数据直至传输结束,只需要在相应周期提供数据即可
  4. 多个数据的传输

    image-20200317084200659

    三次AHB传输分别需要传输的是地址A、地址B和地址C对应的数据

    • 传输地址A和地址C数据都没有插入等待周期,但是传输地址B数据的时候插入了一个等待周期
    • 地址B对应数据在总线上停留的时间被扩展为2个周期
    • 对应地,地址总线上地址C也被扩展了

4.2.2.4. AHB的突发传输

突发传输

突发传输就是一次传输过程传输一个数据块而不是单个数据。既然是传输一个数据块,就涉及到数据块的长度,数据块的地址递增方式等

用突发传输类型信号HBURST[2:0]标识:

HBURST[2:0]类型类型的描述
000SINGLE单次传输
001INCR未标识长度的地址递增式传输
010WRAP4突发长度为4的地址循环增式传输
011INCR4突发长度为4的地址顺序增式传输
100WRAP8突发长度为8的地址循环增式传输
101INCR8突发长度为8的地址顺序增式传输
110WRAP16突发长度为16的地址循环增式传输
111INCR16突发长度为16的地址顺序增式传输

突发传输的状态

HTRANS[1:0]用来向从机指示突发传输过程中的不同状态,因而从机可知自身下一步的操作提示

HTRANS状态状态含义描述
00IDLE指示当前周期没有数据需要传输,当主机被授权使用总线,但是不需要传输时使用该状态
01BUSY指示主机正在进行突发传输,但是下一次数据传输不会马上发生。地址和控制信号线上的信号对应下一次即将发生的传输
10NONSEQNONSEQUENTIAL,指示当前传输是一次突发传输过程或单次传输的第一次传输。地址和控制信号线上的信号与前一次传输无关
11SEQSEQUENTIAL,一次突发传输过程中非第一次的传输。地址和信号线上的信号对应上一个刚完成的传输

WRAP4突发传输时序

WRAP4,拟传输数据的地址在16字节的边界处发生回转,0x38、0x3C → 0x30、0x34

image-20200317084551905

整个传输过程共进行4次数据传输,插入1个等待周期T2

  1. T1周期:第一个拟传输数据对应的地址为0x38,在T1周期被推送到地址总线HADDR[31:0]上,T1周期传输状态指示信号HTRANS[1:0]为NONSEQ,指示拟传输的数据是突发传输中的第1次
  2. T2周期:第2个拟传输数据的地址0x3C被推送到地址总线上,同时传输状态指示为SEQ
  3. T3周期:第1个拟传输数据被推送到数据总线HWDATA[31:0]
  4. T4周期:第3个拟传输数据的地址0x30被推送到地址总线上,同时第2个拟传输数据被推送到数据总线上
  5. T5周期:第4个拟传输数据的地址0x34被推送到地址总线上,同时,第3个拟传输数据被推送到数据总线上
  6. T6周期:第4个拟传输数据被推送到数据总线上

INCR4突发传输时序

INCR4,4个传输数据的地址变化是递增的(0x38,0x3C,0x40,0x44),没有在16字节边界处发生回转

image-20200317084633188

AMBA规范中定义:突发传输过程中拟传输的数据块不能跨越1kB的边界


4.2.2.5. AHB的译码
  1. 地址译码和从机选择信号

    image-20200317084717337

    AHB总线通过一组多路选择器实现主从设备的互连

    从机选择信号HSELx:AHB总线上的所有从机使用一个中央地址译码器提供从机选择信号HSELx。选择信号是高位地址信号的组合译码结果。从机xHSELxHREADY有效的情况下,对地址和控制信号进行采样,从而获得地址和相关的控制信息

    能够分配给单个从机的最小地址空间是1KB。所有总线主机不允许执行超过1KB的地址边界的增量传输,因此确保了一个突发传输不会超过地址译码的边界

  2. 总线允许信号与主机号的生成

    image-20200317084818251

    主线允许信号HGRANTx:由于采用了一个集中式的译码器,每个主机可以在需要的时候随即驱动自身的地址信号,而无须等待总线允许信号HGRANTx

    对于主机而言,HGRANTx信号是自身获得总线控制权的指示,同时,通过HGRANTx可知自己所驱动的地址是否已经被从机采样

    集中式的译码器根据各个主机的总线使用请求产生总线允许信号HGRANTx,并在仲裁器的控制下生成主机号HMASTER[3:0]HMASTER[3:0]指示地址和控制多路选择器把主机的地址总线与对应从机的地址总线连接


4.2.2.6. AHB的仲裁

AMBA2中AHB的仲裁器接口信号

image-20200317085016565

信号后缀x表示模块x,每个总线主机都有一个HBUSREQx信号,最多支持16个总线主机

仲裁机制是为了保证在同一时刻,只有一个主机能够控制总线。仲裁器通过检测请求的优先级等信息确定哪个主机能够获取总线控制权。同时,仲裁器也响应从机分离式传输的请求

无等待状态的仲裁授予

image-20200317085128471

基本步骤:

  1. 主机通过HBUSREQx信号请求对总线的使用需求,如果主机x希望使用总线的时候能够锁定总线资源,则同时需要发出HLOCKx信号
  2. 仲裁器通过HGRANTx信号指示主机x获得了总线使用权
  3. 如果当前HREADY有效,则不需要等待,仲裁器通过HMASTER[3:0]以指示当前获得总线使用权的主机号

HREADY有效的前提下的仲裁授予过程:

  1. 在T3周期的时钟上升沿。HGRANTx有效
  2. 在T4周期的时钟上升沿,仲裁器开始驱动HMASTER[3:0]指示了当前获得总线使用权的主机号,同时获取了总线控制权的主机将地址A驱动到地址总线HADDR[31:0]
  3. 在T5周期的时钟上升沿,地址A对应的数据被驱动到数据总线HWDATA[31:0]

有等待状态的仲裁授予

image-20200317085252818

如果HGRANTx有效,HREADY为无效状态(低电平),则需要插入等待周期

有等待状态的仲裁授予过程:

  1. T4周期时钟上升沿由于HREADY无效,插入了一个等待周期
  2. T5周期时钟上升沿时候,可检测到HREADY有效,仲裁器开始驱动HMASTER[3:0]指示了当前获得总线使用权的主机号,同时,获取了总线控制权的主机将地址A驱动到地址总线HADDR[31:0]
  3. T6周期时钟上升沿时候,HREADY无效,故获得总线使用权的主机又等待了一个周期
  4. T7周期时钟上升沿的时候,才驱动数据到HWDATA[31:0]

总线控制权在两个主机之间移交

image-20200317085413908

总线的控制权包括地址总线控制权和数据总线控制权,数据总线控制权滞后于地址总线

当一次传输完成后(通过HREADY信号高电平予以指示),随后拥有地址总线控制权的主机接管数据总线

主机2控制地址总线的时候,主机1仍在控制数据总线

突发传输后的总线移交

image-20200317085505950

总线控制权移交发生在一次突发传输的末尾

仲裁器在倒数第二个地址被采样后改变总线允许信号HGRANTx

新得总线允许信号HGRANTx将与最后一个地址在相同时刻被采样


4.2.2.7. AHB主机接口及时序参数

image-20200317085555931

复位信号HRESETn

主机接口:


4.2.2.8. AHB从机接口及流水线分离

image-20200317085651013

HMASTER[3:0]HMASTLOCKHSPLIT[15:0]用于支持“SPLIT”传输模式

SPILT传输

4.2.3. AXI总线

从设计思想上看,ASB、APB可视为AHB功能的一个子集;AXI可视为AHB的升级版本;AXI之后的其他版本针对高性能、智能手机等不同场景改进设计

AHB总线分离了一个总线周期的地址阶段和数据阶段,更便于实现在现代总线中常用的Pipelining和Split技术

AXI总线则进一步分离了总线的通道,将AHB的单通道分解为5个独立的通道:读地址通道(Read Address)、读数据通道(Read Data)、写地址(Write Address)通道、写数据(Write Data)通道、写响应(Write Response)通道,进一步加速了对存储器的读写访问

AXI、AHB和APB的对比:

总线AXIAHBAPB
总线宽度8,16,...,102432,64,128,2568,16,32
地址宽度323232
通道特性读写地址通道 读写通道均独立读写地址通道共用 读写数据通道独立读写地址通道共用 读写数据通道独立 不支持读写并行操作
体系结构多主/从设备 仲裁机制多主/从设备 仲裁机制单主设备(桥)/多从设备 无仲裁
数据协议支持流水线 支持分裂式操作 支持突发传输 支持乱序访问 字节/半字/字 大小端对齐 非对齐操作支持流水线 支持分裂式操作 支持突发传输 支持乱序访问 字节/半字/字 大小端对齐 不支持非对齐操作一次读/写传输占两个时钟周期 不支持突发传输
传输方式支持读写并行操作支持读写并行操作不支持读写并行操作
时序同步同步同步
互联多路多路无定义

4.3. 系统总线/外部总线

4.3.1. PCI

PCI总线

PCI(Peripheral Component Interconnect)外部设备互连总线,是一种高性能的局部总线

PCI最早由Intel的IAL实验室提出,在IBM兼容PC上得到应用,后得到Compaq、HP和DEC等公司的响应,成立PCI-SIG

PC领域:逐渐被PCI Express总线替代;工业控制计算机领域:Compact PCI仍在广泛使用

PCI → PCI-X

最初的PCI标准中总线时钟(总线频率)为33MHz,数据线宽度为32位,可扩充到64位,数据传输速率可达132MB/s~264MB/s。后期的PCI版本64位并行数据传送,总线时钟支持33/66MHz,能够达到最高528MB/s的数据传输速率

在PCI的基础上,进一步提出PCI-X规范。PCI-X 553峰值速率是4.2GB/s

PCI总线结构

image-20200317091040079

PCI总线的三类设备:PCI主设备、PCI从设备和桥设备

PCI总线在高速处理器与其他低速设备之间架起了一座“桥梁”。使计算机结构成为基于PCI总线的三级总线结构

PCI总线是一种树型结构,PCI总线上可以挂接PCI设备和PCI桥片,PCI总线上只允许有一个PCI主设备,其他的均为PCI从设备,而且读写操作只能在主从设备之间进行,从设备之间的数据交换需要通过主设备中转

PCI系统框图

image-20200317091141097

#0总线挂接了主存储器、辅助存储器、多媒体设备等不同外设

#1总线通过PCI-to-PCI桥设备挂接到#0总线

4.3.2. PCI Express

PCI Express(简称PCI-E或PCIe)

Intel公司提出用新一代的技术取代PCI总线和多种芯片的内部连接,称之为第三代I/O总线

包括Intel、AMD、DELL、IBM在内的20多家业界主导公司开始起草新技术的规范,并在2002年完成,对其正式命名为PCI Express

标准由PCI特别兴趣工作组(PCI Special Interest Group,PCI-SIG)维护和升级

相比于PCI,PCI-E最大的改变是由并行改为串行,使用差分信号传输

PCI-E的通道

image-20200317091330632

目前高速接口均为串行标准

并行数据线多,CLK不能高

PCI-E点对点串行连接拓扑结构

image-20200317091744624

PCI-E不同版本的传输速率

image-20200317091834106

4.3.3. USB

USB

image-20200317091944549

USB(universal serial bus),通用串行总线,是一种外部总线标准。用于规范电脑与外部设备的连接和通讯,是应用在PC领域的接口技术

USB接口支持设备的即插即用和热插拔功能

USB是在1994年底由由Compaq、Digital、BM、Intel,Microsoft、NEC和NothernTelecom7家公司联合提出的

在USB1.0/USB2.0中,“D+”和“D-”组成一对差分信号线用于数据传输,VBUS和GND对应5V电源和地

USB3.0后,又增加了两对差分信号线以提供更高速的数据传输

USB的机械接口

image-20200317092004988

USB不同版本

image-20200317092053370

4.3.4. 典型的计算机总线系统

以8051为核心的嵌入式控制器的总线

image-20200317092222337

8051是一种八位单芯片微控制器,属于MCS-51单芯片的一种,由Intel于1981年设计

以Cortex-M3为核心的嵌入式控制器的总线

image-20200317092344574

基于8086的初期PC系统总线

image-20200317092415603

x86架构PC早期基于前端总线的多总线结构

image-20200317092517985

CPU通过前端总线FSB(F ro n tSideBus)与存储器和外设进行数据交互,计算机主板上的北桥(Northbridge)芯片负责联系内存、显卡等数据吞吐量最大的部件,并和南桥芯片(S o u t hbridge)连接。CPU就是通过前端总线FSB连接到北桥芯片,进而通过北桥芯片和内存、显卡交换数据

如今x86架构PC的PCH控制总线结构

image-20200317092555682

2009年,Intel推出的单芯片设计的南北桥芯片整合方案。这颗主控芯片既不叫北桥,也不叫南桥,而是称作“Platform Controller Hub”芯片。PCH主要负责PCI-E和I/O设备的管理,它实际上仅提供南桥的功能(此时处理器已经整合北桥功能)

第十代智能英特尔® 酷睿™

image-20200317093735865

4.4. 输入/输出接口

CPU与存储器交换信息——数据格式和存取速度基本匹配

CPU与外设交换信息——由于外设的多样性

因此CPU必须经过中间电路再与外设相连,这部分电路被称为I/O接口电路

完整的I/O接口不仅包括外部设备与CPU或计算机之间的硬件电路,也包括相应的驱动程序

PC机系统板的可编程接口芯片、I/O总线槽的电路板、适配器/连接器都是接口电路

4.4.1. 输入/输出接口概述

4.4.1.1. I/O接口的功能

4.4.1.2. I/O接口的分类

按数据传输方式

按时序控制方式分类

按主机访问I/O设备的控制方式分类

其他分类

如按数据流方向可分为单工、半双工、全双工

image-20200317094931136


4.4.1.3. I/O接口规范的常规内容

接口设计的目的是为了协调上述微处理器与外设之间的不一致,用来实现速率匹配、缓冲、数据格式的转换和电平的转换等功能

依据不同外设的特点,形成了很多典型的接口设计,这些全球通用的接口设计方案往往以工业界公认的规范(Specification)形式出现

输入/输出接口电路

输入/输出接口电路的功能隶属于通常意义的物理层功能。规定了为传输数据所需要的物理链路创建、维持、拆除,而提供具有机械的、电子的、功能的和规范的特性

I/O接口标准的链路层功能

在一些输入/输出接口的标准定义中,除了物理层功能,也纳入了数据块格式、数据块检验方式等链路层功能(OSI模型的第二层)


4.4.1.4. I/O接口的结构

I/O端口

I/O端口指I/O接口电路中的各类寄存器

CPU与外设通信时,主要传送数据信息状态信息控制信息

在接口电路中,这些信息分别进入不同寄存器,CPU也是通过地址对这些寄存器进行寻址。为了与内存单元及CPU内部寄存器相区别,通常将这些寄存器和它们的控制逻辑统称为I/O端口

在一般接口电路中都要设置以下几种端口:数据端口状态端口命令/控制端口。此外还有中断控制逻辑,负责中断请求信号的建立与撤销

端口寄存器

读信号用以指示数据从I/O传输到CPU

写信号用以指示数据从CPU传输到I/O接口

高位地址生成片选信号,选择当前接口

低位地址连接外设片内地址线,选择内部端口

image-20200317095843625


4.4.1.5. I/O端口编址

I/O端口的编址方法

为了让CPU能够访问这些I/O端口,每个I/O端口都需要有自己的端口地址(或端口号)

处理器通过端口地址可对各个端口寻址访问

I/O端口有两种编址方式:独立编址和统一编址

  1. I/O端口统一编址

    image-20200317100050246

    I/O端口统一编址也称为内存映像编址(memory mapped I/O addressing)方式

    将外设接口中的I/O寄存器(即I/O端口)视为主存的存储单元,每个端口占用一个存储单元的地址,把主存地址的一部分划出来用作I/O地址空间

    所有访存指令均可用来访问I/O端口,不用设置专门的I/O指令

  2. I/O端口独立编址

    image-20200317100117813

    I/O端口独立编址又称分离编址(Isolated I/O Addressing)

    存储器和I/O端口分开编址,即存储器和I/O端口的地址空间相互独立,I/O端口编址不占用存储空间,使用专门的IN/OUT指令来访问I/O端口

  3. 统一编址 vs 独立编址

    • 独立编址:

      image-20200317100326444

      优点:

      • I/O端口地址不占用存储器地址空间
      • I/O端口地址译码较简单,寻址速度较快
      • 使用专用I/O指令和存储器访问指令有明显区别,可使程序可读性较好

      缺点:

      • 专用I/O指令类型少,功能简单,远不如存储器访问指令丰富
      • CPU提供存储器读/写,I/O端口读/写两组控制信号
    • 统一编址:

      image-20200317100453333

      优点:

      • 对I/O口的操作与对存储器的操作完全相同,无需专用的I/O指令
      • 外设数目或I/O寄存器数目几乎不受指令限制
      • CPU读/写控制逻辑较简单

      缺点:

      • 占用了存储器的一部分地址空间
      • 增加了地址译码电路的复杂性

4.4.2. 输入/输出接口的数据传送方式

外设的多样性使外设极其接口电路的差异极大,故而需要多种CPU与外设接口交换信息的方式。常用的数据传送方式包括:


4.4.2.1. 无条件传送方式

也称为同步传送方式,主要用于对简单外设进行操作,所需的硬件和软件都较少

特点

I/O接口电路

image-20200317100927328


4.4.2.2. 查询传送方式

也称为异步查询传送方式

有一些外设,处理器访问时需要关心外设的状态,只有状态许可方可访问外设:

特点

查询流程

image-20200317101154035

I/O接口电路

为了实现状态的查询,接口电路中既要有数据端口,又要有状态端口

image-20200317101448299


4.4.2.3. 中断传送方式

特点

I/O接口电路

image-20200317101652505

中断的概念

中断优先级管理

中断控制方式的接口电路(以输入为例)

image-20200317103255808

当外设准备好输入数据后发出选通信号,数据进入锁存器中,并同时将中断请求触发器置“1”。如果中断屏蔽触发器允许中断(Q1输出为“1”),与门被打开,因而可以产生中断请求信号INT

INTA#为中断响应信号,INTA#到达后将撤销INT请求


4.4.2.4. 直接存储器访问(DMA)方式

问题的提出

基本思路

DMA传送形式

DMA又分为DMA写I/O接口 → 内存)和DMA读内存 → I/O接口)。下图是几种DMA传送形式的示意:

image-20200317103442120

基本步骤

image-20200317103527554

  1. 需要DMA传送的外设发DMA请求DREQ(DMA Request)到DMAC
  2. 若运行,DMACCPU或总线仲裁机构发出总线请求HRQ(Hold Request)
  3. CPU或总线仲裁器若同意总线使用权转移,发总线响应信号HLDA(Hold Acknowledge),并完成总线切换
  4. DMAC接管总线,发DACK通知(也是选定)外设,即将DMA传送的外设
  5. DMAC内存单元地址信号,若是DMA,再发I/O读和存储器写信号;若是DMA,发存储器读信号和I/O写信号
  6. DMA结束后,DMAC撤消HRQCPU或者总线仲裁器撤消HLDACPU重新接管总线

基本工作方式

DMA传送方式的特点


4.4.3. 并行接口

串行与并行


4.4.3.1. 无握手信号的并行接口

无握手信号的并行接口典型电路

image-20200317104531592

采用无握手信号接口连接的外设一般是功能简单的电路模块,如按键,数码显示管等。CPU与这些无握手信号的外设接口传输数据时,总是假定外设总是处于准备好的状态

输入接口示例:线性键盘

image-20200317104955441

输入接口示例:矩阵键盘

image-20200317105044569

image-20200317105101666

输出接口示例:LED显示

image-20200317105210646

输出接口示例:数码管的显示接口电路

image-20200317105335636


4.4.3.2. 带握手信号的并行接口

带握手信号的输入接口电路

image-20200317105434284

  1. 输入设备发出选通信号,将准备好的数据送到接口电路的数据锁存器中,同时使D触发器置“1”并将该信号送到状态缓存寄存器中待CPU查询
  2. CPU读取接口中的状态寄存器,检查状态信息。READY为“1”,说明数据已到数据缓冲寄存器
  3. CPU读数据端口,同时数据端口的读信号将D触发器清零,令READY为“0”,完成本次传送

带握手信号的输出接口电路

image-20200317105508707

  1. CPU读状态口,若BUSY为“0”,说明数据缓存器空,外设可以接收数据
  2. CPU向数据端口写入需发送的数据,同时将接口中的D触发器置“1”,该信号作为状态信号BUSY,一方面通知输出设备:“输出缓冲器满”,外设可以取数据;另外一方面作为状态信号,让CPU了解数据输出的动态
  3. 输出设备发响应信号ACK,一方面从接口的数据锁存器中读出数据;另外一方面将接口中的D触发器清零,再次使BUSY=“0”,完成本次数据传送

4.4.3.3. 可编程并行接口(GPIO)

GPIO模块电路

image-20200317105616209

可编程通用并行接口是计算机及其他数字电路系统中最常使用的一种简单外部设备接口电路。其结构简单、应用途广泛,且可以通过编程控制字来实现控制,故得名“通用可编程I/O接口”,即GPIO(General-Purpose IO ports)

可编程并行接口芯片:Intel 8255A

image-20200317105739220

早期的计算机使用单独的可编程芯片来控制I/O,如英特尔的8255芯片有3个8位并行I/O口,具有3个通道、3种工作方式:

典型嵌入式控制器的I/O端口位接口

image-20200317105909799

微控制器芯片(单片机)往往会集成GPIO接口。一般来说,GPIO接口至少有两个寄存器,即“通用I/O控制寄存器”与“通用I/O数据寄存器”

4.4.4. 串行接口

4.4.4.1. 串行接口概述

概述

串行通信——数据在单条一位宽的传输信道上按时间先后一位一位地进行传送。与并行通信相比,串行通信具有以下特点:

通过Modem实现远程数据通信

image-20200317110205414

串行通信常用于需要远距离传输的情形,然而受限于传输线的特性,数字信号无法在传输线上直接进行远距离传输。一般发送方需要使用调制器(Modulator),把要传送的数字信号调制为适合在线路上传输的信号;接收方则使用解调器(Demodulator),将从线路上接收到的调制信号进行解调,还原成数字信号。调制器和解调器两者通常集成在一起作为一个设备,称为调制解调器(Modem)

调制解调器被称为DCE(Data Communication Equipment,数据通信设备)数据终端被称为DTE(Data Terminal Equipment,数据终端设备)

串行通信的性能参数

串行通信的同步方式

同步技术——能够检测和识别所传送的数据单元(位、字符或字节、帧、数据块等)的起止的技术

根据同步方式,串行通信又分为:


4.4.4.2. 异步串行接口

概述

异步串行数据帧格式

image-20200317110702387

拟传输的数据以字符(一个字符通常含五至八位)为单位进行传送。考虑到传送发生的相对时间是随机的,为了确保整个通信过程的正确性,需要找一种合适的方法,使发送方和接收方在所传送的字符与字符间实现同步。常用的方法:在字符数据格式中设置起始位和停止位

如图。每个字符传输包括:一个起始位(低电平,逻辑“0”)、五至八位有效数据位、一位奇偶校验位、一位(或1.5位,或2位)停止位,停止位(高电平)之后是不定长度的空闲位(高电平)

异步传输信号波形的检测

image-20200317110826390

问题:难以保证收发双方时钟的频率完全相等、相位严格对齐 → 检测困难

解决办法:设约定的波特率为,接收方用频率为的时钟对接收信号进行检测,称为波特率因子,。有些芯片可编程设置,有些固定,如

,接收端检测到一个低电平时,须证实是否的确是起始位。不同的芯片可能采用不同的方法,如:隔八个再检测一次,若仍为低电平则确认是起始位。或连续检测八个,若有五次以上是低电平则确认是起始位而不是干扰

确认了起始位后,从第九个检测脉冲(起始位中间位置)开始,接收端每隔16个脉冲采样一次输入信号,顺序接收各个数据位

异步串行接口电路

image-20200317110952155

异步串行接口电路需要完成的基本功能包括:

发送过程:从数据总线上接收来自CPU的并行数据 → 基于移位寄存器进行并/串转换 → 入起始位、停止位等 → 按特定波特率由TXD发送

接收过程:RXD输入的数据 → 在本地时钟和波特率发生器的控制下,经同步控制器送给移位寄存器 → 串/并转换后进入接收缓存器 → 同时进行错误检测、帧解析并把相关信息写入状态寄存器 → 通过中断告知CPU接收完毕

异步串行接口信号定义

image-20200317111134979

异步串行接口协议

最常见的串行通信标准:RS-232C接口

信号线定义——机械特性、功能特性

image-20200317112417753

image-20200317112437675

标准串口的设置——规程特性

电气特性——负载电容与传输距离

电气特性——PC与一般单片机的串口逻辑电平

RS-422/432标准

RS-485标准

RS232/RS485/RS422对比

image-20200317112939651


4.4.4.3. I2C接口及总线

NXP(Philips) Inter-Integrated Circuit (I2C)

image-20200317113107037

示例:2块芯片通过I2C连接

image-20200317113152483

驱动SDA和SCL线的器件的输出级必须漏极开路(OD门),以实现总线的“线与”功能。使用外部上拉电阻(接电源),以确保当没有器件将线拉低时能保持高电平

I2C接口典型电路

image-20200317113228758

I2C的接口电路一般包括数据寄存器、控制寄存器、状态寄存器、地址寄存器,有些还包括和时钟有关的分频寄存器等

主从式通信方式

多主机总线

image-20200623220856388

I2C的地址

image-20200317113858882

I2C总线采用两线制总线,不具备微机系统所具有的由多位地址线所组成的并行地址总线,通过串行发送地址实现

总线上每一个器件的地址必须是唯一的

I2C标准中有7位地址和10位地址两种

I2C总线协议状态

image-20200317114018574

I2C数据传输过程

I2C电气特性

image-20200317123918497

I2C支持的节点数

I2C操作示例:读取串行EEPROM

image-20200317124202185


4.4.4.4. SPI接口及总线

SPI是一种高速、全双工、同步的通信总线,通信过程使用四根信号线

SPI概述

SPI中主设备与从设备的连接

image-20200317124510436

SPI典型接口电路

image-20200317124554642

SPI数据传输过程

image-20200317124630379

通信过程由主设备发起,从设备参与

当一个主设备需要向从设备发送数据,或者希望读取从设备数据的时候,主设备通过拉低对应从设备的CS#来告知从设备

对于主设备来说,发送数据就是把比特逐个放到MOSI信号线上,而读取数据就是在MISO信号线上进行采样

SPI的四种工作模式

SPI工作状态简单,只有工作空闲两个状态

根据空闲状态对应时钟的高电平还是低电平,以及时钟上升沿和下降沿的动作,可以形成不同四种工作方式

image-20200317124706636

5. ARM处理器体系结构和编程模型

5.1. ARM体系结构与ARM处理器概述

5.1.1. 指令集体系结构与微架构

CA(Computer Architecture):计算机体系结构

CA是堆计算机系统的设计思想、逻辑特征、原理特征、结构特征和功能特征的一种抽象

广义CA=指令集系统结构ISA+微架构μarch+硬件实现

狭义CA=指令集系统结构ISA

指令集体系结构ISA

描述软件如何使用硬件的一种规范和约定,是程序员眼中的概念结构和功能特征,具体地就是程序员编程时能看到或者能用到的资源以及使用方式,包括:

微架构μarch

ISA的硬件实现方式。亦即以何种方式来实现处理器的各种功能,包括运算器、控制器、流水线、超标量和存储系统结构等,属于计算机的组织和实现技术

相同ISA的处理器可以有不同的微架构,如:

只要ISA相同,则软件兼容

处理器体系结构的分类

image-20200409194924081

ISA偏于处理器的软件层面,微架构偏于处理器的硬件层面

基于ISA分类:CISC、RISC

基于微架构分类:冯诺依曼结构、哈佛结构

哈佛结构:

简化哈佛结构:

5.1.2. ARM处理器体系结构简介

ARM体系结构版本特性简介

  1. v1版

    • 与ARM1原型机同时诞生,仅用于ARM1原型机

    • 32位处理器,地址总线只有26条,内存寻址空间64MB,只提供了一些基本指令,如:

      • 基本数据处理指令,没有乘法运算指令

      • 数据存取指令,可以对字节、半字和字数据进行存取

      • 控制转移指令,包括子程序调用及链接指令

        • 链接指令:一种转移指令,转移时将转移指令的下一条指令存入R14寄存器。需要返回时,使用MOV指令将R14寄存器的内容写入PC,就可实现程序的返回
      • 供操作系统使用的软件中断SWI指令

  2. v2版

    • ARM 2的内存寻址空间仍然只有64MB,为了提高数据处理能力,v2版增加了:

      • 乘法运算和乘加运算指令
      • 若干协处理器操作指令
      • 快速中断模式FIQ(优先级高于普通IRQ)
      • 存储器与寄存器之间进行数据交换的SWP(swap)指令,包括字交换指令SWP和字节交换指令SWPB
    • 基于ARMv2版架构的处理器有ARM2、ARM2aS和ARM39

  3. v3架构

    • 有较大改进和完善,32位地址,内存寻址空间扩展到4GB,增加了Cache、新的寄存器和新的指令:

      • 增加了CPSR,不再使用R15寄存器保存程序执行状态

      • 增加了SPSR,用于异常处理时保存CPSR,以便恢复

      • 增加了访问CPSR等特殊寄存器的MRS和MSR指令

      • 增加了从异常处理返回指令的功能

      • 新定义了abort和Undefined两种异常及相应的工作模式

      • 将乘法和乘加运算指令扩展为32位

        • 长乘法运算:32位×32位=64位
        • 长乘加运算:32位×32位+32位=64位
  4. v4架构

    • 基于ARMv4的处理器主要是ARM8和Strong ARM

    • ARMv4T版本——ARM体系架构的一个里程碑

      • 引入16位Thumb指令集:ARM指令集中常用指令经重新编码压缩后的子集
      • 执行时被实时且透明地解压,仍然是32位指令
      • 具有ARM指令集的大部分功能但不如ARM指令集全面,实现某些复杂操作可能需要使用较多的Thumb指令
      • 可提高代码密度,减少存储开销;在数据总线位宽为16位或8位的SOC系统中,可获得更优的性能
      • 新增Thumb状态,与ARM状态可通过指令随意切换
    • v4T版在v3版的基础上所做的完善和扩展:

      • 微架构开始采用流水线方式
      • 增加了系统(System)模式,在该模式下可以使用用户模式寄存器运行具有特权级的系统管理任务
      • 对软件中断指令SWI的功能做了完善
      • 增加了无符号字节以及半字数据的加载/存储指令,如LDRB/STRB(字节)、LDRH/STRH(半字)
      • 增加了有符号字节及半字的加载指令LDRSB/LDRSH
      • 把没有使用的指令空间都作为“未定义指令”,并在UND异常中对其进行处理
    • ARM7T和ARM9T产品系列都基于v4T版

  5. v5架构

    • 微架构方面

      • 增加了DSP,MCU和DSP可以合二为一
      • 可选配矢量浮点处理器(Vector Float Processor,VFP)
      • 增加JazelleDBX (Direct Bytecode eXecution) 的Java硬件加速器(ARMv5TEJ),可直接运行Java虚拟机字节码程序
      • 带有AHB或者AHB Lite总线接口
      • 引入(包括指令和数据)TCM或者TCM接口
      • v5版名称后缀中的字母T、E和J分别表示支持Thumb指令、增强的DSP指令和Java硬件加速技术
    • ISA方面的改进和完善

      • 增加了DSP指令,为协处理器提供了更多可选择的指令
      • 更加严格定义了乘法指令对条件标志位的影响
      • 增加了支持有符号数的加减饱和运算指令(饱和运算是指出现溢出时,结果等于最大或者最小可表示范围)
      • BLX指令,将可返回的转移指令与状态切换合二为一
      • CLZ指令,计算寄存器操作数最高位0(前导0)的个数,可提高归一化运算、浮点运算以及整数除法运算的性能,也使中断优先级排队操作更为有效
      • BRK指令,软件断点指令
    • 基于ARMv5版架构的ARM处理器包含ARM7EJ、ARM9E和ARM10E三个系列产品

  6. v6版

    • 发布于2001年,ARM体系结构又一个重要里程碑

    • 支持ARMv5TEJ所有指令,在多媒体处理、存储器管理、多处理器支持和异常响应等方面引入许多新技术

    • 微架构实现:流水线级数增至8或9级(v6T2),采用动态和静态组合的转移预测方式,准确率可达85%

    • 内核与Cache以及与协处理器之间的数据通路为64位,每个流水线周期可读入2条指令或存放2个连续字数据

    • 增加了增强型的数字信号处理器以及用于功耗管理的IEM(Intelligent Energy Management)部件,在性能和功耗两个方面又有新的突破

    • 在ISA方面,ARMv6版架构增加了以下功能和指令:

      • Thumb-2指令集(v6T2增强版),可以混合执行AMR指令和Thumb指令,兼具两者的优点,可认为是v6版大的进步
      • 新增SIMD指令,使多媒体信号(如左右声道、三基色像素)的处理能力提高了2~4倍
      • 支持混合大小端(Mixed-endian)和非对准(Unaligned)存储访问
      • 采用了名为Trust Zone安全解决方案,在硬件层面划分可信区域和不可信区域,分别运行经认证的代码和未经认证的代码,不同代码具有不同的访问权限
  7. v7版

    • 发布于2004年,ARM体系结构的分水岭

      • 全面支持Thumb-2技术。Thumb-2指令集包括了16位和32位指令,较先前的ARM指令集减少了31%的内存使用量,较原有的Thumb指令集提升了38%性能,并且无需在ARM指令集和Thumb指令集之间来回切换
      • 引入名为NEON的多媒体处理引擎,支持128 位SIMD扩展,性能提升了4倍,以迎合3D图形与手游应用
      • 在处理器的工作状态与操作模式、寄存器组织、异常和中断管理、对操作系统的支持等方面有许多变化,与以往版本有较大的区别,同时也兼顾了与经典ARM处理器软件保存较好的兼容
  8. v8版

    • 首款支持64位指令集的处理器架构

      • 新增加64位指令集,称作A64,并继续支持原有的ARM指令集和Thumb-2指令集,但是改称为A32和T32指令集
      • 新定义AArch64和AArch32两种运行状态,分别执行64位和32位指令集
      • 在ARMv7安全扩展的基础上,新增加了安全模式,支持与安全相关的应用需求
      • 在ARMv7虚拟化扩展的基础上,提供完整的虚拟化框架,在硬件层面上提供对虚拟化的支持
      • AArch64对异常等级赋予新的内涵,并重新解释处理器运行模式和特权等级概念
    • 继续分为ARMv8-A、ARMv8-R和ARMv8-M三种类型

      • v8-A:支持AArch64和AArch32两种运行状态,两种运行状态之间进行切换。除了智能手机和平板电脑传统应用领域之外,开始向通用计算应用领域拓展
      • v8-R:具有快速中断响应能力和确定的中断响应时延,采用容错设计和MPU,支持A32和T32指令集,应用领域均为对实时性和可靠性有着极高的要求的场合
      • v8-M:使用与其他类型不同的异常处理模型,并且只支持T32指令集。主要面向低成本、小体积、低功耗、低中断延迟以及高性能的嵌入式应用
      • 基于上述三种体系结构类型的处理器产品,仍然分为Cortex-A、Cortex-R和Cortex-M三个系列

ARM体系结构的增强型版本

每个基础版还有增强版,支持的指令有区别。在v7版之前,增强版用版本号的字母后缀表示,如:

小结

image-20200409205719792

5.1.3. ARM处理器主要产品系列简介

5.1.3.1. ARM处理器的特点
  1. 固定长度操作码,简化了指令译码,便于流水线设计
  2. 具有多个通用寄存器,指令不局限在某个特定的寄存器上执行,可以实现寄存器组的均匀访问
  3. 操作数地址由寄存器内容或者指令码的位域指定,具有地址自动增减寻址模式,寻址方式灵活,可以优化程序循环结构,程序执行效率高
  4. 每条数据处理指令都可对算术逻辑单元和移位器进行控制,实现ALU和移位器的最大利用
  5. 具有多寄存器加载和存储指令,可实现大数据吞吐量
  6. 所有指令都可以条件执行,以提高代码执行速度
  7. 支持精巧的Thumb指令集(包括Thumb和Thumb-2),提高代码密度,减少所需的系统存储容量

5.1.3.2. ARM处理器相关产品的层次关系

从内到外分为:ARM内核、ARM处理器、MCU或者SOC、以及嵌入式系统四个层级

image-20200409211748721

  1. ARM内核

    • 必备部件

      • CPU,v4T之后均采用流水线技术+转移预测
      • 总线互连矩阵,提供多种数据的并行传送能力
      • 中断管理部件,提供周期确定的低时延中断响应
      • 系统定时器,多任务操作系统必不可少的部件
    • 可选部件

      • 指令和数据Cache或TCM
      • MMU或者MPU
      • 数据/指令跟踪单元
      • 浮点单元、Java硬件加速器、多媒体处理部件
  2. ARM处理器

    • ARM内核的基础上,通过系统总线连接了:

      • 指令存储器,一般是flash
      • 数据存储器,一般是SRAM
      • 协处理器或者协处理器接口部件
      • 扩展RAM控制器,扩展存储器不能与系统总线直接相连,必须通过存储器扩展接口
      • 外设总线桥接器
      • 部分调试跟踪组件
    • 通过外设总线连接

      • 调试访问接口
      • 内核私有外设
  3. MCU和SoC

    image-20200409212344327

    • 以ARM处理器为核心,增加了

      • 扩展存储器
      • DMAC
      • ADC、DAC
      • 脉宽调制PWM
      • 实时时钟RTC
      • 电源监测BOD
      • 串行接口UART
      • ……

5.1.3.3. ARM处理器产品命名规则

体系结构版本与处理器采用两种标识方式,对应关系开始变得较为复杂

常见以及仍在使用的产品与ISA的对应关系:

image-20200409212611977

v7版之前的产品命名规则


5.1.3.4. ARM7系列

分为ARM7(基于v3)和ARM7T(基于v4)两个子系列,获得广泛应用的是ARM7T


5.1.3.5. ARM9系列

分为ARM9T和ARM9E两个子系列


5.1.3.6. ARM11系列

5.1.3.7. Cortex-A

5.1.3.8. Cortex-R

5.1.3.9. Cortex-M

5.2. Cortex-M3/M4处理器结构

5.2.1. Cortex-M3/M4处理器概述及指令集架构

5.2.1.1. Cortex-M3/M4主要特性

基于v7M版本架构,三级流水线(取指、译码和执行),哈佛结构。主要特性如下:

带有系统节拍定时器Systick,可为操作系统所需的定时提供周期性的定时中断

双堆栈指针,操作系统和应用任务使用不同的堆栈

特权和非特权访问等级

Cortex-M4可以选配单精度FPU,其功能主要包括:

Cortex-M4指令集增加了DSP扩展,例如:

Cortex-M3也有几条MAC指令,但不是单周期的


5.2.1.2. Cortex-M3/M4所支持的指令集

Cortex-M4可看作Cortex-M3的增强版,两者都支持Thumb-2技术,但所支持的指令集有差异

image-20200414110334295

image-20200414112853371

5.2.2. Cortex-M3/M4处理器结构

image-20200414112920878

按各部件作用以及与总线系统的连接关系,整个处理器系统可以分为内核、处理器和系统三个层级


5.2.2.1. 内核

包括CPU、NVIC、Systick以及可选的指令跟踪接口

Cortex-M4内核可选配FPU

  1. CPU

    • 32位微处理器,取指、译码、执行三级流水线
    • 哈佛结构,指令和数据两条总线
    • 三个关键部件:ALU、控制单元CU和寄存器阵列
  2. NVIC和Systick

    • 经典ARM处理器只有9中异常类型和6级优先级

    image-20200414113135227

    • 若IRQ不止1个,经典ARM处理器需要另配VIC
    • Cortex-M系列处理器的异常/中断处理较经典ARM处理器有很大改进,内核集成了一个与CPU紧耦合的NVIC,可对大多数系统异常、所有外部中断(最多240个)以及一个NMI进行全面管理
    • 此外,内核还集成了一个简单的倒计时计数器Systick,负责产生类型号为15的系统定时异常(中断)
  3. FPU

    • Cortex-M4可选配FPU,支持符合IEEE 754-2008标准的单精度浮点运算,该浮点单元主要特性包括:

      • 由32个32位寄存器组成的浮点寄存器组,可以单独用作32个寄存器,也可以被成对用作16个双字寄存器
      • 支持的转换指令包括“整数↔单精度浮点”、“定点↔单精度浮点”、“半精度↔单精度浮点”
      • 浮点寄存器组和存储器之间的单精度和双字数据的传输
      • 浮点寄存器组和整数寄存器组之间的单精度数据的传输
    • Cortex-M4的FPU不支持双精度浮点运算、浮点余数以及二进制与十进制之间的转换,如若需要只能另外编写程序实现

    • Cortex-M4的浮点运算指令的助记符都是以v开头

    • FPU一般位于处理器内核与协处理器之间,带有状态控制寄存器,用以标明FPU当前运行状态,并可通过编程对其进行控制

    • 为了与其他协处理器的管控方式一致,FPU被看作协处理器,并通过协处理器访问控制寄存器CPACR(Co-processor Access Control Register)对其进行管理和控制

    • CPACR寄存器中CP10CP11两位负责对FPU进行管理,所以有时也将FPU看作协处理器CP10和CP11

    • 通过对CPACR寄存器中CP10和CP11两位的置位或者复位操作,可以使能或禁用FPU

    • 经典ARM处理器有单独的特殊寄存器访问指令MCR和MRC,实现对协处理器的操作控制和数据交换

    • 与经典ARM处理器不同,Cortex-M4拥有专门的浮点运算和数据传送指令,实现浮点的读取、运算和写回

    • 在Cortex-M4的三级流水线中,FPU和CPU共用取指阶段在译码和执行阶段则二者并行执行

    image-20200414113420125


5.2.2.2. 处理器
  1. 总线交换矩阵

    • 基于AHB总线协议的交换网络
    • 通过总线矩阵,Cortex-M3/M4面向各种存储器、片上和片外不同类型的设备、以及调试组件提供了多条总线,可以让数据和指令在不同的总线上并行传送(只要不是访问同一个器件)
    • Cortex-M3/M4的总线矩阵还包含一个写缓冲区,可以加快存储器写操作的速度
    • Cortex-M3/M4处理器的系统总线基于AHB-Lite总线协议,总线上只有一个主设备,无需使用总线仲裁
  2. MPU

    • Cortex-M3/M4都可以选配
    • 通过MPU可以把存储空间划分为最多8个Regina(区域),但是区域之间可以重叠
    • 各个区域的存储特性和访问权限可以通过编程定义
    • 如果使用了嵌入式操作系统,MPU由操作系统管理,给每个任务分配不同的存储区域以及访问权限,防止某个应用任务对操作系统或者其他任务的数据造成破坏
    • 在没有操作系统的简单应用中,也可以通过MPU设定需要保护的存储区域和访问权限。例如,把某些存储空间设置为只读属性或只有特权用户才能访问,以提高系统的安全性和可靠性

5.2.2.3. 处理器系统

在处理器基础上,再选配唤醒中断控制器WIC以及若干调试组件之后,就构成Cortex-M3/M4处理器系统

  1. WIC

    • 为了减少功耗,Cortex-M处理器引入“睡眠”和“深度睡眠”两种模式

      • 处于睡眠模式时,关闭大部分模块/部件的时钟
      • 在深度睡眠模式时,系统时钟和Systick也被关闭
      • 有些产品还采用了SRPG(State Retention Power Gating)电路。深度睡眠模式时包括内核和NVIC在内大部分电路都处于掉电状态,以进一步减少功率消耗
    • 不同工作状态下的电流消耗

      image-20200414113807017

    • WIC的电路非常小巧,通过专有接口与NVIC以及电源管理单元PMU(Power Management Unit)相连

    • 只有在处理器处于深度睡眠模式时,WIC才会使能,此时,如果出现NMI或者未被屏蔽的IRQ时,WIC触发PMU单元,将整个系统唤醒

      image-20200414113840994

  2. 调试组件

    • 经典ARM处理器也有多种调试组件,大都带有JTAG接口,并通过JTAG接口实现对寄存器和存储器的访问

    • 从v7开始,ARM处理器采用了一种命名为Core Sight全新的调试架构。Core Sight调试架构涵盖了调试接口协议、调试总线协议、调试部件控制、安全特性以及跟踪接口等

    • 在Cortex-M3/M4处理器中,调试过程是由NVIC和若干调试组件协作完成的。NVIC中有一些用于调试的寄存器,通过这些寄存器对处理器的调试动作进行控制,如停机(halting)和单步执行(stepping)等

    • Cortex-M3/M4可以选配多种调试组件,这些调试组件提供了指令断点、数据观察点、寄存器和存储器访问、性能分析(profiling)以及各种跟踪机制,如:

      • ETM:嵌入式跟踪宏单元 Embedded Trace Macro-cell
      • ITM:指令跟踪宏单元 Instrumentation Trace Macro-cell
      • DWT:数据观察点和跟踪单元 Data Watchpoint and Trace
      • FPB:Flash地址重载和断点单元 Flash Patch and Breakpoint Unit
      • TPIU:跟踪端口接口单元 Trace Port Interface Unit
      • ROM表:类似于调试组件的“注册表”
    • Cortex-M3/M4处理器中的调试组件

      image-20200414114224571

    • 调试(Debug):是指通过调试接口读取或修改处理器内部的寄存器或存储器的内容,或者发布一些调试命令,让处理器执行某些调试动作,如暂停、单步执行或者断点执行等

    • 跟踪(Trace):是指在程序运行期间,无需停止处理器正常的指令执行流程,由相关的跟踪组件实时收集处理器在指令执行过程中产生的各种运行信息,并通过跟踪接口实时输出到外部调试主机中,再由调试分析软件(如Keil)对这些信息进行分析

    • 在Core Sight的调试架构中,ETM、DWT和ITM等调试组件都属于跟踪数据源(Trace Source),负责收集处理器运行过程中产生的各种调试信息

    • TPIU属于调试信号汇集点部件,负责将汇集的调试信息进行格式转换和打包之后,再通过跟踪端口输出到外部的调试主机(PC机)

    • Cortex-M3/M4处理器中的调试信息流向图:

      image-20200414114317928

    • DAP(Debug Access Port)

      • 在CoreSight调试架构中,定义了处理器内部的调试访问接口AP外部调试端口DP。AP接收来自DP的调试命令,并将这些命令转换成对处理器内部各寄存器和存储单元的访问。DP和AP合称为调试访问端口

      image-20200414114401092

    • SWJ-DP和SW-DP

      • SWJ-DP(Serial Wire JTAG DP):基于JTAG协议的串行调试接口,有4条线
      • SW-DP(Serial Wire DP):CoreSight调试架构新增加的串行接口,只有2条线
      • Cortex-M3/M4支持以上两种调试接口,芯片制造商可以根据需要选择其中的一种或者两种

      image-20200414114440031

5.2.3. 存储器管理

Cortex-M3/M4没有Cache或者TCM,而是通过多条总线连接片上各种不同类型和容量的存储器件

如果需要进一步扩展存储容量,还可以通过存储器接口控制器,连接片外大容量存储器

5.2.3.1. 存储器管理特性

5.2.3.2. 存储器映射

所有基于ARMv7M的Cortex-M系列处理器,都采用相同的存储器映射关系方式(存储区域划分)

image-20200420144618340

  1. CODE区

    image-20200420144858791

    • 只能被I-CodeD-Code总线访问,为使两条总线能够同时访问,CODE区可使用两个独立的存储器
    • 最低端部分使用flash器件,用于存储程序代码
    • 另外一部分使用SRAM,存储重要数据I-Code和D-Code对CODE区的所有空间都能访问
    • 只要不是同时访问同一个存储器,两条总线上可以同时传输数据
    • 但是,为了降低成本,许多SOC芯片并没有在CODE区部署SRAM
  2. SRAM区

    • 片上主存储区,存放数据
    • 由AHB-Lite系统总线管理
    • 许多芯片制造商只使用SRAM区存放数据
  3. 外设区

    • 片上外设连接到系统总线上
    • 片外设备与APB总线相连,APB与AHB之间有一个总线桥
  4. 外部RAM区

    • 通过RAM控制器连接片外扩展RAM,可使用的RAM类型取决于RAM控制器
  5. 内核私有区域

    image-20200420155202963

    • 内部私有外设,包括调试组件ITM、DWT和FPB,以及系统控制区SCS

      • 系统控制空间SCS

        • 位于内核私有区域,0xE000 E000~0xE000 EFFF,64KB
        • 该区域集中了NVIC、Systick、FPU和MPU等在内的各种系统部件的寄存器组,只有特权访问等级才能访问
    • 外部私有外设,包括调试组件ETM、TPIU和ROM表,以及外部PPB总线

    • 芯片厂商定义的存储区

    Cortex M系列处理器采用这种统一的地址映射方案,有助于提高设备之间的软件可移植性和代码可重用性

    虽然有明确的存储区域划分,但仍具灵活性,例如:

    • 程序代码既可以存放CODE区域,也可以存放在AHB总线所连接的SRAM中,但影响指令执行性能
    • 芯片制造商也可以在CODE区域使用SRAM存储器

5.2.4. 总线系统

Cortex-M3/M4总线结构

image-20200420155404443

5.2.4.1. 总线系统结构

5.2.4.2. 各类总线的连接对象

image-20200420160535531

AHB总线互联矩阵属于处理器内核设备

CODE区的总线矩阵或者总线复用器是ARM公司提供的两种不同的选件,其作用是让I-Code和D-Code都能够访问CODE区的flash和SRAM

片上SRAM也称为主SRAM,应该连接到系统总线上,使其位于SRAM区,以便可以使用位带操作

5.2.5. 异常与中断处理

5.2.5.1. 嵌套向量中断控制器NVIC

Cortex-M3/M4处理器集成了一个与CPU紧耦合的嵌套中断控制器NVIC总共可以管理:

支持的异常与中断处理种类

image-20200420160949188

异常与中断处理

image-20200420161032920

注意:CMSIS的中断编号0对应的是IRQ#0,中断编号239对应的是IRQ#239;而编号为负数的-15到-1依次对应的是复位到SYSTICK等系统异常

配置了NVIC之后,Cortex-M3/M4具有以下异常处理特性:

Cortex-M3/M4 和NVIC使用了多个可编程寄存器

关于中断嵌套

5.2.5.2. 中断向量表

image-20200420161905384

5.2.5.3. 系统节拍定时器SysTick

5.3. Cortex-M3/M4的编程模型

所谓处理器的编程模型(Programmer’s model),就是程序员所看到的处理器的工作状态操作模式以及以寄存器为主的各种资源

Cortex-M3/M4处理器的编程模型与经典ARM处理器有较大差别,例如:

经典ARM处理器支持以下7种运行模式:

image-20200420162327790

Cortex-M3/M4对这些模式进行了化简与合并

5.3.1. 操作状态与操作模式

image-20200420163404865

5.3.1.1. 操作状态

Cortex-M3/M4有两种操作状态,分别是:

调试状态仅用于调试操作,可以通过两种方式进入调试状态:

  1. 调试器发起暂停请求
  2. 处理器中的调试部件产生的调试事件

在调试状态下,调试器可以访问或修改处理器中寄存器的数值

无论在Thumb状态还是调试状态下,调试器都可以访问系统存储器,包括位于处理器片内和片外的各种外设


5.3.1.2. 操作模式和特权等级

操作模式也称为处理器工作模式或者运行模式,Cortex-M3/M4把经典处理器的7种运行模式归并为两种:

关于特权访问等级和非特权访问等级

系统启动后处于特权线程模式,在此模式下,可以对特殊寄存器CONTRL写操作,将处理器从特权线程模式切换到非特权线程模式

但是非特权线程模式不能访问CONTRL寄存器,因此不能采用类似方式回到特权线程模式

处理模式和线程模式的编程模型也很类似,不过线程模式可以切换使用独立的进程栈指针PSP,使应用任务的栈空间和操作系统的主栈空间相互独立,可提高系统的健壮性和可靠性

Cortex-M系列处理器启动后默认处于特权线程模式以及Thumb状态

对于简单应用,一般都使用特权线程模式主栈指针

基于ARMv6-M版本架构的Cortex-M0处理器不支持非特权线程模式,Cortex-M0+处理器只是将其作为一个可选项

5.3.2. 常规寄存器

Cortex-M3/M4处理器种常规寄存器共有16个,其中13个为32位通用寄存器,其他3个为堆栈指针、链接寄存器和程序计数器

经典ARM处理器的寄存器:

image-20200420182631045

Cortex-M3/M4处理器中常规寄存器的分组

image-20200420182724872


5.3.2.1. 通用寄存器:R0~R12

分为2组:

系统复位后,R0~R12的初始值均未定义

为实现汇编程序与C语言程序的相互调用,AAPCS(ARM Architecture Procedure Call Standard)规定:


5.3.2.2. 栈指针:R13

Cortex-M3/M4处理器采用双堆栈设计,有两个物理上的栈指针,也就是有两个R13寄存器,一个是主栈指针MSP,另一个是进程栈指针PSP,对于一般程序而言,两个栈指针只有一个可见

MSP为默认栈指针,在系统复位后处理器处于处理模式时,处理器使用MSP;PSP只能用于线程模式,栈指针的选择是通过特殊寄存器CONTROL设定

在大多情况下,对于不使用操作系统的许多简单而言,没有必要使用PSP,只需使用MSP即可

系统复位之后,PSP的初值未定义,而MSP的初值存放在整个存储空间最开始(中断向量表)处第一个字中,在系统初始化时,需要将其取出并对MSP进行赋值

尽管v8版架构之前的ARM处理器都是32位的,PUSH和POP操作也是以字为单位进行的,堆栈采用字(4字节)对齐方式即可

考虑到64位双精度浮点数的压栈问题,AAPCS规范要求堆栈应该采用双字(8字节)对齐方式

在Cortex-M3/M4处理器中,通过对系统控制块SCB(System Control Block)中的配置控制寄存器CCR(Configuration Control Register)进行操作,可以使能或禁止双字栈对齐特性

无论是采用字对齐还是双字对齐,MSP和PSP的最低两位总是为00,对这两位的写操作不起作用


5.3.2.3. 链接寄存器:R14

用于保存函数或子程序调用时的返回地址,在函数或子程序结束时,LR中的数值用于调用返回

在异常处理时,LR中将自动保存返回地址EXC_ RETURN,异常处理结束用于异常/中断返回

如果是嵌套调用,调用时需将LR中的数值压栈保存

由于Cortex-M3/M4中有16位指令,指令有时会对齐到半字地址,即便如此,返回地址总是偶数LR的最低位默认为是0


5.3.2.4. 程序计数器:R15

基于x86处理器的PC机中,不允许对代码段寄存器CS以及指令指针IP进行写操作,CS和IP不能作为数据传送和数据处理指令的目的操作数,程序转移或者过程调用只能通过专门的指令来实现

但是在ARM处理器中,PC不仅可读而且可写

在Cortex-M3/M4中,由于指令必须对齐半字或字,作为代码地址,PC的最低位总是认为是“0”

需要注意的是,无论使用跳转指令还是直接写PC寄存器,写入值必须是奇数,确保其最低位是“1”,以表示其处于Thumb状态,否则将被认为试图转入ARM模式,从而导致出现错误异常

当使用高级编程语言(包括C和C++)时,编译器会自动将跳转目标的最低位置“1”,无需担心出错

再次强调:PC最低位为“1”,只是表示处于Thumb状态作为指令地址,PC最低位始终被认为是“0”


关于寄存器的名称

使用ARM汇编指令编程时,在汇编代码中出现的上述寄存器可以使用不同的名称,如大写、小写或者大小写混用,常用的汇编工具(如Keil MDK-ARM和ARM ADS)都能对其进行识别

image-20200420184250649

5.3.3. 特殊寄存器

image-20200420185358537

除了常规寄存器,Cortex-M3/M4处理器中,还有多个特殊寄存器,分别是:

特殊寄存器没有映射到内存空间,只能利用MSR/MRS指令通过名字对其进行访问,例如:

注意特殊寄存器与“特殊功能寄存器(SFR)”的区别,后者一般用于I/O控制的寄存器

CMSIS-core也提供了用于访问特殊寄存器的函数。在使用C或C++等高级开发简单应用时,可能不太需要这些特殊寄存器;如果开发需要在嵌入式操作系统环境下运行的应用程序,并且需要高级中断屏蔽特性时,就需要访问这些特殊寄存器


5.3.3.1. 程序状态寄存器

在ARM7TDMI为代表的经典ARM处理器中,采用了CPSR和SPSR两个程序状态控制器。CPSR保存当前程序状态SPSR用于在异常/中断处理时保存CPSR的状态,以便异常返回后能够恢复处理器的工作状态

从ARMv7版架构开始,ARM采用了新的程序状态寄存器PSR,读取PSR的结果实际包含了APSR、EPSR和IPSR三个状态寄存器内容,因此,有时也将PSR称为xPSR(表中GE[3:0]只有Cortex-M4中有)

image-20200420185612298

PSR中各个标志位的含义如下:

image-20200420185645135

Cortex-M3/M4的PSR与经典ARM处理器的CPSR有较大差异,下图给出几种ARM处理器PSR的对比:

image-20200420185739150

与ARM7TDMI的CPSR相比:


5.3.3.2. 三个中断屏蔽寄存器

PRIMASK、FAULTMASK和BASEPRI三个寄存器的用途是为了实现基于优先权等级的异常/中断屏蔽

关于Cortex-M3/M4处理器的异常优先级:

下图为三个中断屏蔽寄存器的编程模型,可以看出PRIMASK和FAULTMASK都只有一位

image-20200420185856268

PRIMASK

FAULTMASK

BASEPRI


5.3.3.3. CONTROL寄存器

用于选择线程模式的特权访问等级以及栈指针

Cortex-M3/M4和Cortex-M0/M0+的CONTROL寄存器的编程模型如下图所示

image-20200420190631844

CONTROL寄存器各位的含义:

复位后,CONTROL寄存器被恢复成默认值0

特权线程模式与非特权线程模式的切换过程:

image-20200420191943525

对于简单应用,可以一直运行在特权线程模式下,无须修改CONTROL寄存器的数值,并且只使用MSP

image-20200420192010494


5.3.3.4. 系统控制块SCB

系统控制块SCB是由多个寄存器组成的一个数据结构,属于Cortex-M3/M4内核的一部分并被综合到NVIC中

SCB中各类寄存器的作用包括:

SCB的各类寄存器被映射到SCS中,地址范围:0xE000 ED00 ~ 0xE000 ED88

5.3.4. 堆栈结构

5.3.4.1. 堆栈的作用和堆栈类型

堆栈简介

堆栈的作用

堆栈的类型


5.3.4.2. Cortex-M处理器的堆栈模型

许多经典ARM处理器及ARM T32指令集可支持四种堆栈类型,但是,Cortex-M系列处理器只能使用满递减(FD)类型

image-20200420193521265

处理器在启动或者复位后,系统初始化程序从位于内存最开始处的flash中,取出地址为0x0000 0000的第一个字,作为主栈指针MSP的初始值

每次PUSH操作时,处理器将SP的值减去4,然后将需要压栈保存的数据存储在SP指向的位置

每次POP操作,SP所指向的存储器数据被读出,然后SP的数值自动加4,指向POP之后新的栈顶位置

PUSH和POP操作应“匹配”,防止“张冠李戴”导致系统混乱甚至崩溃

如果Cortex-M3/M4处理器使能了双字栈对齐模式,当出现异常时,假如压栈操作之后堆栈指针没有对齐到双字边界,将如何处理?


5.3.4.3. Cortex-M3/M4处理器中的双堆栈

Cortex-M3/M4的双堆栈设计有MSP和PSP两个堆栈指针,分别服务于不同的操作模式和特权访问等级

CONTROL寄存器中nPRIV和SPSEL的不同组合,两个堆栈共有4种场景,其中前三种比较常见

image-20200420193739699

如果使用双堆栈,应通过MPUSRAM中建两个区域

Cortex-M3/M4的堆栈是满递减类型,因此两个栈指针的初始值应该是两个区域的最大地址

如果采用双字对齐栈顶应位于双字边界上,MSP和PSP最低3位为000

image-20200420193838599

Cortex-M系列处理器的堆栈空间一般位于系统主存储器SRAM区(也可以放置在CODE区中通过D-Code总线的连接的SRAM中)

用于堆栈的存储区需要事先做好规划,预留足够的空间,以防出现堆栈溢出

MSP的初始值事先存放在0x0000 0000处,该位置通常位于I-Code总线所连接的flash中,系统上电或者复位之后,系统初始化程序完成MSP的初始化

PSP的初始化需要另外编程实现,PSP的初始化宜使用汇编指令代码,简单高效而且不易出错

示例:

5.4. Cortex-M处理器存储系统

5.4.1. 存储器映射

所有基于ARMv7M的Cortex-M系列处理器,都采用相同的存储器映射关系方式(存储区域划分)

image-20200428095044184

位段区

Cortex-M3/M4在SRAM区和片上外设区,各有一个位段区和位段别名区

image-20200428095153925

系统控制区SCS

4KB,早期归属于NVIC,所以也称为NVIC区

除NVIC以外,SCS还映射了SysTick、MPU、SCB和FPU等部件的寄存器

image-20200428095634989

image-20200428095730301

不同存储器区域的用途

image-20200428095814787

5.4.2. 连接存储器和外设

为提高性能,CODE区使用专门的I-Code和D-Code总线,I-Code、D-Code和系统总线可以并行执行

该结构也会加快中断响应速度,中断响应时,读取中断向量、取指和压栈操作可以同时执行

此外,一些芯片制造商也会在MCU中增加自行设计的Flash访问加速器

image-20200428095923323

示例:Flash访问加速器

意法半导体(ST Microelectronics)的STM32F2(基于Cortex-M3的微控制器)和STM32F4(基于Cortex-M4的微控制器),在I-Code和D-Code总线接口处实现了Flash访问加速器

image-20200428095959576

总线矩阵示例:NXP公司LPC1700

AHB Lite协议仅适用于单主控设备的情形,有些产品用“总线矩阵”或“多层AHB”等术语来描述芯片内部支持多主控设备总线系统。对多主控设备的支持未在AHB Lite协议中定义

image-20200428100059606

5.4.3. 存储器的端模式

网路传输、文件存储均有大端小端问题

在C语言下如果使用指针也需要注意大小端的问题

image-20200428100146385

Cortex-M3/M4支持两种端模式

大端:字节不变大端和字不变大端

image-20200428100252933

区别:数据传输时字节通道不同。字节通道指高低字节与总线上高低位数据线的映射关系,字节通道与存储系统设计相关

Cortex-M缺省支持小端模式

小端模式下,Cortex-M3/M4和经典ARM处理器的字节通道都是相同的

image-20200428100934453

Cortex-M处理器中:

5.4.4. 非对齐数据的访问

Cortex-M的存储器系统是32位的,但处理器访问或处理的数据大小可能是32位(字)、16位(半字)或者8位(字节)的

大部分经典ARM处理器只允许对齐传输

Cortex-M3和Cortex-M4处理器中,大部分存储器访问指令还支持非对其数据传输

image-20200428101044830

非对齐的注意事项:

5.4.5. 位段操作

5.4.5.1. 位段与位段别名

位段(也称作位带)操作:一次存储器操作只访问一个位

Cortex-M3/M4处理器中,有两个位段区域:

位段别名& 位段别名区域

位段别名地址数据的LSB位段区存储单元的某一个位

位段区域的存储单元可以像普通存储器一样访问,还可以通过名为位段别名的一块独立的存储器区域进行位段访问

使用位段别名地址访问存储器时,所得到字数据的最低位LSB即对应位段区域中某个特定的位

1 MB位段区映射为32 MB位段别名区域。如0x2000 0000地址的字节数据的8个比特被映射到0x2200 0000 ~ 0x2200 001C处的别名区域

image-20200428101336008

外设区域的位段别名地址如图所示,若读取别名地址0x4200002C,则返回结果可能是0x00000000或0x0000 0001,分别代表0x4000 0000位置字数据的第11位取值为“0”和“1”

image-20200428104014349

修改某一位

没有位段特性时,只能”读 → 改 → 写“

位段操作可以帮助用户完成“读写”

示例:将地址为0x2000 0000的字数据的第2位置1

image-20200428104141957

读取特定位

没有位段特性时,只能先读取字节/半字/字数据,再使用其他指令提取某一位,至少需要两次操作

位段操作可以简化程序

例:读取地址为0x2000 0000字数据的第2位

image-20200428104231433


5.4.5.2. 位段操作的优点

操作的原子性:操作过程不会被其它事务打断

简化转移决断过程


5.4.5.3. C程序实现位段操作

可以在C程序中声明存储器位置的地址和位段别名

5.4.6. 存储器访问权限

Cortex-M3/M4默认的存储器访问权限

image-20200428105606904

5.4.7. 存储器访问属性

Cortex-M3/M4处理器的存储器访问属性:

可缓冲

Cortex-M3/M4支持总线接口的写缓冲

image-20200428105835897

可缓存与可共享

image-20200428105926908

存储器按访问属性分类

按照可缓冲和可缓存属性,存储器分为以下三类:

image-20200428110006413

现有多数基于Cortex-M3/M4的微控制器,只有可执行可缓冲属性会影响到应用程序的执行

代码顺序存储器操作完成顺序

A1和A2是两条前后相连的存储器访问指令,A1指令在前,A2指令在后,当A1、A2指令所访问的存储器类型不同时,这两条指令实际存储器访问的先后顺序如表所示

image-20200428110123649

存储器系统会确保”强序“类型存储器和”器件“类型存储器的访问顺序

各存储器区域的默认访问属性

image-20200428110149781

5.4.8. 排他访问

在多用户操作系统中,当多个用户共享某个特定资源时,常利用信号量(semaphore)进行协调。若某共享资源只能满足一个用户使用时,被称为互斥体(Mutex)

排他写过程

排他访问需要软硬件配合才能完成,一次排他写过程需要先用排他读指令获取拟访问地址是否被锁定的信息;未被锁定时才可进行排他写并设置锁定状态

image-20200428110405856

5.4.9. 存储器屏障

利用存储器屏障指令,程序员可以控制不同指令存储器访问的先后顺序

Cortex-M处理器不会调整程序中指令执行的顺序(在超标量处理或支持乱序执行的高性能处理器中可能会出现调整),同时,AHB Lite和APB协议较为简单,不允许在前面的传输还未完成时就开始新的传输

但是,为提高处理器性能,Cortex-M3/M4增加了写缓冲,写操作可能会和下一条指令的操作同步执行

存储器屏障指令可以用于

Cortex-M3/M4支持三种存储器屏障指令

5.4.10. MCU中的存储器系统

在许多MCU中,芯片制造商还集成了其他一些存储器特性,以提高存储器映射的灵活性,例如:

很多情况下,MCU中除了CODE区的Flash之外,还有一个单独的ROM(也可能是Flash),其中包含了Bootloader,其功能包括:

对于具有Bootloader ROM的芯片,系统上电时执行的是Bootloader ROM中的引导程序,因此Bootloader ROM应该位于地址0x0

但是,系统再次启动时,可能不再运行Bootloader ROM中的程序,而是运行Flash中的程序。因此,可以使用下图所示电路修改存储器的映射关系

image-20200428111602492

以上切换操作称为存储器重映射(Memory Remap),由Bootloader实现。但是,在重映射切换的同时无法跳到Bootloader新地址。因此,可采用一种名为“存储器别名”的方法,从两个不同的位置访问Bootloader

有多种存储器配置方法,下图只是其中的一种

image-20200428111646350

5.5. Cortex-M处理器的异常处理

5.5.1. Cortex-M异常管理模型

5.5.1.1. 异常类型

image-20200428112600484


5.5.1.2. 异常状态

image-20200428112614725


5.5.1.3. 异常处理程序

image-20200428112628581


5.5.1.4. 异常向量表

当Cortex-M处理器接受了某异常请求后,处理器需要确定该异常对应的异常处理程序的起始地址。该信息位于存储器内的异常向量表中,向量表默认从地址0x0000 0000开始,按照异常类型号依次存放各个异常的入口地址

image-20200428112735876


5.5.1.5. 异常的优先级

Cortex-M3/M4中,每一个中断都有一个8位的中断优先级(配置)寄存器(0xE000E400~ 0xE000E4EF,位于NVIC中),实际使用位数3~8位,取决于MCU设计的中断数量

优先级的减少通过去除优先级配置寄存器的最低位(LSB)实现,有两种不同的移除方法:

image-20200428114151251

每一个中断的优先级由各自的中断优先级寄存器定义,中断优先级寄存器可以按照字节/半字/字进行访问

若设计中实现了4位优先级,优先级配置寄存器如下,会得到16个可编程优先级

image-20200428114657751

实际使用的位数越多,可用的优先级越多

若出现优先级相同的异常同时发生,处理器将优先处理异常类型号低的,称之为”自然顺序优先级“

复位后的初识状态:


5.5.1.6. 中断优先级分组

优先级寄存器3~8位又分为两部分(以8位为例)

image-20200428115037828

AIRCR(0xE000 ED0C)的PRIGROUP位域(AIRCR[10:8]),使用3位定义优先级分组的8种配置方案

image-20200428115204208

若优先级配置寄存器的宽度不同,设置优先级分组的方法:

image-20200428115234303

  1. 优先级配置寄存器的宽度为8,优先级分组为配置0

    image-20200428115321060

  2. 优先级配置寄存器的宽度为3,优先级分组为配置1

    image-20200428115338672

  3. 优先级配置寄存器的宽度为3,优先级分组为配置5

    image-20200428115356722


5.5.1.7. 异常流程

异常处理的过程包括:中断响应中断处理中断返回

  1. 异常请求的接受

    处理器接受请求的条件:

    • 处理器处于运行状态
    • 异常处于使能状态
    • 异常的优先级高于当前等级
    • 异常没有被屏蔽(如没有设置PRIMASK)

    注意:若异常处理程序中出现了SVC指令,而该异常的优先级不低于SVC的优先级,就会发出硬件错误,从而进入硬件错误的处理程序

  2. 异常进入流程

    异常进入流程包括如下操作:

    • 多个寄存器的值和返回地址被压入当前使用的栈

      • 在不保护浮点运算寄存器组情形下,被压入堆栈的寄存器包括PSR、PC、LR、R0~R3、R12,共8个字
      • 如果需要保护浮点运算单元状态,则有26字的状态会被压栈
      • 若处理器处于线程模式且正在使用进程栈指针(PSP),则PSP指向的堆栈区域就会用于该压栈过程,否则就会使用主栈指针(MSP)指向的堆栈区域
    • 从向量表中取出异常向量

    • 取出异常处理程序中的指令

    • 更新多个NVIC寄存器(后续介绍)和内核寄存器(PSR、LR、PC及SP)

    根据压栈时实际使用的栈,MSP或PSP的数值会在异常处理开始前自动调整。PC也会被更新为异常处理的起始地址,而LR则会被更新为名为EXC_RETURN的特殊值

    EXC_RETURN服务于异常返回,其数值为32位,高28位为1,低4位用于指示进入异常是保存的状态信息(即指示使用的是MSP还是PSP,哪些寄存器被压入栈),其可能的数值如下所示

    image-20200428120212548

    在异常进入过程中,硬件自动完成的处理有:

    • 根据压栈时实际使用的栈,MSP或PSP的数值会在异常处理开始前自动调整
    • PC被更新为异常处理的起始地址
    • LR被更新为EXC_RETURN
    • R0~R3、R12,LR、PC(返回地址)和PSR共8个寄存器被压栈(注意:压栈顺序和栈帧结构不同
    • 如果需要压栈保存FPU状态,则共有26字
    • 如果使能双字栈对齐,可能还会修改已入栈的PSR[9]

    为加快中断执行速度,需要调整压栈顺序:

    • 压栈时为了尽快更新PC,首先压栈的是PC(返回地址)和PSR,出栈时为了尽快恢复处理器状态和返回主程序,出栈时也应先出栈PSR和PC,这时需要根据压栈时实际使用的栈,MSP或PSP的数值会在异常处理开始前自动调整

      image-20200428115807025

    • 此外,如果中断向量位于CODE区,压栈的同时可以使用I-Code总线取中断向量,以充分利用哈佛结构的优点;如果中断向量位于SRAM区或者RAM区,压栈和取向量只能都是用系统总线,会略微增加中断响应延迟

  3. 执行异常处理程序

    • 进入异常处理程序内部后,处理器进入处理模式,并运行于特权访问等级,栈操作使用MSP
    • 此过程中如果有更高优先级的异常产生,处理器会接受新的中断,当前正在执行的处理被更高优先级的处理抢占而进入挂起状态,此即异常嵌套
    • 若执行过程中产生的其他异常具有相同或更低的优先级,新产生的异常就会进入挂起状态,待当前异常处理完成后才可能被处理

    在异常处理的结尾,程序代码执行的返回会引起EXC_RETURN数值被加载到程序计数器PC中,并触发异常返回机制

  4. 异常返回

    Cortex-M处理器的异常返回机制由EXC_RETURN触发,该数值在异常入口处产生且被存储在LR中

    EXC_RETURN写入PC时,就会触发异常返回流程

    异常返回可由表中所示的指令产生。异常返回机制被触发后,进入异常期间被压入栈中的寄存器数值会被恢复到寄存器组中,因而多个NVIC寄存器和处理器内核中的寄存器(如PSR、SP和CONTROL)都会被更新

    image-20200428120149568

加速中断处理速度——咬尾中断

情形描述:

image-20200428120413093

咬尾中断:

image-20200428120458030

加速中断处理速度——晚到中断

情形描述:

晚到中断:

image-20200428120604461

5.5.2. 向量表重定位机制

向量表重定位简介

向量表重定位的实现

在Cortex-M3/M4 处理器所集成的NVIC中,有一个名为VTOR(Vector Table Offset Register,地址为0x0E000 ED08)的寄存器,修改VTOR的值就能实现中断向量表的重定位

对中断向量起始地址的要求:

VTOR的格式

r2p0版本之前的Cortex-M3,向量表只能“迁移”CODE区或者SRAM区;而新版Cortex-M3和所有Cortex-M4取消了上述限制

image-20200428135651306

应用示例:

  1. 具有Bootloader的设备

    • MCU启动时,首先执行ROM中的Boot loader代码
    • 在跳转到Flash中的用户程序前,设置VTOR指向用户Flash存储器的开始处(此处放置重定位后的向量表)
    • 向量表切换为用户Flash中的向量表

    image-20200430141151905

  2. 应用程序是从外部加载到RAM中执行

    • 存储在片上存储器的启动程序初始化相关硬件,把外部设备(如SD卡或U盘)中的应用程序复制到RAM(包括SRAM)中
    • 更新VTOR,指向位于RAM中新的向量表
    • 最后执行已加载到RAM的程序

    image-20200430141314241

5.5.3. 中断请求和挂起

在传统ARM处理器中,若设备产生了中断请求,在得到处理前需要一直保持中断请求信号。在NVIC中设计了用于保存中断请求的挂起请求寄存器,即使请求中断的源设备取消了请求信号,已产生的中断仍会被处理

如果处理器空闲,处于挂起状态的中断请求会马上得到处理,此时,中断的挂起状态被自动清除。但如果处理器正在处理另外一个更高优先级或同等优先级的中断,或者产生请求的中断源被屏蔽了(通过设置中断屏蔽寄存器),那么在其他中断处理结束前或中断屏蔽被清除前,该中断会一直保持在挂起状态

某个中断被处理时就会进入激活状态。在NVIC中,中断激活状态寄存器保存每个中断的激活状态,只有在中断服务完成,处理器执行了异常返回后,中断激活状态寄存器中对应已完成服务中断的位才会被清除(自动完成)

image-20200430141559611

在Cortex-M3/M4中,出现中断请求之后,如果没有得到服务,就一直被挂起。即使中断源因某种原因撤销了请求,仍然会被处理——在编写ISR时,应先读取中断源相关状态,若的确需要服务,继续执行ISR;否则退出

一般而言,需要中断服务的外设,应该设置专门的“中断请求触发器”,在得到服务前,一直维持请求信号有效,在中断响应之后再撤销

5.5.4. NVIC寄存器

NVIC中的寄存器组只能管理类型16~255的外部中断,管理NMI和Systick等系统异常需要SCB中的寄存器

image-20200430141742376

5.5.4.1. 中断的使能和禁止

image-20200430141832115

注意:中断使能和禁止使用两个地址,操作的是同一个物理寄存器

5.5.4.2. 中断挂起和中断清除

若中断请求产生但没有立即执行,就会进入挂起状态

设置中断挂起状态或者读取中断挂起状态,可以通过访问中断设置挂起寄存器(Interrupt Set-pending Registers,NVIC_ISPRn)实现

image-20200430142048308

通过写ISPR将某个中断设置为挂起状态,该中断就进入了等待中断服务的队伍中

清除中断挂起状态可以通过中断清除挂起(Interrupt Clear-pending Registers,NVIC_ICPRn)寄存器实现

image-20200430142119051

每个ISPR/ICPR寄存器也是32位,每位对应一个中断输入,若外部中断源超过32个,ISPR和ICPR寄存器也不止一个

中断的激活状态

image-20200430142217135

中断优先级配置寄存器

image-20200430142356680

软件触发中断寄存器

除了写ISPR以外,还可以向软件触发中断寄存器(Software Trigger Interrupt Register,STIR)写类型号来触发相应中断(写ISPR是置位对应位

image-20200430142503443

5.5.5. SCB寄存器

image-20200430142534339

中断控制和状态寄存器

ICSR: Interrupt Control and State Register

用于设置和清除系统异常的挂起状态,包括NMI、SysTick和PendSV

通过ICSR可以获知当前正在处理的异常的类型号、当前挂起异常中优先级最高者的类型号、是否发生了抢占信号等信息

image-20200430142613316

应用中断和复位控制寄存器

AIRCR: Application Interrupt and Reset Control Register

用于控制异常/中断优先级管理中的优先级分组,指示系统的端配置信息,提供自复位特性

VECTRESET和VECTCLRACTIVE位域是为调试器设计的。软件可利用VECTRESET触发处理器复位,但它不会复位外设,若需要产生系统复位,应该使用SYSRESETEREQ

image-20200430142654908

系统处理优先级寄存器

SHPR: System Handler Priority Register

共3个,SHPR1到SHPR3,SHPR的位域定义与中断优先级寄存器定义相同,差别在于SHPR用于(除了复位、NMI和硬件错误以外的)系统异常

image-20200430142730357

系统处理控制和状态寄存器

SHCSR: System Handler Control and State Register

可以使能的异常包括:使用错误、存储器管理错误和总线错误异常

上述异常和多数系统异常的激活状态也可从SHCSR获得

image-20200430142802077

6. ARM指令系统

6.1. ARM处理器指令集概述

指令集体系架构:描述处理器指令及其功能、组织方式和规范

指令系统:计算机系统中所有机器指令的集合

机器指令:

6.1.1. ARM的不同指令集

ARM处理器的指令集

各个版本架构所支持的指令集

image-20200430143407031

说明:

6.1.2. ARM指令集扩展

指令集扩展

ARM指令集的扩展过程

ARMv8-A的的指令集扩展过程:先后增加了Jazelle、VFP、TrustZone、SIMD 、NEON以及可选密码扩展

ARM的指令集扩展

Cortex-M支持的指令集

部分Cortex-M系列处理器所支持的指令集以及扩展指令功能如下:

image-20200519090656588

Cortex-M处理器的兼容性

Cortex-M处理器的适用场景

6.2. T32指令格式

6.2.1. 16比特指令二进制格式

T32的指令由半字对齐的序列构成

通过半字的最高5个比特来区分是16比特指令还是32比特指令。若一个半字的最高五个比特(bits[15:11])为如下三种情况则该半字为一个32位比特指令的第一个半字:

  1. 0b11101
  2. 0b11110
  3. 0b11111

其他情况的半字均为16比特指令

image-20200628172457507

16比特指令的二进制位串编码格式如下:

image-20200519093222202

高六比特为操作码,操作码定义了不同的指令类别:

image-20200519093242993

6.2.2. 32比特指令二进制格式

T32指令集中32比特指令的二进制编码格式如下:

image-20200519093310847

操作码被分成三段:”op1“、”op2“、”op“

当”op1==0b00“时,表示是该指令T32指令集中的16比特指令

当”op1!=0b00“时,根据”op1“、”op2“、”op“可对32比特指令进行分类

image-20200519093331069

6.2.3. T32指令的汇编语法

在定义一条机器指令的时候,需要将指令的功能、源操作数、目标操作数、操作数地址等信息予以明确。ARM处理器中汇编指令的通用格式构成要素如下:

其中,<>内的参数是必选参数,而[]内参数是可选参数

6.2.4. T32的条件执行指令

T32中多数Thumb指令可以根据应用程序状态寄存器APSR中的标志位决定当前指令是否被执行

这种在特定条件满足时才执行的指令被称为条件执行指令

APSR寄存器的标志位定义为:

image-20200519094147590

处理器执行指令的时候,其运算过程可能会改变APSR中的标志位

APSR寄存器的各标志位定义为:

在Thumb指令中,只要条件码不为“1110”,均为条件执行指令:

image-20200519094411309

6.2.5. T32指令格式示例

指令一般由操作码字段和操作数字段两部分组成

ARM处理器绝大多数算逻运算指令支持3操作数,也有1~2个操作数,少数隐含多个操作数(如LDM指令),还有若干指令无操作数

6.3. T32指令集寻址方式

寻址:根据指令内容确定操作数地址的过程

寻址方式:如何寻找操作数的方法。不同的寻址方式实质上是构成操作数地址的方法不同

image-20200519184955267

6.3.1. 立即数寻址

立即数寻址也叫立即寻址,是一种特殊的寻址方式

操作数本身包含在指令中,只要取出指令也就取到了操作数

这个操作数叫做立即数,对应的寻址方式叫做立即寻址,如

在立即数寻址中,要求立即数以“#”为前缀,对于以十六进制表示的立即数,要求在“#”后加上“0X”或“&”或“0x”

Cortex-M3/M4支持的T32指令集中,指令长度要么是16比特,要么是32比特,指令长度有限 → 立即数取值只能在一定范围内

对立即数的限制

  1. 在传统ARM处理器所使用的32位ARM指令中,要求32位立即数必须是一个“位图”数据

    • 位图数据:一个任意的8位立即数经过偶数次循环左移得到的数据
  2. 在16位Thumb指令集中,可以将任意8位立即数通过左移得到一个32位立即数

  3. 满足格式“0x00XY00XY”或“0xXY00XY00”或“0xXYXYXYXY”的数是合法的立即数,其中X和Y为16进制数

6.3.2. 寄存器寻址

寄存器寻址(或称为寄存器直接寻址)就是利用寄存器中的数值作为操作数

在各类微处理器经常被采用,执行效率高

寄存器仅限于通用寄存器,不可以是PC

6.3.3. 寄存器间接寻址

寄存器间接寻址就是把寄存器中存放的数值作为操作数,通过这个地址去取得操作数,操作数本身存放在存储器中

6.3.4. 寄存器移位寻址

寄存器移位寻址是ARM指令集特有的寻址方式

寻址方式为:先由寄存器寻址得到操作数,对该操作数再进行移位操作后得到最终的操作数

支持的移位方式:

6.3.5. 寄存器偏移寻址

寄存器偏移寻址:操作数地址由一个寄存器中存放的数值与指令中给出的地址偏移量相加得到

寻址过程:将寄存器(基址寄存器)中的基址与指令中给出的地址偏移量相加,得到一个新的地址,通过这个地址取得操作数

汇编语法:

指令中给出的地址偏移量有三种形式:

LDR:从存储器特定位置读取32比特数值后存入指定的寄存器

STR:把指定寄存器的数值保存到存储器的特定位置

举例:

采用寄存器偏移寻址的LDR指令的典型汇编语法可存在如下三种形式:

其中,<Rn>表示基址寄存器,而<offset>表示偏移量,偏移量可以是:

  1. 5位立即数<imm5>或8位立即数<imm8>或12位立即数<imm12>
  2. 寄存器值<Rm>
  3. 寄存器值移位#<shift>

6.3.6. 前变址寻址

前变址寻址方式:在执行指令的时候自动把基址与偏移加和形成的操作数地址写回到基址寄存器

前变址:基址寄存器中的数值和立即数偏移量的加和计算发生在寻址前

汇编语法:

"!"后缀表示指令完成时更新存放基地址的基址寄存器(写回)

举例:

6.3.7. 后变址寻址

后变址寻址:在执行指令的时候,操作数地址从基址寄存器获取,指令执行后再将操作数地址加上偏移量生成一个新的地址,并将该新地址写入基址寄存器

后变址:指令中的偏移量在存储器访问期间不会用到,而是在数据传输后更新基址寄存器

汇编语法:

示例:

6.3.8. 多寄存器寻址

从一块连续的存储器区域装载多个数据到多个寄存器中

汇编语法:

其中,<Rn>为基址寄存器,<registers>为需要载入数据的寄存器集合,可选项{!}表示需要将修改后的地址写入基址寄存器<Rn>。可选后缀{addr_mode}可选择如下四种方式(Cortex-M3/M4只支持IA和DB方式)

LDM:可以从连续的存储区域转载多个数据

STM:将一组寄存器中的数值保存到连续的存储器区域

举例:

6.3.9. 堆栈寻址

如果把前述多寄存器寻址方式中LDM和STM指令中的基址寄存器更换为堆栈指针寄存器SP,并添加{!}(意为每次存/取操作数就更新一下SP),则寻址操作数为堆栈中存放的数值,寻址方式变成堆栈寻址

LDM:每次取操作数自动POP堆栈中的数据到指定寄存器

STM:每次将寄存器中的数自动PUSH到堆栈中

Cortex-M系列处理器支持满递减类型的堆栈,可以使用LDMFD指令从堆栈装载数据,使用STMFD指令保存数据到堆栈(如果堆栈类型是满增、空减或空增,则后缀应该为FA,ED或EA)

举例:

6.3.10. PC相对寻址

PC相对寻址是一种特殊的基址变址寻址,常简称为相对寻址

PC相对寻址以程序计数器PC寄存器的当前值作为基地址,指令中的地址标号作为偏移量,将两者相加获得操作数的地址

偏移量的表示方法:

示例1:

用BL指令跳转到“MY_SUB”标号对应的语句执行

示例2:

用ADR指令获取PC相对寻址结果

示例3:

利用LDR指令将相对当前代码位置后1-2字节位置的一个字数据(32位)传送到R0寄存器

6.4. Cortex-M3/M4指令集

6.4.1. 处理器内的数据传送指令

实现处理器内部不同电路单元之间的数据传送

image-20200519185821229

MOVW:把16位任意立即数传送到目的寄存器的低16位,高16位清0

MOVT:把16位任意立即数传送到目的寄存器的高16位,低16位不变

使用MOVW和MOVT指令可以将任意的32位立即数传送到32位寄存器

6.4.2. 存储器访问指令

image-20200519190212972

有多条Load/Store指令用于存储器访问

寻址模式:立即数寻址、寄存器寻址、寄存器移位寻址、寄存器间接寻址、基址变址寻址、多寄存器寻址(块拷贝寻址)、堆栈寻址、PC相对寻址

安全性增强:即使是特权访问等级程序,如果使用非特权的LDRT或者STRT指令,也只能访问非特权访问等级才能访问的区域,否则将引起Fault异常

排他访问增强

操作数类型

操作数类型:

可存储的数据类型:字节、半字、字

读/写存储器操作支持的数据类型:

零扩展:在高位补零,如1000 1010 → 0000 0000 1000 1010

符号扩展:用于保护有符号数的符号位,如

使用LDRSB或LDRSH将一个字节或半字数据加载到32位寄存器,会对被加载数据自动执行符号位扩展,如

不同的寻址方式——以LDRB为例

多加载和多存储指令

image-20200519204621901

ARM处理器的一个重要特性,可以读(LDM指令)或者写(STM指令)存储器中的多个连续数据

堆栈操作

PC相对寻址模式

如果使用PC寄存器作为基地址,再加上偏移量形成待访问操作数地址。常用于将立即数加载到寄存器中,如前述的文本池(Literal Pool)访问

image-20200519210913939

非特权等级加载和存储

ARM中提供了一组特殊的加载和存储指令,在特权访问等级程序中使用这些指令加载或保存的数据,如同非特权访问等级程序的访问效果

image-20200519210951907

排他式访问

image-20200519211214076

6.4.3. 算术运算指令

image-20200519211528964

Cortex-M3/M4都支持具有32位和64位结果的32位乘法指令和乘加(MAC)指令,APSR标志不受这些指令的影响。Cortex-M4处理器还支持额外的快速MAC指令

image-20200519211737448

6.4.4. 逻辑运算指令

image-20200519212527480

BIC(位清除)指令的一般格式:

ORN(按位或非)没有16位指令,该指令将源操作数按位取反后,再执行按位进行逻辑或运算

6.4.5. 移位运算

image-20200519212737889

若使用S后缀,循环和移位指令也会更新APSR中的进位标志位;多位移位运算之后,进位位为最后移出寄存器的哪一位

只有循环右移而没有循环左移的原因:

除了RRX(包含进位位的循环右移)指令以外,移位与运算指令还有16位版本,但是16位版本只能使用低位寄存器(R0~R7)

6.4.6. 数据格式转换

符号扩展与无符号扩展

image-20200519212930533

上述指令的32位形式还可以选择在有符号扩展运算之前将Rn循环右移

image-20200519213131492

数据反转指令:常用于大小端数据转换

image-20200519213155423

示例:

image-20200519213223339

6.4.7. 位域处理指令

位域处理指令用于控制类用于

image-20200519213959567

6.4.8. 比较和测试指令

image-20200519215511378

上述指令运行后将更新APSR而不保存运算结果

这些指令的后续指令往往是条件跳转和条件执行指令

6.4.9. 程序流控制指令

包括无条件跳转和函数调用、条件跳转、比较和条件组合跳转、条件执行(IF-THEN)、以及表格跳转等

6.4.9.1. 无条件跳转和函数调用指令

image-20200519215727674

6.4.9.2. 条件跳转

基于APSR当前的标志位决定是否跳转

image-20200519224029807

cond为以下14个可能的条件后缀之一

image-20200519224050978

6.4.9.3. 比较和跳转

ARMv7架构增加了两条比较跳转指令

image-20200519224127890

说明:相当于CMP和BEQ/BNE的组合。只能向前跳转,不能向后跳转,跳转范围为当前指令后的4~130字节,且只能使用R0~R7,常用于小范围的循环控制,如:

image-20200519224301282

6.4.9.4. 条件执行

IT指令允许跟随其后的最多四条指令是条件执行的,IT指令后的几条指令被称作一个IT块

IT指令的汇编语法为:

xyz对应有两种开关:

增加不同位数后缀的IT指令(IT+T和E的各种组合)

示例:

注意:

6.4.9.5. 按跳转表跳转

跳转表的意义:

Cortex-M3/M4支持两条表格跳转指令:

6.4.10. 饱和运算

定点运算中经常遇到运算结果溢出的情况,有上溢和下溢两种

溢出运算:

Cortex-M3支持以下两条饱和运算指令:

image-20200519230650888

SSAT和USAT的汇编格式:

示例:

当R0为不同数值时,SSAT和USAT指令执行后,R1和R2的值以及Q位如下表所示

image-20200519231026494

6.4.11. 其他杂项指令

image-20200519231053285

6.4.11.1. 休眠模式指令
6.4.11.2. 异常相关指令

管理调用(SVC)指令用于产生SVC异常(异常类型为11)。SVC一般用于嵌入式操作系统(OS),其中,非特权应用可以请求使用具有特权OS提供的服务(类似于x86系统中的系统功能调用)

6.4.11.3. 空指令和断电指令

6.4.12. Cortex-M4特有指令

与Cortex-M3处理器相比,Cortex-M4支持的指令更多。新增的功能包括:单指令多数据(SIMD)、饱和指令、其他的乘法和MAC(乘累加)指令、打包和解包指令、可选的浮点指令等。这些指令可以让Cortex-M4可以更加高效地进行实时数字信号处理

7. ARM程序设计

目前基于ARM处理器的程序大多采用C语言开发

特定场合下必须使用汇编语言(系统启动程序)

7.1. ARM程序开发环境

7.1.1. 常用ARM程序开发环境

分类

ARM官方提供的软件

ARM-Linux-GCC

MDK

ARM Development Studio 5(DS-5)

DS-5是一款支持开发所有ARM内核芯片的IDE,主要特点如下:

MDK vs DS-5

7.1.2. MDK开发环境简介

Keil MDK的软件开发周期

  1. 创建工程,选择目标芯片,并且做一些必要的工程配置
  2. 编写C或者汇编源文件
  3. 编译应用程序
  4. 修改源程序中的错误
  5. 联机调试

μVision集成开发环境

μVision IDE是一款集编辑、编译和项目管理于一身的基于窗口的软件开发环境

μVision集成了C语言编译器,宏编译,链接/定位,以及HEX文件产生器。

μVision特性:

  1. 功能齐全的源代码编辑器
  2. 配置开发工具的设备库
  3. 用于创建工程和维护工程的项目管理器
  4. 所有的工具配置都采用对话框进行
  5. 集成了源码级的仿真调试器,包括高速CPU和外设模拟器
  6. 用于往Flash ROM下载应用程序和Flash编程工具
  7. 完备的开发工具帮助文档,设备数据表和用户使用向导

ARM仿真器

仿真器可以替代目标系统中的MCU,仿真其运行。它运行起来和实际的目标处理器一样,但是增加了其它功能,使用户能够通过计算机或其它调试界面来观察MCU中的程序和数据,并控制MCU的运行,它是调试嵌入式软件的一个经济、有效的手段

具有以下优点:

  1. 不使用目标系统或CPU资源
  2. 硬件断点、跟踪功能
  3. 条件触发
  4. 实时显示存储器和I/O口内容
  5. 硬件性能分析

7.2. ARM汇编程序中的伪指令

在ARM汇编语言程序里,有一些特殊指令助记符,这些助记符与指令系统的助记符不同,没有相对应的操作码,通常称这些特殊指令助记符为伪指令,他们所完成的操作称为伪操作

伪指令不像机器指令那样在处理器运行期间由机器执行,而是汇编程序对源程序汇编期间由汇编程序处理,包括:定义变量、分配数据存储空间、控制汇编过程、定义程序入口等,这些伪指令仅在汇编过程中起作用,一旦汇编结束,伪指令的使命就完成了

7.2.1. 符号定义伪指令

符号定义伪指令用于定义ARM汇编程序中的变量、对变量赋值以及定义寄存器的别名等操作。常见的符号定义伪指令有如下几种:

GBLA、GBLL和GBLS

语法格式:

GBLA、GBLL和GBLS伪指令用于定义一个ARM程序中的全局变量,并将其初始化

其中:

以上三条伪指令用于定义全局变量,在整个程序范围内变量名必须唯一

举例:

LCLA、LCLL和LCLS

语法格式:

LCLA、LCLL和LCLS伪指令用于定义一个ARM程序中的局部变量,并将其初始化

其中:

以上三条伪指令用于声明局部变量,在其作用范围内变量名必须唯一

举例:

SETA、SETL和SETS

语法格式:

伪指令SETA、SETL、SETS用于给一个已经定义的全局变量或局部变量赋值

其中:

其中,变量名为已经被定义过的全局变量或局部变量,表达式为将要赋给变量的值

举例:

RLIST

语法格式:

RLIST伪指令可用于对一个通用寄存器列表定义名称,使用该伪指令定义的名称可在ARM指令LDM/STM中使用。在LDM/STM指令中,列表中的寄存器访问次序为根据寄存器的编号由低到高,而与列表中的寄存器排列次序无关

举例:

7.2.2. 数据定义伪指令

数据定义伪指令一般用于为特定的数据分配存储单元,同时可完成已存储单元的初始化。常见的数据定义伪指令有如下几种:

DCB

语法格式:

DCB伪指令用于分配一段连续的字节(8位)存储单元并用伪指令中指定的表达式初始化。其中,表达式可以为0~255的数字或字符串,DCB也可用“=”代替

举例:

DCW(或DCWU)

语法格式:

DCW(或DCWU)伪指令用于分配一段连续的半字(16位)存储单元并用伪指令中指定的表达式初始化。其中表达式可以为程序标号或数字表达式

用DCW分配的字存储单元是半字对齐的,而用DCWU分配的字存储单元并不严格半字对齐

示例:

DCD(或DCDU)

语法格式:

DCD(或DCDU)伪指令用于分配一段连续的字(32位)存储单元并用伪指令中指定的表达式初始化。其中,表达式可以为程序标号或数字表达式,DCD也可用“&”代替

用DCD分配的字存储单元是字对齐的,而用DCDU分配的字存储单元并不严格字对齐

示例:

DCFD(或DCFDU)

语法格式:

DCFD(或DCFDU)伪指令用于为双精度的浮点数分配一段连续的字存储单元并用伪指令中指定的表达式初始化,每个双精度的浮点数占据两个字单元

用DCFD分配的字存储单元是字对齐的,而用DCFDU分配的字存储单元并不严格字对齐

示例:

DCFS(或DCFSU)

语法格式:

DCFS(或DCFSU)伪指令用于为单精度的浮点数分配一段连续的字存储单元并用伪指令中指定的额表达式初始化,每个单精度的浮点数占据一个字单位

用DCFS分配的字存储单元是字对齐的,而用DCFSU分配的字存储单元并不严格字对齐

示例:

DCQ(或DCQU)

语法格式:

DCQ(或DCQU)伪指令用于分配一段以8个字节为单位的连续存储区域并用伪指令中指定的表达式初始化

用DCQ分配的存储单元是字对齐的,而用DCQU分配的存储单元并不严格字对齐

示例:

SPACE

语法格式:

SPACE伪指令用于分配一片连续的存储区域并初始化为0,其中,表达式为要分配的字节数,SPACE也可用“%”代替

示例:

MAP

语法格式:

MAP伪指令用于定义一个结构化的内存表的首地址,可以用“^”代替

表达式可以为程序中的标号或数学表达式,基址寄存器可为可选项,当基址寄存器选项不存在时,表达式的值即为内存表的首地址,当该选项存在时,内存表的首地址为表达式的值与基址寄存器的和

示例:

FIELD

语法格式:

FIELD伪指令常与MAP伪指令配合使用来定义结构化的内存表。MAP伪指令定义内存表的首地址,FIELD伪指令定义内存表中的各个数据域,并可以为每个数据域指定一个标号供其他的指令引用

表达式的值为当前数据域在内存表中所占的字节数

注意:MAP和FIELD伪指令仅用于定义数据结构,并不实际分配存储单元

示例:

7.2.3. 汇编控制伪指令

汇编控制伪指令用于控制汇编程序的执行流程,常用的汇编控制伪指令包括:

IF、ELSE、ENDIF

语法格式:

IF、ELSE、ENDIF可嵌套使用

示例:

WHILE、WEND

语法格式:

WHILE和WEND可以嵌套使用

MACRO、MEND

语法格式:

MACRO、MEND伪指令可以将一段代码定义为一个整体,两条指令称为宏指令,需要时可以在程序中通过宏指令多次调用这段代码

其中,$标号在宏指令被展开时会被替换成用户定义的符号。宏指令可以使用一个或多个参数,当宏指令被展开时,这些参数被相应的值替换

包含在MACRO和MEND之间的指令序列称为宏定义体,在宏定义体的第一行应声明宏的原型(包含宏名、所需的参数),然后就可以在汇编程序中通过宏名来调用该指令序列。在源程序被编译时,汇编器将宏调用展开,用宏定义中的指令序列代替程序中的宏调用,并将实际参数的值传递给宏定义中的形式参数

宏指令的使用方式和功能与子程序有些香相似,子程序可以提供模块化的程序设计、节省存储空间并提高运行速度。但在使用子程序结构时需要保护现场,从而增加了系统开销。因此,在代码较短且需要传递的参数较多时,可以使用宏指令代替子程序

MACRO、MEND伪指令可嵌套使用

示例:

上述代码中,宏名为test,标号为$label,有三个参数$p1,$p2,$p3。标号和参数在实际调用中可根据需要替换成不同的符号,而宏名是唯一确定的

调用上述宏的方法:

汇编处理宏时会展开还原成一段代码,结果如下:

采用宏定义的方法可以用一条语句代替一大段指令序列,提高编程效率

MEXIT

语法格式:

7.2.4. 其他常用的伪指令

AREA

语法格式:

AREA伪指令用于定义一个代码段或数据段,段名若以数字开头,则该段名需用“|”括起来,如|1_test|

属性字段表示该代码段(或数据段)的相关属性,多个属性用逗号分隔。常用属性如:

  1. CODE属性:用于定义代码段,默认为READONLY
  2. DATA属性:用于定义数据段,默认READWRITE
  3. READONLY属性:指定本段为只读,代码段默认为READONLY
  4. READWRITE属性:指定本段为可读可写,数据段默认为READWRITE
  5. ALIGN属性:使用方式为ALIGN
  6. COMMON属性:该属性定义了一个通用的段,不包含任何的用户代码和数据。各个源文件中同名的COMMON段共享一段存储单元。一个汇编语言的程序至少要包含一个段,当程序太长时,也可以将程序分为多个代码段和数据段

示例:

ALIGN

语法格式:

ALIGN伪指令可以通过添加填充字节的方式,使当前位置满足一定的对齐方式

表达式的值用于指定对齐方式,可能取值为2的幂,如1,2,4,8,16等。若未指定表达式,则将当前位置对齐到下一个字的位置

偏移量也为一个数字表达式,若使用该字段,假设N=表达式,则当前位置的对齐方式为:2N+偏移量

示例:

CODE16、CODE32

语法格式:

若在汇编源程序中同时包含有ARM指令和Thumb指令,可用CODE16伪指令通知编译器其后的指令序列为16位的Thumb指令,CODE32伪指令通知编译器其后的指令序列位32位的ARM指令

在使用ARM指令和Thumb指令混合编程的代码中,可用这两条伪指令进行切换,注意他们只通知编译器其后指令的类型,并不能对处理器的状态进行切换

示例:

ENTRY

语法格式:

ENTRY伪指令用于指定汇编程序的入口点。在一个完整的汇编程序中至少要有一个ENTRY,但在一个源文件里最多只能有一个ENTRY

示例:

END

语法格式:

END伪指令用于通知编译器已经到达源程序的结尾

示例:

EQU

语法格式:

EQU伪指令用于为程序中的常量、标号等一个等效的字符名称,类似于C语言中的#define。其中EQU可用“*”代替

示例:

EXPORT(或GLOBAL)

语法结构:

EXPORT伪指令用于在程序中声明一个全局的标号,该标号可在其他文件中引用。EXPORT可用GLOBAL代替。标号在程序中区分大小写,[WEAK]选项声明其他的同名标号优先于该标号被引用

示例:

IMPORT

语法格式:

IMPORT伪指令用于通知编译器要使用的标号在其他源文件中的定义,但要在当前源文件中引用,而且无论当前源文件是否引用该标号,该标号均会被加入到当前源文件的符号表中

标号在程序中区分大小写,[WEAK]选项表示当所有的源文件都没有定义这样一个标号时,编译器也不给出错误信息,在多数情况下将该标号置为0,若该标号被B或BL指令引用,则将B或BL指令置为NOP操作

示例:

EXTERN

语法格式:

EXTERN伪指令用于通知编译器要使用的标号在其他的源文件中定义,但要在当前源文件中引用。如果当前源文件实际并未引用该标号,该标号就不会被加入到当前源文件的符号表中

示例:

GET(或INCLUDE)

语法格式:

GET伪指令用于将一个源文件包含在当前的源文件中,并将被包含的源文件在当前位置进行汇编处理。可以使用INCLUDE代替GET

汇编程序中常用的方法是在某源文件中定义一些宏指令,用EQU定义常量的符号名称,用MAP和FIELD定义结构化的数据类型,然后用GET伪指令将这个源文件包含到其他的源文件中。使用方法与C语言中的“INCLUDE”相似

GET伪指令只能用于包含源文件,包含目标文件需要使用INCLUDE伪指令

示例:

INCBIN

语法格式:

INCBIN伪指令用于将一个目标文件或数据文件包含到当前的源文件中,被包含的文件不作任何变动的存放到当前文件中,编译器不对文件内容进行编译,编译器从其后开始继续处理

示例:

RN

语法格式:

RN伪代码用于给一个寄存器定义一个别名

其中,名称为给寄存器定义的别名,表达式为寄存器的编码

ROUT

语法格式:

ROUT伪指令用于给一个局部变量定义作用范围

在程序中未使用该伪指令时,局部变量的作用范围为所在的AREA,而使用ROUT后,局部变量的作用范围为当前ROUT和下一个ROUT之间

7.2.5. 汇编语言中常用的符号

汇编语言程序设计的符号定义应遵循的约定:

程序中的变量

程序中的变量是指其值在程序的运行过程中可以改变的量。ARM(Thumb)汇编程序所支持的变量有数字变量、逻辑变量和字符串变量。

数字变量用于在程序的运行中保存数字值,但注意数字值的大小不应超出数字变量所能表示的范围。

逻辑变量用于在程序的运行中保存逻辑值,逻辑值只有两种取值情况:真或假。

字符串变量用于在程序的运行中保存一个字符串,但注意字符串的长度不应超出字符串变量所能表示的范围

在ARM汇编语言程序设计中,可以使用GBLA、GBLL、BGLS伪指令声明全局变量,使用LCLA、LCLL、LCLS伪指令声明局部变量,并可使用SETA、SETL、SETS进行初始化

示例:

程序中的常量

程序中的常量是指其值在程序的运行过程中不能被改变的量。ARM(Thumb)汇编程序所支持的常量有数字常量、逻辑常量和字符串常量

数字常量一般为32位的整数,当作为无符号数时,其取值范围为0~232-1,当作为有符号数时,其取值范围为-231~232-1

逻辑常量只有两种取值情况:真或假

字符串常量为一个固定的字符串,一般用于程序运行时的信息提示

示例:

对比:EQU指令 vs “=”

程序中的变量代换

程序中的变量可以通过代换操作取得一个常量。代换操作符为"$"

如果在数字变量前面有一个代换操作符“$”,编译器会自动将该数字的值转换为十六进制的字符串,并将十六进制的字符串代换“$”后的数字变量

如果在逻辑变量前面有一个代换操作符"$",编译器会将该逻辑变量代换为它的取值(真或假)

如果在字符串变量前面有一个代换操作符“$”,编译器会将该字符串变量的值代换“$”后的字符串变量

示例:

7.2.6. 汇编语言中常用运算符和表达式

运算次序与优先级:

  1. 优先级相同的双目运算符的运算顺序为从左到右
  2. 相邻的单目运算符的运算顺序为从右到左,且单目运算符的优先级高于其他运算符
  3. 括号运算符的优先级最高

数学表达式及运算符

运算符用法作用
+X+YX与Y的和
-X-YX与Y的差
xXxYX与Y的乘积
/X/YX除以Y的商
MODX:MOD:YX除以Y的余数
ROLX:ROL:Y将X循环左移Y位
RORX:ROR:Y将X循环右移Y位
SHLX:SHL:Y将X左移Y位
SHRX:SHR:Y将X右移Y位
ANDX:AND:Y将X和Y按位作逻辑与的操作
ORX:OR:Y将X和Y按位作逻辑或的操作
NOT:NOT:Y将Y按位作逻辑非的操作
EORX:EOR:Y将X和Y按位作逻辑异或的操作

逻辑表达式及运算符

运算符用法作用
=X=YX等于Y
>X>YX大于Y
<X<YX小于Y
`>=`X>=YX大于等于Y
`<=`X<=YX小于等于Y
/=X/=YX不等于Y
<>X<>YX不等于Y
LANDX:LAND:Y将X和Y作逻辑与操作
LORX:LOR:Y将X和Y作逻辑或操作
LNOT:LNOT:Y将Y作逻辑非操作
LEORX:LEOR:Y将X和Y作逻辑异或操作

字符串表达式及运算符

运算符用法作用
LEN:LEN:X返回字符串长度
CHR:CHR:M将0~255之间的整数转换为一个字符
STR:STR:X将一个数字表达式或逻辑表达式转换为一个字符串
LEFTX:LEFT:Y返回某个字符串左端的一个字串
RIGHTX:RIGHT:Y返回某个字符串右端的一个字串
CCX:CC:Y用于将两个字符串连接成一个字符串

与寄存器和程序计数器PC相关的表达式及运算符

运算符用法作用
BASE:BASE:X返回基于寄存器的表达式中寄存器的编号
INDEX:INDEX:X返回基于寄存器的表达式中相对于其基址寄存器的偏移量

其他运算符

运算符用法作用
??X返回某代码行所生成的可执行代码的长度
DEF:DEF:X判断是否定义某个符号

7.3. ARM汇编语言程序设计

7.3.1. ARM汇编语言的语句格式

RM汇编中语句中所有标号必须在一行的顶格书写,其后面不要添加“:”,而所有指令均不能顶格书写。ARM汇编器对标识符大小写敏感,书写标号及指令时字母大小写要一致,在ARM汇编程序中,一个ARM指令、伪指令、寄存器名可以全部为大写字母,也可以全部为小写字母,但不要大小写混合使用

ARM汇编语句的格式如下:

  1. 标号域

    • 标号域用来表示指令的地址、变量、过程名、数据的地址和常量
    • 标号是可以自己起名的标识符,语句标号可以是大小写字母混合,通常以字母开头,由字母、数字、下划线等组成
    • 语句标号不能与寄存器名、指令助记符、伪指令(操作)助记符、变量名同名
    • ARM汇编规范规定:语句标号必须在一行的开头书写,不能留空格;指令则在行开头必须要留出空格
  2. 操作助记符域

    • 操作助记符域可以为指令、伪操作、宏指令或伪指令的助记符。
    • ARM汇编器对大小写敏感,在汇编语言程序设计中,每一条指令的助记符可以全部用大写、或全部用小写,但不允许在一条指令中大、小写混用。
    • 所有的指令都不能在行的开头书写,必须在指令的前面有空格,然后再书写指令
    • 指令助记符和后面的操作数或操作寄存器之间必须有空格,不可以在这之间使用逗号
  3. 操作数域

    • 操作数域表示操作的对象,操作数可以是常量、变量、标号、寄存器名或表达式,不同对象之间必须用逗号“,”分开

7.3.2. ARM汇编语言程序结构

在ARM(Thumb)汇编语言程序中,通常以段为单位来组织代码段是具有特定名称且功能相对独立的指令或数据序列根据段的内容,分为代码段和数据段

一个汇编程序至少应该有一个代码段,当程序较长时,可以分割为多个代码段和数据段

一个汇编语言程序段的基本结构如下所示:

7.3.3. ARM汇编程序设计实例

顺序结构

顺序结构是一种最简单的程序结构,这种程序按指令排列的先后顺序逐条执行

示例:对数据段中数据进行寻址操作

分支结构

一般情况下,程序按指令的先后顺序逐条执行,但经常要求程序根据不同条件选择不同的处理方法,利用条件指令或条件转移指令根据当前CPSR中的状态标志值选择路径,使用带有条件码的指令实现的分支程序段

image-20200521205810833

分支结构中经常使用的条件码助记后缀:

例如寄存器中R0和R1分别保存两个数,如果R0小于R1,将R1值传给R0,实现代码如下:

分支结构的几种实现方法:

  1. 利用条件码可以很方便地实现IF ELSE分支结构地程序

  2. B(Branch)条件转移及衍生指令实现分支结构

    • B指令

      • 格式:

      • 用法:B指令是最简单的跳转指令,一旦遇到一个B指令,ARM处理器将立即跳转到给定的目标地址,从那里继续执行

      • 示例:

      • 示例:

    • BL指令

      • 格式:

      • 用法:BL是一个跳转指令,但跳转之前,会在寄存器R14中保存PC当前的内容。因此,可以通过将R14的内容重新加载到PC中,来返回到跳转指令之后的那个指令处执行。这个指令是实现子函数调用的一个基本且常用的手段

      • BL实现子函数调用时完成如下的三个操作:

        • 将子程序的返回地址(当前PC)保存在R14(LR)中
        • 将PC指向子程序的入口即跳转(也即BL后面的目标指令)
        • 子程序执行完毕之后需要返回时,只需将R14中的LR赋给PC
      • 使用BL调用子程序后,通常在子程序的尾部添加MOV PC,LR来返回

循环结构

循环结构可以减少源程序重复书写的工作量,用来描述重复执行某段算法的问题,这是程序设计中最能发挥计算机特长的程序结构

  1. for循环结构实现

    C语言形式:

    ARM汇编语言形式:R0为x,R2为i,均为无符号整数

  2. while循环结构实现

    C语言形式:

    ARM汇编语言形式:x为R0,y为R1,均为无符号整数

子程序调用与返回

在ARM汇编语言中,子程序的调用一般是通过BL指令来完成的

BL指令的语法格式如下:

SUB是被调用的子程序的名称

BL指令完成2个操作,即将子程序的返回地址放在LR寄存器中,同时将PC寄存器指向子程序的入口点,当子程序执行完毕需要返回主程序时,只需将存放在LR中的返回地址重新赋给指令指针寄存器PC即可。通过调用子程序,能够完成参数的传递和从子程序返回运算的结构(通常使用寄存器R0-R3来完成)

BL调用子程序的经典用法如下:

当子程序需要使用的寄存器与主程序使用的寄存器发生冲突(即子程序与主程序都要使用同一组寄存器时),为了防止主程序这些寄存器中的有用数据丢失,在子程序的开始应该把这些寄存器数据压入堆栈以保护现场,在子程序返回之前需要把保护到堆栈的数据自堆栈中弹出以恢复现场

image-20200521220402517

注意:BLSUB...MOVPC,LR这种调用子程序结构在一些情况下是会出现问题的,例如当出现子程序嵌套调用时,LR寄存器中内容在第二次子程序调用时会被覆盖,如果仍使用常用调用方式会出现无法返回现场的问题,这个时候使用STMFD/LDMFD指令可以有效避免LR被覆盖而出现错误

示例:

7.4. ARM汇编语言与C/C++的混合编程

7.4.1. C语言与汇编语言之间的函数调用

ATPCS概述

C程序调用汇编函数实例

ARM编译器使用的函数调用规则就是ATPCS标准,也是设计可被C程序调用的汇编函数的编写规则。为了保证程序调用时参数传递正确,C程序调用的汇编函数时必须严格按照ATPCS规则

如果汇编函数和调用函数的C程序不在同一个文件中,则需要在汇编语言中用EXPORT声明汇编语言起始处的标号为外部可引用符号,该标号应该为C语言中所调用函数的名称

例:调用汇编函数,实现把字符串srcstr复制到dsstr中

汇编语言源程序Scopy.s,汇编文件和*.c文件在同一工程中

汇编程序调用C函数实例

在汇编程序中调用C语言函数,需要在汇编程序中利用IMPORT说明对应的C函数名,按照ATPCS的规则保存参数。完成各项准备工作后利用跳转指令跳转到C函数入口处开始执行。跳转指令后所跟标号为C函数的函数名

例:汇编程序中调用C函数实现求5个整数相加的和;test.s,工程设置为基于汇编的工程,不需要从main函数启动,代码段名称必须设为RESET

7.4.2. C/C++语言与汇编语言的混合编程

嵌入式系统开发中,目前使用的主要编程语言是C和汇编,C++已经有相应的编译器,但是现在使用还是比较少的。在稍大规模的嵌入式软件中,大部分的代码都是用C编写的

C语言中使用内嵌汇编代码,可以在C/C++程序中实现C/C++不能完成的一些操作,同时程序的代码效率也会更高

在C语言程序中嵌入汇编指令

如果要在C程序中嵌入汇编有两种方法:内联汇编和内嵌汇编。嵌入汇编使用的标记是__asm或者asm关键字,用法如下:

  1. 内联汇编的示例代码如下:

  2. 内嵌汇编的示例代码如下:

由两种方法的示例可以看出:内联汇编可以直接嵌入C代码使用,而内嵌汇编更像一个函数。由于内联式汇编只能在ARM状态中进行,而Cortex-M3/M4只支持Thumb-2,所以Cortex-M3/M4只能使用内嵌汇编的方式,也就是第二种方法

在C语言中内嵌汇编指令与汇编程序中的指令有些不同,存在一些限制,主要有下面几个方面:

示例:在C程序中使用内联汇编代码实现字符串复制

在汇编中调用C语言定义的函数和全局变量

8. 基于ARM微处理器硬件与软件系统设计开发

8.1. 嵌入式硬件与软件系统设计与开发综述

8.1.1. 概述

image-20200704085736231

8.1.2. 嵌入式生态系统

硬件

软件

文档

8.1.3. 开发环境、开发工具和调试方式

开发环境

开发工具

嵌入式软件开发阶段及其工具:

image-20200704090541436

集成开发工具KEIL MDK的组成

image-20200704090634046

调试方法

片上调试OCD图示:

image-20200704090907536

基于JTAG的嵌入式调试环境:

image-20200704091012162

8.1.4. 嵌入式系统开发过程

  1. 需求分析(系统规格说明书,含功能性/非功能性需求)

  2. 系统设计(也称总体/概要设计)

    • 体系架构设计
    • 软硬件划分
    • 硬件划分(处理器、外设、器件及开发工具的选择)
    • 软件设计(软件架构设计和软件模块划分)
  3. 系统实现(又称详细设计,包括硬件和软件实现)

  4. 系统测试(包括:测试方法、工具及步骤)

  5. 系统发布

8.2. ARM内核常用微处理器

8.2.1. 三星S3C2440A

image-20200704091411206

8.2.2. 恩智浦LPC2132

image-20200704091629541

特性:

结构原理

引脚及连接模块

端口寄存器与操作

3个32位用于引脚功能选择寄存器,即:

控制寄存器操作时,建议采用:“读→修改→写回”方式

好处是:

8.2.3. 意法半导体STM32

image-20200704113751273

系统总线

程序、数据存储器、所有外设都统一编址(4GB);各自有固定存储空间区域,使用不同总线进行访问

Cortex-M3内核,视为CPU,通过相应总线再经总线矩阵与程序、数据存储器、所有外设相接并控制其读写访问

外设分为高速/低速两类,各自通过桥接再通过AHB系统总线连至总线矩阵,实现与内核的接口;外设时钟可各自配置;两种访问操作方式:CPU直接操作和DMA方式

系统时钟,均由复位与时钟控制器RCC产生,为系统和各外设提供所需时钟以确定各自工作速度

功能模块

性能简介

8.3. 最小硬件系统

8.3.1. 微处理器最小硬件系统

image-20200704115412340image-20200704155712422

8.3.2. S3C2440A最小硬件系统

image-20200704155718015

  1. 电源模块;内核和IO接口能量来源,电压、纹波、内阻、驱动能力、防干扰等性能直接影响系统工作稳定性
  2. 时钟模块;提供同步工作信号,频率较高系统主时钟和频率较低实时时钟,倍频和同步处理后不同频率时钟信号,供各模块使用
  3. 复位模块;3种:加电和手动复位(信号来自外部复位电路,从nRESET引脚输入),内部复位(信号来自系统内部事务处理,如看门狗复位)
  4. JTAG调试接口模块;完成基本调试工作
  5. 外部存储器模块;保存和运行系统程序,如SRAM(引导)、SDRAM(程序运行)、NAND Flash(存放程序)

8.3.3. STM32最小硬件系统

image-20200704151810863

8.3.4. MCU及其周围电路设计

8.3.4.1. 电源电路

image-20200704115831236

8.3.4.2. 复位电路

image-20200704120336794

  1. 系统复位

    复位除备份区域的寄存器以外所有寄存器

    (时钟控制状态寄存器RCC_CSR中复位标志不会复位)

    触发一个系统复位有数种方式:

    • WWDG看门狗复位(窗口看门狗计数终止)
    • IWDG(Independent Watch Dog)看门狗复位(独立看门狗计数终止)
    • 软件复位(SW复位)
    • 低功耗管理复位
    • 外部手动复位
  2. 电源复位

    • 当上电/掉电复位POR和PDP(VDD小于特定阈值VPOR/VPDR时)发生或从待机模式返回时,产生电源复位
    • 复位除备份区域外的所有寄存器
    • 复位源最终作用于复位引脚,并在复位过程中保持低电平
    • 复位入口矢量被固定在地址0x00000004
  3. 备份区域复位

    仅影响备份区域,有两个专门的复位:

    • 在软件复位时,设定RCC_BDCR.BDRST位产生
    • 当电源VDD和电池VBAT都掉电前提下,VDD或VBAT重新上电时产生

复位电路:延时,使CPU保持复位,暂不进入工作状态(防止执行错误指令),确保其及各部件处于确定的初始状态,直至电压稳定复位电路直接影响系统稳定性和可靠性

8.3.4.3. 时钟电路
8.3.4.4. 调试和下载电路

image-20200704153429153

8.3.4.5. 启动电路

image-20200704153546138

8.3.4.6. 启动代码和启动过程

复位时,STM32F103存储空间和重要寄存器

image-20200704155352717

复位异常服务程序Reset_Handler的执行过程

image-20200704155435705

8.4. 嵌入式软件系统设计

8.4.1. 系统结构及工作流程

嵌入式软件系统结构

image-20200704155938420

常使用操作系统作为软件平台,由专用引导程序在系统上电时进行系统引导,对底层硬件采用驱动程序方式进行调用,各类应用程序运行于操作系统之上

嵌入式软件系统工作流程

  1. 上电复位、板级初始化:堆栈指针寄存器、BSS段及CPU芯片级(如中断控制器和内存等)初始化

  2. 系统引导/升级:多种方式

  3. 系统初始化:

    操作系统等所需:堆栈空间、数据空间,接口和外设等

    按特定顺序:内核 → 网络、文件系统 → 中间件

  4. 应用初始化:应用任务、信号量和消息队列等创建

  5. 多任务应用:多任务状态,操作系统进行任务调度

嵌入式软件系统引导和加载

嵌入式软件特点

8.4.2. 嵌入式操作系统

EOS,屏蔽底层硬件差异,为运行其上的应用程序提供统一调用接口,主要完成:内存、多任务及外围设备等的管理

一般,嵌入到微处理器或其他存储载体中,负责全部软硬件资源的分配、调度、控制、协调,提供必要运行环境(各种系统服务供调用,如文件系统、内存分配、I/O存取、中断、任务服务、时间服务、多种通信协议和用户接口函数库等)

与硬件关系紧密,一般需移植/配置

核心体积很小,常需加载/卸载某些模块满足不同功能

(嵌入式系统将所有程序,包括操作系统、驱动及应用程序等均烧写进ROM里执行。EOS更像一套函数库)

EOS的特点:

RTOS(嵌入式实时操作系统ERTOS)

8.4.3. 程序开发模式

基于寄存器

基于(ST)固件库

基于操作系统

中间件

如STM32Cube,统一集成化开发平台,整合图形式配置器和初始化C代码生成器,向导功能帮助有效配置微处理器引脚、时钟树和外设接口。配置完成,自动生成初始化C代码

8.4.4. 软件开发流程

循环轮询系统架构

最简单的,由一个初始化函数和一个无限循环构成

前后台系统架构

工程方式

  1. 从ST官网下载STM32F10x标准外设库
  2. 下载安装嵌入式开发工具(如KEIL MDK等)
  3. 以官方工程模板为基础,根据所用微处理器型号和软件编译设置,更改相关配置选项
  4. 编写程序代码,主要是User组中的main.c和stm32f10x_it.c
  5. 编译和链接工程
  6. 使用软件模拟仿真或下载硬件运行(仿真器跟踪运行)等方式调试程序
  7. 将可执行程序下载至目标微处理器内置ROM中,复位,运行

8.5. ARM中的GPIO

8.5.1. 概述

8.5.2. 工作原理

8.5.2.1. 内部结构

image-20200704162146380

输出驱动器:多路选择器、输出控制和一对互补的MOS管组成

输入驱动器:TTL肖特基触发器、带开关的上拉电阻电路和带开关的下拉电阻电路组成

输出驱动器

输入驱动器

与输出驱动器不同,输入驱动器没有多路选择开关,输入信号送到输入数据寄存器的同时也送给片上外设,所以输入没有复用功能选项

根据TTL肖特基触发器、上拉电阻端和下拉电阻端两个开关的状态,GPIO的输入可分为以下4种:

8.5.2.2. 工作模式

注意事项:

8.5.2.3. 输出速度
8.5.2.4. 复用功能重映射

复用功能重映射典型举例:

复用功能重映射的实现:

image-20200704164642973

8.5.2.5. 外部中断映射和事件输出
8.5.2.6. STM32F10x的GPIO主要特性

8.5.3. 相关库函数及寄存器

8.5.3.1. 库函数

存放于stm32f10x_gpio.hstm32f10x_gpio.c

常用库函数

初始化结构体

image-20200704165859136

典型库函数——初始化函数GPIO_Init

image-20200704170019053

8.5.3.2. 常用寄存器

image-20200704170216713

端口配置低寄存器CRL

image-20200704170412867

其余寄存器

举例:

8.5.3.3. AFIO寄存器

8.5.4. 应用与举例

GPIO开发三部曲

开始
使能APB2总线上该引脚所属GPIO端口时钟
通过GPIO_InitTypeDef结构体变量配置GPIO引脚
操作该引脚
结束

8.6. 定时器

8.6.1. 概述

STM32F103可编程定时器主要类型:

image-20200704180210954

8.6.2. 基本定时器TIM6和TIM7

8.6.2.1. 内部结构

image-20200704181159004

构成:

计数器是核心,由预分频器驱动,自动重装载预设值

TIM6和TIM7只有最基本的定时功能(提供时间基准),即累计时钟脉冲数超过预设值时,产生定时器溢出事件

如果使能了中断或DMA操作,将产生中断或者DMA操作

8.6.2.2. 时钟源

image-20200704190657588

定时器时钟源路径:

APB1预分频 → TIMxCLK → CK_INT → 预分频(PSC)→ CK_CNT

8.6.2.3. 计数模式
8.6.2.4. 基本工作原理
8.6.2.5. 主要特性

8.6.3. 通用定时器TIM2~TIM5

8.6.3.1. 内部结构

image-20200706082258355

每个通用定时器:

测量输入脉冲频率/宽度

可输出PWM脉冲

计数器CNT核心构成类似,主要增加:捕获/比较功能

捕获/比较寄存器CCR(Capture/Compare Register)

8.6.3.2. 时钟源

有多种选择,可由以下四种时钟源提供:

  1. 内部时钟CK_INT

    与基本定时器相同,来自RCC的TIMxCLK,APB1预分频器输出(通常为72MHz)。如果禁止了从模式(SMCR.SMS=000),则CR1.CENCR1.DIR及EGR.UG是事实上的控制位,且只能被软件修改(EGR.UG位仍会被自动清除)

  2. 内部触发输入ITRx

    ITRx来自芯片内部其他定时器的触发输入,使用一个定时器作为另一定时器的预分频器例如,可配置TIM1作为TIM2的预分频器

  3. 外部输入捕获引脚TIx

    TIx来自外部输入捕获引脚上的边沿信号;计数器可在选定的输入端(引脚1:TI1FP1TI1F_ED,引脚2:TI2FP2)的每个上升沿或下降沿计数;也称外部时钟模式1(之一)

    配置向上计数器在TI2输入端的上升沿技术,步骤如下,设置:

    • 捕获预分频器不用做触发,所以不需进行配置
    • 当上升沿出现在TI2时,计数器计数一次,且SR.TIF被设置
  4. 外部触发输入引脚ETR

    ETR信号来自外部引脚ETR,计数器能在外部触发输入ETR的每个上升沿或下降沿计数,也称外部时钟模式2

    配置在ETR下每2个上升沿计数一次的向上计数器,步骤如下,设置:

8.6.3.3. 计数模式

image-20200706084021146

双向计数模式

image-20200706085039228

PSC值为0(内部分频系数为1),ARR预设值为6

(CR1.CEN=1)使能计数时,计数器在CK_CNT驱动下减1计数

当计数值到达1时,产生计数器下溢事件,然后继续从0开始加1计数。当计数值到达5时,产生计数器上溢事件,然后继续从6开始减1计数

计数器在CK_CNT驱动下从0开始计数到ARR的预设值-1,然后产生一个计数器溢出事件,再向下计数到1并且产生一个计数器下溢事件,接着再从0开始重新计数

此模式不能写入CR1.DIR,由硬件更新并指示当前计数方向,更新事件产生在每次计数上溢和每次计数下溢

8.6.3.4. 普通输入捕获模式

可用来测量(输入信号)脉冲宽度或频率

通过检测CHx上的边沿信号,在其发生跳变(如上升沿/下降沿)时,(利用中断功能)将当前定时器CNT值,锁存到对应通道的捕获/比较寄存器CCRx中,把前后两次捕获到的CCR值相减,即可算出脉宽或频率

除了TIM6和TIM7,其他定时器均有输入捕获功能

捕获过程信号流程:输入信号由CHx经采样、滤波后所得信号TIxF,由边沿检测器产生信号TIxFPx(可作为从模式控制器的输入触发或作为捕获控制),再通过预分频成为ICxPS进入捕获寄存器CCR,即:

CHxTIxFTIxFPxICxPSCCR

  1. 输入通道

    待测量信号从外部引脚CH1~4进入,常称为TI1~4

  2. 输入滤波和边沿检测

    • 输入信号存在高频干扰时,需对其进行滤波,即重新采样(根据采样定律,采样频率须大于2倍输入信号)
    • 滤波器配置由CR1.CKDCCMR.ICxF控制,采样频率fSAMPLE可由fCK_INT(内部时钟)或fDTS分频后提供
    • 滤波器实质是一个事件计数器,记录到N个事件后会产生一个输出的跳变(即连续采样N次,以确认一次真实的边沿变换)。N大小可设,称为滤波器带宽/长度
    • 边沿检测器设置信号被捕获时有效边沿,可为上升沿/下降沿/双边沿,由CCER.CCxPCCER.CCxNP决定
  3. 捕获通道

    • 捕获通道即IC1~4,每个通道均对应一个CCR1~4,发生捕获时,CNT值会被锁存到CCRx
    • 捕获通道和输入通道有区别:输入通道用来输入信号,捕获通道用来捕获输入信号,一个输入信号(的通道)可同时输入给两个捕获通道(比如TI1信号经滤波边沿检测器后的TI1FP1和TI1FP2可分别进入IC1和IC2)
    • 测量输入信号脉宽时,用一个捕获通道即可;两者映射关系由CCMR.CCxS配置
  4. 预分频器

    ICx的输出信号会经过预分频器,决定发生多少个事件时进行一次捕获;事件个数由CCMR.ICxPSC配置

  5. 捕获寄存器CCR

    • 经过预分频器后的信号ICxPS是最终被捕获信号
    • 第一次捕获发生时,CNT值被锁存在CCR中,并产生中断CCxI,相应中断位SR.CCxIF被置1,通过软件或读取CCR值可将SR.CCxIF清0
    • 若发生第二次捕获(即CCR已捕获CNT值且SR.CCxIF已置1),则捕获溢出标志SR.CCxOF会被置位(对其清零只能通过软件)
    • 捕获寄存器实际由预装载和影子寄存器组成;读/写过程仅操作预装载寄存器;捕获模式下,捕获发生在影子寄存器上,然后再复制到预装载寄存器中
  6. 输入捕获过程描述

    • IC1~4可分别通过软件设置将其映射到TI1~4;每次检测到ICx信号上相应边沿后,CNT当前值被锁存到CCRx中(即捕获事件发生),SR.CCxIF被置1(若已使能中断/DMA操作,会产生中断/DMA操作)
    • 外部事件发生的触发信号由对应引脚输入
    • 输入捕获可用来捕获外部事件,并为其赋予时间标记以说明此事件的发生时刻;时间标记可用来计算频率,占空比及信号的其他特征,以及为事件创建日志
    • 例如,捕获上升沿,(前后两次值)相减,代表这两个上升沿中间那段电平的时间

    设置在TI1输入的上升沿时捕获计数器CNT值到CCR1中,如下:

    测量脉冲宽度(捕获高电平脉宽):

    • 首先设置输入捕获为上升沿触发,然后记录发生上升沿时CNT值
    • 其后,设置捕获信号为下降沿,在下降沿到来时,记录此时CNT值
    • 两次CNT值之差即为脉冲宽度

    示例:利用ST库函数实现TIM设置,使用TIM2的1/3通道进行频率测量,设置过程如下:

8.6.3.5. PWM输入捕获模式

image-20200706091814673

  1. 将待测PWM输入信号通过GPIO引脚输入到定时器PWM检测通道TI1,设置CNT向上计数(ARR预设值足够大)

  2. 输入脉冲TI1上升沿到达时,触发IC1和IC2输入捕获中断,CNT值复位为0随后,CNT在CK_CNT驱动下从0开始累加计数

  3. TI1下降沿到来时,触发IC2捕获事件,CNT当前值被锁存到CCR2中,CNT继续累加。(设TCK_CNT为CK_CNT周期)

    待测脉冲高电平时间为(CCR2+1)*TCK_CNT

  4. TI1第二个上升沿到达时,触发IC1中断,CNT当前值锁存到CCR1中,同理待测脉冲周期为(CCR1+1)*TCK_CNT

  5. 由周期和高电平时间,可算出占空比为(高电平时间/脉冲周期)*100%=(CCR2+1)/(CCR1+1)

8.6.3.6. 比较输出模式

比较输出模式下翻转OC1的时序图:

image-20200706092141918

  1. 比较输出寄存器

    当CNT值跟CCR值相等时,输出参考信号OCxREF会发生改变(再经过一系列控制后成为真正输出信号OCx/OCxN),并产生比较中断CCxISR.CCxIF置1

  2. 死区发生器

    仅高级定时器才有;在OCxREF基础上,插入死区时间,用于生成两路互补的输出信号OCxOCxN

  3. 输出控制

    进入输出控制电路的信号被分成两路,原始和被反向信号(通过设置CCER.CCxPCCER.CCxNP控制极性选择);由OCx输出到外部引脚CHx/CHxN(通过设置CCER.CxECCER.CxNE控制是否输出)

  4. 输出引脚

    比较输出的输出信号最终通过定时器外部IO输出,分别为CH1~4(前三通道还有互补的输出通道CH1~3N)

  5. 比较输出模式种类

    共8种:冻结、匹配时输出有效/无效电平、翻转、强制为有效/无效电平、PWM1/2;(通过设置CCMR.OCxM选择模式)。其中,

    • PWM1/2:是比较输出的特例,使用也最多
    • 强制输出有效/无效:直接由软件强制为有效(高电平)或无效(低电平),不依赖于比较结果(但仍可有中断和DMA请求)
  6. 比较输出原理

    即通过(计数值和CCR比较后)定时器外部引脚输出受控的波形。可认为有两部分实现信号(的受控)输出:

    • 一是计数部分,将计数器CNT设为某工作模式并初始化后,CNT不停自动计数
    • 一是比较部分,设置匹配值CCR,并在CNT计数过程中,不停将当前计数值与CCR值进行比较,二者相等时产生一个匹配,然后根据(输出的)具体设置,输出高/低电平信号,从而在输出端生成预期波形

    比较输出模式的说明:

    • 匹配发生时,会产生比较中断(中断已使能时)
    • 设置CCMRx.CCxS=00,即选择相应通道为输出模式
    • CCMRx.OCxPE选择CCRx是否需要使用预装载寄存器
    • 比较输出模式下,UEV对OCxREFOCx输出没有影响
    • 比较输出精度可达到计数器的一个计数周期
    • 比较输出模式(在单脉冲模式下)也可输出一个单脉冲
  7. PWM输出模式

    • PWM的定义和应用

      脉冲宽度调制(简称脉宽调制),指对脉冲宽度的控制,利用数字输出对模拟电路进行控制。在电力电子中应用广泛,包括:测量、通信、功率控制与变换、电机控制、伺服控制、调光、开关电源等

    • PWM的实现

      • 传统数字电路方式:电路设计较复杂,体积大,抗干扰能力差,系统控制周期较长
      • 微处理器普通I/O模拟方式:通过CPU操控普通I/O口实现PWM输出,时间消耗大,CPU效率低,精度低
      • 微处理器PWM直接输出方式:简单配置后即可在(具有PWM输出功能)微处理器指定引脚上输出PWM脉冲
    • PWM输出模式的工作过程

      假设:CNT向上计数,ARR预设值N,CNT当前计数值X,CCR预设值A,时钟周期TCK_CNT。工作过程:

      • X在CK_CNT驱动下从0开始不断累加计数

      • X(在计数同时)与A进行比较:

        若X<A,输出高/低电平;若X≥A,输出低/高电平

      • 当X大于N时,X清零并重新开始计数

      循环往复,所得PWM输出信号:周期为(N+1)*TCK_CNT,脉冲宽度为A*TCK_CNT,占空比为A/(N+1)

    • PWM输出模式的说明

      • 对外输出脉宽可调方波信号,ARR值确定频率,CCR值确定占空比;占空比=(CCR+1)/(ARR+1)
      • 设置CCMRx.OCxM=110(PWM模式1)或=111(PWM2),能独立设置每个OCx输出通道产生一路PWM
      • 设置CCMRx.OCxPE=1,可使能相应CCR预装载寄存器
      • 开始计数之前,须设置EGR.UG=1来初始化所有寄存器
      • OCx极性通过设置CCER.CCxP实现(高/低电平)
      • OCx输出使能通过CCER.CCxECCER.CCxNEBDTR.MOEBDTR.OSSIBDTR.OSSR的组合控制
      • PWM模式1/2下,依据计数方向,确定是否CCRx≤CNT,并根据CR1.CMS状态,选择边沿或中央对齐模式
  8. 单脉冲模式OPM

    • 众多模式的一个特例
    • 允许计数器响应一个激励,在可编程延时后产生一脉宽可程序控制的脉冲
    • 软件可设定选用两种单脉冲模式波形:单脉冲或重复脉冲
  9. 编码器接口

    • 编码器常用于测量运动系统(直线和圆周运动)位置和速度
    • 编码器接口模式用作对外部设置的方向选择
    • 计数器提供当前位置信息(如电动机转子旋转角度)
    • 为获取动态信息(速度、加速度),须通过另一定时器测量产生两个周期性事件之间的计数值
  10. 主要特性(相比基本定时器所增加特性)

    • 自动重装载16位递增/递减计数器,具备3种计数模式
    • 时钟来源,除内部时钟,另有:内部触发输入ITRx、外部输入捕获TIx、外部触发输入ETR
    • 4独立通道,均可用于输入捕获、比较输出、PWM输入和输出(边沿或中央对齐模式)及单脉冲模式输出
    • 在更新事件(上溢/下溢、软件或内部/外部触发引起计数器初始化)、触发事件(计数器启动/停止/初始化或内部/外部触发计数)、输入捕获、比较输出等发生时,可产生中断/DMA请求
    • 支持针对定位的增量(正交)编码器和霍尔传感器电路
    • 使用外部信号控制定时器和定时器互连的同步电路

8.6.4. 高级定时器TIM1和TIM8

除具有通用定时器所有功能外,还可视为一个分配到6个通道的三相PWM发生器,具有嵌入死区时间的互补PWM输出

完全独立,不共享任何资源,可同步操作

  1. 内部结构

    与通用定时器相比,主要多了BRK和DTG两个结构,因而具有死区时间控制功能

  2. 时钟源

    与通用定时器唯一的不同在于:内部时钟CK_INT的来源TIMxCLK来自APB2预分频器输出,上电复位后,APB2预分频系数为1,TIMxCLK是APB2时钟PCLK2(通常为72MHz)

  3. 功能描述

    相比通用定时器,另具有三相六步电机的接口、刹车功能及用于PWM驱动电路的死区时间控制,非常适于控制电机

  4. 主要特性

    • 内部时钟CK_CNT来源TIMxCLK来自APB2预分频器输出
    • 具有重复计数器,允许在指定数目的计数器周期之后更新
    • 触发输入作为外部时钟或按周期的电流管理
    • 中止(也称刹车)输入信号可将输出信号置于复位状态或一个已知状态
    • 死区时间可编程的互补输出

8.6.5. 主从模式、触发与同步

所有TIMx均在内部相连,用于同步或级联

定时器一般通过软件设置启动,也可由另一定时器触发或通过外部信号触发而启动,还可通过另一定时器某一条件被触发而启动(某一条件可为:定时到时、定时器超时、比较成功等)

通过一个定时器触发另一定时器的工作方式,有时也称为定时器的同步

发出触发信号的定时器工作于主模式,接受触发信号而启动的定时器工作于从模式

8.6.5.1. 主从模式

定时器工作于主模式时,能产生触发输出(并作为其它定时器的触发输入)信号,还可对另一处于从模式的定时器进行复位、启动、停止或提供时钟等操作

定时器工作于从模式时,受到外来触发信号的影响或控制,其具体工作模式又可分为多种

定时器处于主从双角色模式:既受外来触发信号影响或控制,同时又能输出触发信号影响或控制其他从定时器

image-20200706100051394

8.6.5.2. 触发

触发输出信号(TRGO)

TIM输出(至其它TIM或外设的)触发信号;一般有数种方式产生:

触发输入信号(TRGI)

从外部引入(到TIM)的触发信号,根据SMCR.TS设置,分为3类,共8个,如下:

来自定时器外部的各种触发输入信号TRGI ,均须经过触发输入选择器连接至从模式控制器SMCR(控制或影响计数器工作),此时TIM工作于从模式

image-20200706100451198

8.6.5.3. 从模式下的工作模式

从模式控制器检测到触发输入信号时,有多种控制方式(以控制或影响TIM工作),形成相应工作模式,如下:

8.6.5.4. 定时器级联及同步
  1. 使用一个定时器作为另一个定时器的预分频器

    配置定时器1作为定时器2的预分频器,TIM2由TIM1周期性的上升沿(即TIM1的计数器溢出)信号驱动

  2. 使用一个外部触发同步地启动2个定时器

    定时器1的TI1输入上升时使能定时器1,使能定时器1的同时使能定时器2

    当TIM1的TI1上出现一个上升沿时,TIM1和TIM2同步地按照内部时钟开始计数两个TIF标志也同时被设置。为保证计数器对齐,TIM1须配置为主/从模式(既是主也是从)

8.6.6. 相关库函数及寄存器

8.6.6.1. 库函数

存放于stm32f10x_tim.hstm32f10x_tim. c文件中

常用库函数

初始化结构体

基本初始化结构体TIM_TimeBaseInitTypeDef

输入捕获初始化结构体TIM_ICInitTypeDef

比较输出初始化结构体TIM_OCInitTypeDef

典型库函数

image-20200706102255009

8.6.6.2. 常用寄存器

8.6.7. 小结及应用要点

8.6.7.1. 定时器配置要点

频率设置

时钟来源

4类共8个触发源,可作为定时器时钟源

计数器模式

编程步骤

  1. 配置系统时钟
  2. 配置NVIC
  3. 配置GPIO
  4. 配置TIM

image-20200706103236671

8.6.7.2. PWM程序实现步骤

实质上,PWM就是定时器的一个比较功能,利用翻转输出,形成一个具有一定脉冲宽度的高/低电平周期波

PWM频率取决于ARR,占空比取决于CCR

  1. 配置输出通道

    • 选择使用某个/某几个通道作为PWM输出通道,其对应引脚(其实就是GPIO)须进行时钟和引脚输出方式配置

    • 一般为复用推挽输出AF_PP

    • 应用中,可选不同引脚(即,改变GPIO与输出通道默认映射关系),此时须使用重定向功能Remap,即:

      • 引脚配置时,打开AFIO时钟(复用时钟使能),调用Remap函数进行引脚重定向
  2. 配置定时器

    • 计算并设置ARR、PSC、CCR值,以确定频率及占空比
    • 选择时钟源、配置其余参数,与前述类似
    • 配置PWM相关寄存器,设置某一通道CHx为PWM模式,并使能其输出
  3. 配置PWM模式(即输出特性)

    配置TIM3_CCMR1相关位来控制TIM3_CH3模式,利用TIM_OC3Init实现,其原型:

8.6.7.3. PWM程序实现的3个要点

PWM两种输出模式

模式1(PWM1)和模式2(PWM2),由CCMR.OCxM值确定(110 为模式1,111为模式2);模式1和2正好互补,互为相反,运用差别不大

动态调整占空比

修改CCR可控制输出占空比,库函数TIM_SetComparex用于修改占空比(x为1~4,代表相应通道),其原型为:

PWM输出基本步骤

  1. 设置RCC时钟
  2. 设置GPIO
  3. 设置TIMx相关寄存器
  4. 设置TIMx的PWM相关寄存器
  5. 动态调整PWM占空比

8.7. 中断控制器

8.7.1. 中断系统综述

8.7.1.1. 嵌套向量中断控制器NVIC
8.7.1.2. 中断优先级

决定一个中断是否能被屏蔽及何时可响应(未屏蔽时)

优先级分组

优先级实现

中断响应顺序

8.7.1.3. 中断向量表
8.7.1.4. 中断服务函数ISR

image-20200706105105151

8.7.1.5. 中断设置过程

image-20200706105209336

  1. 建立中断向量表

    • 可按需,在Flash或RAM中建立中断向量表,且须在应用程序执行前完成(通常在启动过程中完成)
    • 在Flash中;不须重定位中断向量表;运行过程中,每个中断对应固定的ISR不能更改;这也是默认设置
    • 在RAM中;需重定位中断向量表;运行过程中,可动态改变ISR
  2. 分配栈空间并初始化

    • 执行ISR时,进入Handler模式,会使用主堆栈的栈顶指针MSP;此步须在应用程序执行前完成(通常启动过程中完成)
    • 分配栈空间:栈空间通常位于启动代码起始位置;空间须够大,以保证中断响应/返回时保护和恢复现场(xPSR、PC、LR、R12、R3~R0共8个),避免中断发生/嵌套时主堆栈溢出
    • 初始化栈:通常在上电复位后执行复位服务程序时完成
  3. 设置中断优先级

    • 设置中断优先级分组(的位数)

      4位中,抢占优先级和子优先级各占几位(二者和为4),可有5种方式:抢占优先级0~4位/子优先级4~0位NVIC_PriorityGroup_0~4

    • 设置抢占优先级和子优先级,根据上一步中分组情况,分别设置抢占和子优先级(即在各自取值范围中设置优先级确定值)

  4. 使能中断

    通过失效中断总屏蔽位和分屏蔽位,可使能对应中断

  5. 编写对应ISR代码

    ISR最后,退出程序前应清除对应中断标志位(表示该中断已处理完毕),否则,该中断请求始终存在,该ISR将被反复执行

8.7.2. 外部中断/事件控制器EXTI

8.7.2.1. 内部结构

image-20200706105920887

组成:

外部中断/事件输入线

image-20200706133539694

APB外设接口

通过此接口访问各功能模块。若使用引脚的外部中断/事件映射功能,须打开APB2总线上该引脚对应端口时钟及AFIO功能时钟

边沿检测器

共19个,用来连接19个外部中断/事件输入线,是EXTI主体部分。由边沿检测电路、控制寄存器、门电路和脉冲发生器组成

8.7.2.2. 工作原理

外部中断/事件请求的产生和传输

从输入(外部输入线)到输出(外部中断/事件请求信号),过程依次

  1. 外部信号从①引脚进入
  2. 经过②边沿检测电路;此电路受上升沿/下降沿触发选择寄存器(两个平行寄存器)控制,可配置选择上升沿/下降沿/双边沿(同时选择上升沿和下降沿)产生中断/事件
  3. 经过③或门;此或门另一输入是软件中断/事件寄存器,软件可优先于外部信号产生一个中断或事件请求(即当软件中断/事件寄存器对应位为1时,不管外部信号如何,或门都会输出有效信号);至此,无论中断或事件,外部请求信号传输路径一致
  4. 外部请求信号进入④与门;此与门另一输入是事件屏蔽寄存器(其对应位为0,则屏蔽某外部事件,该外部请求信号不能传输到与门另一端;为1,则与门产生有效输出并送至⑤脉冲发生器);脉冲发生器把一个跳变信号转变为一个单脉冲,输出到其他功能模块;此为外部事件请求信号传输路径,即:①→②→③→④→⑤
  5. 外部请求信号进入请求挂起寄存器(记录外部信号电平变化);然后进入⑥与门;此与门功能和④与门类似,引入中断屏蔽寄存器控制(仅当其对应位为1时,该外部请求信号才被送至NVIC,从而发出一个中断请求,否则,屏蔽之);此为外部中断请求信号传输路径,即:①→②→③→⑥

事件与中断

从外部激励信号看,中断和事件的请求信号没有区别,只是在STM32F103内部将它们分开:

主要特性

8.7.3. 相关库函数及寄存器

8.7.3.1. 库函数

常用NVIC库函数

存放于标准外设库的misc.hmisc.c文件中

常用EXTI库函数

存放于stm32f10x_exti.hstm32f10x_exti.c文件中

使用EXTI前,需先使用GPIO库函数

GPIO_EXTILineConfig,将指定GPIO引脚设置为EXTI线

初始化结构体

NVIC初始化结构体NVIC_InitTypeDef

AFIO结构体AFIO_TypeDef

EXTI初始化结构体EXTI_InitTypeDef

EXTI控制寄存器定义结构体EXTI_TypeDef

典型库函数

image-20200706140248276

8.7.3.2. 常用寄存器
  1. EXTI的,所有(共6个)32位寄存器中,位[31:19]保留,位[18:0]需定义,如下(x为0~18,对应19个外部中断)

    • IMR中断屏蔽寄存器,位[18:0]:MRx,线x上的中断屏蔽;0:屏蔽;1开放;开启相应线上事件触发
    • EMR事件屏蔽寄存器,位[18:0]:MRx,线x上的事件屏蔽;0:屏蔽;1开放;开启相应线上中断
    • RTSR上升沿触发选择寄存器,位[18:0]:TRx,线x上的上升沿触发配置(中断和事件);0:禁止;1:允许;用于允许相应线上上升沿触发中断/事件
    • FTSR下降沿触发选择寄存器,类似RTSR,下降沿触发;若下降/上升沿同时设置,则为任意边沿触发
    • SWIER软件中断事件寄存器,位[18:0]:SWIERx,线x上的软件中断;为0时,写1将设置PR中相应挂起位(若IMR和EMR允许产生该中断,则此时将产生一个中断);通过清除PR对应位(写1),可清除该位为0;用于产生一个软件中断,效果等同于外部中断触发
    • PR挂起寄存器,位[18:0]:PRx,挂起位;0:未发生触发请求;1:发生所选触发请求;当外部中断线上发生了所选定边沿事件,该位被置1;向该位写1可清除其(为0)。也可通过改变边沿检测极性清除。可用于查询中断
  2. NVIC,共有7种控制寄存器组,除IPR/IR外,其余6种/组,每组共60个有效位,每位分别对应60个可编程可屏蔽中断

    • ISER中断使能寄存器组,两个字,共63位,用了60位,一个位对应一个中断,写1中断有效,写0无意义
    • ICER中断除能寄存器组,两个字,用了60位,类似;和使能寄存器功能相反,写1中断失效,写0无意义
    • ISPR中断挂起控制寄存器组,两个字,类似;写1有效,可将正在运行的中断挂起,从而执行同级别或更高级别的中断;写0 无意义
    • ICPR中断解挂寄存器组,两个字,类似;和挂起寄存组功能相反;写1有效,写0无意义
    • IABR中断激活标志位寄存器组,两个字,类似;只读,通过读取,可知哪个中断正在被执行(对应的位被置1);中断执行完后对应位清零
    • IPR/IR中断优先级寄存器,15个字,共60个字节,每字节对应一个中断,高4位有效(低4位保留),又分为抢占优先级(在前)和子优先级(在后),各占几位需根据SCB(System Control Block Structure)中应用程序中断及复位控制寄存器AIRCR(Application Interrupt and Reset Register)的中断分组设置决定;AIRCR的PRIGROUP[10:8]用于指定优先级(即分配preemption和sub优先级,共分5组,取值及含义如前述)
    • STIR软件触发寄存器,两个字;用于软件触发(置1)
  3. AFIO_EXTICR1~4外部中断配置寄存器1~4

    • 为将I/O口设置为外部中断入口以作为中断源,须利用GPIO复用功能,将I/O口映射到相应外部事件,即:

    • EXTICRx(x=1~4),可由软件读写,选择外部中断的输入源;其映射规则如下:

      • 4个32位EXTICRx,每个仅用低16位,每4位分成1组,4个寄存器共16组,依次从低到高,对应16个I/O口(0~15),每组的4位数取值从0~6,对应A~G

8.7.4. 小结及应用要点

中断、异常、外部中断及EXTI

EXTI中断向量及中断服务函数

image-20200706145125298

相应中断服务函数名称(在启动文件startup_stm32f10x_hd.s中):EXTI0_IRQHandlerEXTI1_IRQHandlerEXTI2_IRQHandlerEXTI3_IRQHandlerEXTI4_IRQHandlerEXTI9_5_IRQHandlerEXTI15_10_IRQHandler

配置及应用外部中断步骤要点

  1. 初始化I/O口为复用AFIO输入GPIO_Init
  2. 开启I/O口复用时钟RCC_APB2PeriphClockCmd
  3. 设置I/O口与中断线映射关系GPIO_EXTILineConfig
  4. 初始化线上终端,设置触发条件EXTI_Init
  5. 配置中断分组NVIC_PriorityGroup,使能中断NVIC_Init
  6. 编写中断服务函数EXTIx_IRQHandler
  7. 清除中断标志位EXTI_ClearITPendingBit

EXTI及NVIC的初始化

中断服务程序

8.8. USART

8.8.1. 主要特性

8.8.2. 内部结构

image-20200706150045305

相关引脚简介

数据发送过程

数据发送,须设置相关寄存器各位,过程如下:

  1. CR1.UE置位1,激活USART
  2. CR1.M定义字长
  3. CR2.STOP定义停止位位数
  4. 若采用多缓冲器通信,配置CR3.DMAT使能DMA
  5. 利用BRR选择波特率
  6. 置位CR1.TE,发送一个空闲帧作为第一次数据发送
  7. 将要发送数据写入DR(此动作会清除SR.TXE);一个缓冲区情况下,重复7

数据接收过程

配置过程:

  1. CR1.UE置位1,激活USART
  2. CR1.M定义字长
  3. CR2.STOP定义停止位位数
  4. 若采用多缓冲器通信,配置CR3.DMAT使能DMA
  5. 利用BRR选择波特率
  6. 置位CR1.RE,激活接收器,开始寻找起始位
  7. 接收到一个字符时,SR.RXNE被置位,并产生中断(已使能时,即CR1.RXNEIE=1);若检测到帧/溢出/噪声错误,相应标志会置位(供查询)
  8. SR.RXNE清零(多缓冲由DMA读SR/单缓冲由软件读SR/通过对其写0:完成),须在下一字符接收结束前完成,避免溢出错

8.8.3. USART中断

image-20200706150723085

8.8.4. 相关库函数及寄存器

8.8.4.1. 库函数

常用库函数

存放于stm32f10x_usart.hstm32f10x_usart.c文件中

初始化结构体

USART初始化结构体USART_InitTypeDef

典型库函数

image-20200706151709356

例:需设置参数为波特率,字长,停止位,奇偶校验位,硬件数据流控制,模式(收/发)

image-20200706151915999

在接收到数据时(RXNE读数据寄存器非空),要产生中断,开启中断方法:

在发送数据结束时(TC发送完成),要产生中断,开启中断方法:

image-20200706152027983

某中断发生时,会置位SR中某标志位,中断处理函数中,可调用此函数判断该中断是否发生。如,串口发送完成时,产生中断,对其判断:

若返回值是SET,说明中断发生判断读寄存器是否非空(RXNE):

判断发送是否完成(TC):

8.8.4.2. 常用寄存器

共7个:状态寄存器SR、数据寄存器DR、波特率寄存器BRR、控制寄存器CR1~3、保护时间和预分频寄存器GTPR

8.8.5. 小结及应用要点

8.8.5.1. 库函数开发STM32F103外设过程

image-20200706153130545

初始化外设PPP

操作外设PPP

外设PPP输入/输出,常置于main的无限循环体或相应中断服务函数中;运行期间,条件满足时将反复执行

8.8.5.2. STM32F10x标准外设库函数的分类和命名
8.8.5.3. USART配置的一般步骤
  1. GPIO时钟及串口时钟使能RCC_APB2PeriphClockCmd
  2. 串口复位(非必须)USART_DeInit
  3. GPIO端口模式(Rx/Tx)设置GPIO_Init;引脚复用映射(非必须)GPIO_PinAFConfig
  4. 串口初始化USART_Init
  5. 开启中断并初始化NVIC(非必须)NVIC_InitUSART_ITConfig
  6. 使能串口USART_Cmd
  7. 编写中断处理函数(非必须)USARTx_IRQHandler
  8. 串口数据收/发USART_ReceiveDataUSART_SendData
  9. 串口传输状态获取(并判断处理)USART_GetFlagStatusUSART_ClearITPendingBit
8.8.5.4. 注意事项

8.9. SPI

8.9.1. SPI工作原理

可与外部设备以半双工/全双工、同步、串行方式通信(含CRC);使用一条双向数据线的双线单工同步传输

常为主模式(可多主),为各从设备提供通信时钟SCK

主要应用于:EEPROM,FLASH,实时时钟,AD转换器,数字信号处理器和解码器等

8.9.1.1. 主要特性
8.9.1.2. 内部结构

image-20200706164048321

8.9.1.3. SPI主模式

作为主设备,产生SCK时钟信号;MOSI输出,MISO输入

配置步骤

  1. 设置串行时钟波特率CR1.BR[2:0]

  2. 设置SPI协议CR1.CPOL和CR1.CPHA

  3. 设置数据格式CR1.DFF和CR1.LSBFIRST

  4. 设置NSS工作模式:

    • NSS作为输出:置位CR2.SSOE位(可调用SPI_SSOutputCmd实现)时,开启主模式下NSS输出(输出低电平),此时,当其他SPI的NSS引脚与其相连,会收到低电平,即片选成功,成为从设备
    • NSS作为输入:硬件模式下,整个数据帧传输期间应把NSS脚连接到高电平;软件模式下,需将CR1.SSMCR1.SSI置1;此时,NSS引脚被释放出来,可作他用(如,可作为普通GPIO引脚,驱动从设备片选信号)
  5. 设置CR1.MSTRCR1.SPE:仅当NSS脚连到高电平,这些位才能保持置位

数据发送过程

数据接收过程

小结

8.9.1.4. SPI从模式

作为从设备,SCK接收主设备时钟,MOSI输入,MISO输出

主设备发送时钟前,应先使能从设备(否则可能会发生意外的数据传输),且通信时钟第一个边沿到来之前或正进行的通信结束之前,从设备的数据寄存器须就绪

配置步骤

  1. 设置SPI协议CR1.CPOL和CR1.CPHA(须和主设备配置相同,保证正确数据传输)

  2. 设置数据格式CR1.DFF和CR1.LSBFIRST(和主设备配置相同)

  3. 设置NSS工作模式:

    • NSS只能作为输入(不能作为输出)
    • 硬件模式下,在完整的8/16位数据帧传输过程中,NSS引脚须为低电平
    • 软件模式下,需置位CR1.SSM并清除CR1.SSI
  4. 清除CR1.MSTR,置位CR1.SPE,引脚工作于SPI模式下

数据发送过程

数据接收过程

8.9.1.5. SPI状态标志和中断

状态标志

SPI中断

image-20200706170800313

同一SPI各种中断事件都被连接到同一中断向量,不同SPI有不同中断向量

中断事件中,最常用:

8.9.1.6. SPI发送/接收数据

image-20200706170951781

8.9.2. SPI相关库函数及寄存器

8.9.2.1. 库函数

常用库函数

存放于stm32f10x_spi.hstm32f10x_spi.c

初始化结构体

SPI初始化结构体SPI_InitTypeDef

典型库函数

image-20200706174826560

image-20200706174949584

8.9.2.2. 常用寄存器

image-20200706175031172

image-20200706175956679

8.9.3. SPI小结与应用要点

SPI配置一般步骤

  1. 配置相关引脚(复用)功能GPIO_Init
  2. 使能SPIx时钟RCC_APB2PeriphClockCmd
  3. 初始化SPIx,设置工作模式SPI_Init
  4. SPIx使能SPI_Cmd
  5. SPI传输数据SPI_I2S_SendDataSPI_I2S_ReceiveData
  6. 查看SPI传输状态SPI_I2S_GetFlagStatus

注意事项

image-20200706180643645

8.10. I2C

8.10.1. I2C工作原理

8.10.1.1 主要特性
8.10.1.2. 内部结构

image-20200706180847810

8.10.1.3. I2C主/从模式

image-20200706182411240

主发送器发送流程及事件说明:

  1. 控制产生起始信号S,发送S后,产生事件EV5(并会对SR1.SB置1,表示起始信号已经发送)
  2. 发送设备地址并等待应答信号,若有从机应答,则产生事件EV6及EV8(此时SR1.ADDR及SR1.TXE被置1,表示地址已经发送及数据寄存器为空)
  3. 对SR1.ADDR清零后,待发送数据写入DR(SR1.TXE被重置0,表示数据寄存器非空),通过SDA一位位发送数据,完毕,产生EV8事件(SR1.TXE被置1),重复此过程,可发送多个字节数据
  4. 发送数据完成后,主设备发出一个停止信号P,产生EV8_2 事件(SR1.TXE及SR1.BTF均被置1,表示通信结束)
8.10.1.4. I2C中断

image-20200706182809940

8.10.2. I2C相关库函数及寄存器

8.10.2.1. 常用库函数

存放于stm32f10x_i2c.hstm32f10x_i2c.c

8.10.2.2. 初始化结构体

I2C初始化结构体I2C_InitTypeDef

8.10.2.3. 典型库函数

image-20200706195330793

8.10.3. I2C小结及应用要点

I2C配置的一般步骤

  1. 配置相关引脚(复用)功能GPIO_Init
  2. 使能I2Cx时钟RCC_APB1PeriphClockCmd
  3. 初始化I2Cx,设置工作模式I2C_Init
  4. I2Cx使能I2C_Cmd
  5. 发起始信号及地址I2C_GenerateSTARTI2C_Send7bitaddress
  6. I2C传输数据I2C _SendDataI2C _ReceiveData
  7. 查看I2C传输状态I2C_GetFlagStatus

I2C应用要点及细节

附录

中英文术语对照表

英文简称英文全称中文译名
ENIACElectronic Numerical Integrator And Calculator电子数字积分器和计算器
EDVACThe Electronic Discrete Variable Automatic Computer离散变量自动电子计算机
EDSACElectronic Delay Storage Automatic Calculator存储程序式电子计算机
PAPhysic Address物理地址
ALUArithmetic and Logic Unit算术逻辑单元
IRInstruction Register指令寄存器
IDInstruction Decoder指令译码器
OCInstruction Controller指令控制器
LSILarge Scale Integrated大规模集成电路
VLSIVery Large Scale Integration甚大规模集成电路
ULSIUltra Large Scale Integration超大规模集成电路
EMPUEmbedded Microprocessor Uni嵌入式微处理器
EMCUEmbedded Microcontroller Unit嵌入式微控制器
DSPDigital Signal Processor数字信号处理器
SOCSystem On Chip片上系统
SOPCSystem on a Programmable Chip可编程片上系统
CISCComplex Instruction Set Computer复杂指令集计算机
RISCReduced Instruction Set Computer简化指令集计算机
RAMRandom Access Memory随机存取存储器
DRAMDynamic Random Access Memory动态随机存取存储器
ACCAccumulator累加器
FRFlag Register标志寄存器
PSRProgram State Register程序状态寄存器
PSWProgram State Word程序状态字
CUControl Unit控制单元
EUExecution Unit执行单元
ISAInstruction Set Architecture指令集架构
PCProgram Counter程序计数器
EPICExplicitly Parallel Instruction Computers精确并行指令计算机
IPCInstruction Per Clock每一时钟周期内所执行的指令多少
BTBBranch Target Buffer转移/分支目标缓冲器
SISDSingle Instruction Single Data单指令流单数据流
SIMDSingle Instruction Multiple Data单指令流多数据流
CMPChip Multiprocessor片上多处理器
VAVirtual Address虚拟地址
JTAGJoint Test Action Group联合测试组
EPIEnergy Per Instruction每条指令的耗能
MIPSMillion Instructions Per Second单字长定点指令平均执行速度
ROMRead Only Memory只读存储器
DRAMDynamic Random Access Memory动态随机存取存储器
SRAMStatic Random Access Memory静态随机存取存储器
EEPROMElectrically Erasable Programmable Read Only Memory电可擦除可编程只读存储器
IDEIntegrated Device Electronics电子集成驱动器
ATAAdvanced Technology Attachment高级技术连接
SCSISmall Computer System Interface小型计算机系统接口
SATASerial ATA串行ATA
SASSerial Attached SCSI串行连接SCSI接口
eMMCembedded Multi Media Card嵌入式多媒体卡
UFSUniversal Flash Storage通用闪存存储
RASRow Address Strobe行地址选通信号
CASColumn Address Strobe列地址选通信号
PLDProgrammable Logical Device可编程逻辑器件
SPDSerial Presence Detect模组存在的串行检测
FPMFast Page Mode快速页面模式
EDOExtended Data Out扩展数据输出
SDRAMSynchronous DRAM同步动态随机存取内存
MMUMemory Manage Unit内存管理单元
DMADirect Memory Access直接存储访问
AMBAAdvanced Microcontroller Bus Architecture高级微控制器总线架构
AHBAdvanced High-performance Bus高级高性能总线
ASBAdvanced System Bus高级系统总线
APBAdvanced Peripheral Bus高级外设总线
PCIPeripheral Component Interconnect外部设备互连
NVICNested Vectored Interrupt Controller嵌套中断控制器
IVTInterrupt Vector Table中断向量表
SPISerial Peripheral Interface串行外设接口
I2CInter Integrated Circuit集成电路总线
ISAInstruction Set Architecture指令集体系结构
TCMTightly Coupled Memory紧耦合内存
WICWake-up Interrupt Controller唤醒中断控制器
PMUPower Management Unit电源管理单元
ETMEmbedded Trace Macro-cell嵌入式跟踪宏单元
ITMInstrumentation Trace Macro-cell指令跟踪宏单元
DWTData Watchpoint and Trace数据观察点和跟踪单元
FPBFlash Patch and Breakpoint UnitFlash地址重载和断点单元
TPIUTrace Port Interface Unit跟踪端口接口单元
SCSSystem Control Space系统控制空间
CMSISCortex Microcontroller Software Interface Standard微控制器软件接口标准
SCBSystem Control Block系统控制块
CCRConfiguration Control Register配置控制寄存器
DBMData Memory Barrier数据存储器屏障
DSBData Synchronization Barrier数据同步屏障
ISBInstruction Synchronization Barrier指令屏障
MSPMain Stack Pointer主栈指针
PSPProcess Stack Pointer进程栈指针
ISERInterrupt Set-enable Registers中断设置使能寄存器
ICERInterrupt Clear-enable Registers中断清除使能寄存器
ISPRInterrupt Set-pending Registers中断设置挂起寄存器
ICPRInterrupt Clear-Pending Registers中断清除挂起寄存器
IABRInterrupt Active Bit Registers中断激活位寄存器
IPRInterrupt Priority Registers中断优先级寄存器
STIRSoftware Trigger Interrupt Registers软件触发中断寄存器
ICSRInterrupt Control and State Register中断控制和状态寄存器
AIRCRApplication Interrupt and Reset Control Register应用中断和复位控制寄存器
SHPRSystem Handler Priority Register系统处理优先级寄存器
SHCSRSystem Handler Control and State Register系统处理控制和状态寄存器