嵌入式期末复习笔记

第一章 微型计算机基础

1.1 冯·诺依曼结构

  • 指令、数据一律用二进制编码,且存储在同一组存储器中
  • 计算机顺序执行程序,即把要执行的程序和数据首先存入主存储器,执行程序时,自动地并按顺序地从主存储器中取出指令一条一条地执行。
  • 计算机硬件由运算器、控制器、存储器、输入设备和输出设备组成

1.2 哈弗结构

  • 使用两个独立的存储模块,分别存储指令和数据,每个模块都不允许指令和数据并存
  • 使用独立的两组总线,分别作为CPU与每个存储器模块之间的专用通信路径,而这两条总线之间毫无联系

1.3 CISC和RISC概念

(1)CISC:复杂指令系统计算机(典型用例:X86体系结构)

  • 功能对应一条指令基本上是一个功能对应一条指令
  • 指令系统庞大、功能复杂、指令格式多、寻址方式多
  • 多个机器周期完成指令
  • 各种指令都可以访问存储器
  • 采用微程序控制
  • 专用寄存器少

(2)RISC:精简指令系统计算机(典型用例:ARM架构)

  • 指令功能简单,特殊功能需要一系列简单指令完成
  • 对存储器操作有限制,使控制简化
  • 中断处理灵活,在一条指令执行的适当地方可以中断(CISC必须等指令结束才可响应中断)
  • CPU包含单元少,面积小,功耗低
  • CPU结构简单,指令规整

1.4 微型计算机系统的组成

1.硬件系统

2.软件系统

1.5 硬件系统的组成

(1)微处理器(CPU):硬件核心部件,实现运算和控制功能

(2)主存储器:需要运行的程序和数据存放的地方

(3)IO接口及设备:IO接口是CPU与外部设备的桥梁。输入输出设备是实现人机交互的部件

(4)总线:微机各个部件连接的纽带,是各个功能部件之间进行信息交互的公共通道。

  • 地址总线:单向总线。用于传输CPU发出的地址编码信息,以便访问制定的存储单元或IO接口中的端口
  • 数据总线:双向。用于CPU与主存储器之间或者CPU与IO端口之间数据传输
  • 控制总线:双向。用来传输控制信号。

1.6 软件系统组成

(1)系统软件

语言翻译程序:汇编程序、解释程序、编译程序

监控管理程序、调试程序、故障检查程序、诊断程序

操作系统

开发工具: KEIL、VISUAL STUDIO、DELPHI

(2)应用软件

1.7 微型计算机的工作流程

  1. 取指令阶段

程序的起始地址放到程序指针PC中,将PC中的地址信息发到地址总线上,经过地址译码器找到相应的存储单元,将机器指令代码出,送到指令寄存器IR中。PC自动加1,指向下一条指令。

  1. 指令译码阶段

将指令代码送到指令译码器ID中进行指令译码,得到各种控制信号(时序信号),指挥CPU各部件协调工作

  1. 执行阶段

获取操作数,算数逻辑单元ALU对操作数进行运算,存放运算结果,更新标志寄存器FR。

第二章 Cortex-M3基础

2.1 基本微处理器的功能结构

2.1.1  算术逻辑运算单元(ALU)

完成各种运算的部件,包括算术运算和逻辑运算

2.1.2  寄存器组

CPU内部的高速存储单元,有些寄存器不面向用户(‘透明’寄存器),用户不需要了解;有些寄存器面向用户,供编程序用(汇编语言),称为可编程寄存器。

从总线角度看,计算机中的信息分为数据、地址、控制三类,因此寄存器也分为相应的三类:

(1)存放待处理数据的寄存器

  • 累加器:数据运算和加工处理大部分要使用累加器,一些CPU同外设的输入/输出也要经过累加器。累加器是功能最多、使用最频繁的寄存器。
  • 通用寄存器:若干个,使用频度非常高。即可以存放数据,也可以存放地址

(2)存放地址的寄存器

  • 程序计数器PC:是一个专用寄存器,对用户“透明”,用来指示现行指令的地址。每当取完现行指令后,PC自动加1,以指向下一条指令的地址。
  • 堆栈指针SP: 是一个专用寄存器,用来指示内存中堆栈的栈顶的地址,每次数据压栈或弹栈时,SP按一定规则自动修改,保证SP始终指向栈顶。

(3)存放状态信息与控制信息的寄存器

  • 标志寄存器FR:又称程序状态字寄存器PSW。用来保存最近一次ALU操作结果的特征标志,以便后续指令通过测试这些特征标志,判断程序是否需要跳转转移。

  1. 符号标志SF位

·  作用:指示运算结果的符号

·  :如果结果为,SF位为1;如果结果为,SF位为0

  1. 零标志 ZF位

·  作用:指示运算结果是否为零

·  :如果结果为,ZF位为1;如果结果不为零,ZF位为0

  1. 进位/借位标志 CF位

·  作用:指示加法运算中的进位或减法运算中的借位。

·  :如果发生进位或借位,CF位为1;否则为0。

  1. 溢出标志OF位

·  作用:指示有符号数运算中的溢出情况。

·  :如果运算结果超出目标数据类型的表示范围,OF位为1;否则为0。

“1负,1零,1进,1超”

2.1.3  指令处理单元

指令寄存器IR:对用户透明,专门用来暂时存放指令

指令译码逻辑:负责对指令译码,通过译码产生指令指示信号

时序和控制逻辑:根据指令指示信号,产生一系列有时间顺序(定时的)的微操作控制信号,从而控制协调系统完成指令所要求的操作。

AHB总线:先进高性能总线,用于片内高性能系统模块的连接,支持突发数据传输和单个数据传输方式。

APB总线:先进外设总线,用于较低性能外设的简单连接,一般是桥接在AHB总线上的第二级总线。

2.1.4 AHB(Advanced High-performance Bus)先进高性能总线

特点

  • 高性能:适用于高带宽和高性能需求的设备,如存储器和外设。
  • 多主控:支持多个主设备(如CPU、DMA控制器)访问总线。

用途

  • 连接高速外设,如存储器、DMA控制器和高速通信接口。

2.1.5 APB(Advanced Peripheral Bus)先进外设总线

特点

  • 简单低功耗:设计简单,适用于低带宽和低功耗需求的外设。
  • 单周期访问:每次访问只需要一个总线周期,简化控制逻辑。
  • 较低的性能和功耗:适用于不需要高带宽的外设。

用途

  • 接低速外设,如定时器、串口和GPIO。

总线连接示意图:

             +----------------------+
             |      Cortex-M3     |
             |        Core            |
             +----------------------+
                     |
                     | AHB-Lite
                     |
             +------------------------------------+
             |   High-Speed Peripherals  |
             | (e.g., Memory, DMA, etc.)   |
             +------------------------------------+
                     |
                     | AHB-APB Bridge
                     |
             +-------------------------------------+
             |   Low-Speed Peripherals    |
             |   (e.g., Timers, UART, GPIO) |
             +-------------------------------------+

2.2 STM32F103微控制器(MCU)结构

(1) 4 个驱动单元

  • ARM 核(CM3) Dcode 总线
  • 系统总线
  • 通用DMA1
  • 通用DMA2

(2) 4 个被动单元

  • AHB/APB 桥,连接所有的APB 设备
  • 内部Flash 闪存
  • 内部SRAM(静态随机存取存储器)
  • FSMC(可变静态存储控制器)

(3) 各总线上传输的信号

  1. ICode 总线:将ARM 核(CM3)指令总线和闪存接口相连,完成指令的预取,中断向量的读取
  2. DCode 总线: ARM 核(CM3) Dcode 总线通过总线矩阵,可以连接到闪存接口,读取Flash ( 0x00000000-0x1FFFFFFF )中的常量,也可以连接到SRAM (0x20000000-0x3FFFFFFF, 其中一般存放程序中的变量数据、堆栈),访问其中的数据(变量)。
  3. System 总线: ARM 核(CM3)系统总线通过总线矩阵,连接到IO 接口设备、SRAM,可以访问接口设备中的寄存器
  4. DMA 总线:将DMA 设备的AHB 主控接口连接到总线矩阵,可以访问FLASH、SRAM、IO设 备中的寄存器
  5. 总线矩阵:协调ARM 核(CM3)系统总线和DMA 总线,在两者之间仲裁。
  6. AHB/APB桥:在AHB和2个APB总线总线之间提供同步连接,APB1总线速度限于36MHz, APB2 总线速度为全速72MHz

2.3 ARM核(CM3)特点

1. 32位处理器核

CM3是一个32位处理器,内部寄存器、数据总线,存储器接口都是32位

2.哈弗结构

CM3采用哈弗结构,拥有独立的指令总线和数据总线,可以让去指令和数据访问并行进行。

3.高性能的译码器与ALU

CM3包含一个适用于传统Thumb和新型Thumb-2指令译码器、一个支持硬件乘法和除法的ALU、控制逻辑、用于连接处理器其他部件的接口

4.分支预测的三级流水线技术

CM3处理器中的每条指令分取指令、译码、执行三个阶段,分别在不同部件上一次独立完成。每条指令虽然持续3个机器周期,采用流水线技术,使处理器吞吐率约为每个机器周期(若干个时钟周期)一条指令。

5.低成本与低功耗

6.集成调试与跟踪功能

2.4 CM3的寄存器组

2.4.1 通用寄存器R0-R12

R0-R7低组寄存器

R8-R12高组寄存器

2.4.2 R13-R15

  • R13堆栈指针寄存器,CM3支持内存中设置2个堆栈,分别称为主堆栈进程堆栈,相应地CM3核中R13包含2个堆栈指针寄存器,分别为主堆栈指针MSP和进程堆栈指针PSP进程堆栈指针

  • R14 连接寄存器,在汇编指令中一般写作LR 当调用一个子程序指令执行时,返回地址被自动装入LR。 子程序返回时,借助LR,即可返回到主程序中调用指令的下一条指令.

  • R15程序计数器 ,在汇编语言指令中一般写作PC。CM3采用三级流水线,因此指令执行分为取指、译码、执行三个阶段。R15(PC)总是指向“正在取指”的指令,而不是指向“正在执行”的指令。

2.4.3 程序状态寄存器的标志位

N:符号标志位(Negative Flag)

  • 1:结果为负数或小于0
  • 0:结果为正数或大于0

Z:零标志位(Zero Flag)

  • 1:结果为0。
  • 0:结果非0。

C:进位标志位(Carry Flag)

  • 加法运算
    • 如果最高位产生进位,C=1;否则C=0。
  • 减法运算
    • 如果最高位产生借位,C=0;否则C=1。
  • 结合位移操作的非加减法指令
    • C为从最高位最后移除出的值。
  • 其他指令
    • C通常不变。

V:溢出标志位(Overflow Flag)

  • 1:运算结果有溢出。
  • 0:运算结果没有溢出。

2.5 堆栈

  • 堆栈由一块连续的内存空间和一个栈顶指针寄存器SP组成,按照LIFO(Last In First Out,后进先出)数据存取方式访问的内存缓冲区。
  • 其典型的应用:执行子程序的之前,先把主程序的现场寄存器存入堆栈,待子程序结束后,从堆栈中恢复寄存器的值,还原主程序的现场信息。

CM3的堆栈指针

  • CM3 中 r13 是堆栈指针,有两个堆栈指针,主堆栈指针和进程堆栈指针
  • 在CM3中拥有两个堆栈指针,即主堆栈指针MSP和进程堆栈指针PSP。任一时刻,只能使用其中一个。当引用R13(即SP)时,由CONTROL[1]位,决定引用哪一个。
  • 复位后硬件设置CONTROL[1]=0(选择主堆栈指针MSP)。
  • 操作系统程序(内核或非内核)、异常(中断)处理程序使用。进程堆栈指针PSP由用户应用程序代码使用
  • R13最低2位永远是硬件置0,每次进栈,R13引用的那个堆栈指针内容先减4,再数据拷贝入栈顶;每次出栈,数据先从栈顶单元拷贝出来,R13引用的那个堆栈指针内容再加4。

第四章 接口技术

名词解释:

  1. RCC 复位和时钟控制

RCC是“Reset and Clock Control”的缩写,它是一个负责系统时钟配置、时钟管理和外设复位控制的模块。RCC模块主要的功能包括:

  • 时钟源选择:选择系统时钟源,比如内部高速振荡器(HSI)、外部高速振荡器(HSE)、锁相环(PLL)等。
  • 时钟分配:将系统时钟分配给各种外设,如APB1、APB2、AHB总线上的外设。
  • 时钟预分频:通过设置分频系数来调整时钟频率,使之适应不同外设的需求。
  • 外设复位:控制各种外设的复位信号,保证外设能正确启动或重新启动。

  1. APB 高级外设总线

APB是“Advanced Peripheral Bus”的缩写。APB用于连接低带宽、低功耗的外设。APB总线有两个版本,分别是APB1和APB2,总线之间的区别主要在于连接的外设类型和性能要求。

  1. APB1:低速外设总线,通常连接低速外设,如I2C、UART、SPI、定时器(低速)、RTC等。
  2. APB2:高速外设总线,通常连接高速外设,如GPIO、ADC、高速定时器等。

APB总线主要负责以下任务:

  • 外设连接:连接各种外设,使其能够与处理器进行数据通信。
  • 时钟控制:为连接的外设提供时钟信号,通常可以通过RCC模块进行时钟频率的配置和管理。
  • 数据传输:通过APB总线进行数据传输,满足低带宽、低功耗外设的通信需求。

4.1 IO接口概述

IO接口(Input/Output Interface)是计算机系统中CPU与外部设备进行数据交换的桥梁。它包括硬件电路软件协议,使CPU能够控制和管理外部设备。

4.1.1 IO接口电路的作用

  • 数据提供锁存缓冲功能
  • 实现信号变换功能
  • 提供外设控制检测管理功能

4.1.2 接口和端口

接口:是指外部设备与CPU之间的连接电路(现在一般做成芯片)

端口:是指接口电路中存储特定数据的寄存器

  • 数据端口:双向缓存CPU与外设之间的数据
  • 状态端口:存放设备的工作状态,供CPU查阅
  • 控制端口:存放CPU对外设的控制信息。

4.1.3 IO端口地址编码

1.IO端口与存储器单元统一编址

ARM架构采取这种编地址方式

2.IO端口独立编址

X86架构  采取这种编地址方式

优点

缺点

统一编址

(1)不需要专门的IO操作指令,凡是能用于存储器单元操作的指令均可用于IO端口操作

(2)寻址方式灵活,操作指令丰富,IO端口访问便捷

(3)IO端口地址安排灵活,数量不受限制

(1)IO端口地址占用了存储器地址空间资源

(2)从指令上无法区别是对内存还是对IO端口的访问

独立编址

(1)IO端口不占用存储器地址空间资源

(2)专门的IO操作指令简洁高效

(3)通过指令便能区别IO操作和存储器操作,程序易读

(1)专门的IO指令寻址方式单一,操作不灵活

(2)需要设置专门的IO指令,使指令系统复杂

4.2 CPU与外设之间的数据传输方式

4.2.1 无条件传送

特点:这种方式进行输入输出时候,CPU总是默认外部设备总是就绪的(外设产生或消费数据速度足够快,CPU不必等待)

4.2.2 查询传送方式

特点:这种方式进行输入输出时候,CPU先查询外设状态,在输入时先查询外设是否已准备好数据;在输出时先查询外设是否处于空闲状态。

4.2.3中断传送方式

特点:外设主动。当外设需要数据传输服务时,需要向CPU发出中断服务请求,当CPU响应了这个中断请求后,CPU暂停正在执行的程序,转而去为提出请求的外设服务(执行相应的外设服务程序),进行数据传输。传输完毕,CPU再继续原来暂停的程序。

4.2.4 DMA传送方式(了解)

1.特点:又称为直接存储器存取方式,它在存储器与外设之间开辟一条高速数据通到,使外设与存储器之间直接传输数据,数据不需要经过CPU,不需要用指令传输数据(前3种方式都是用指令,数据必须经过CPU)。

2.传输过程:

(1)当外设可以接收数据时,外设向DMA控制器发出DMA请求信号DRQ 。

(2) DMA控制器收到DRQ有效信号后,即向CPU发出总线请求信号HOLD,请求CPU让出系统总线。

4.3并行接口基本电路(了解)

4.3.1 上拉和下拉输入

上拉输入电路:就是将输入信号通过一个电阻与电源连接。上拉电阻提供了部分拉电流(信号源输出高电平时,从信号源流入IO接口的电流称为拉电流),从而减小了信号源的驱动负荷(上拉电阻帮助信号源提供一部分拉电流)。

下拉输入电路:就是将输入信号通过一个电阻与地连接,吸收了一部分灌电流(信号源输出低电平时,从接口灌入信号源的电流称为灌电流,灌电流越大,信号源输出的低电平就越高)。

例1:什么是上拉和下拉电阻?在什么情况下需要上拉电阻和下拉电阻?

上拉电阻和下拉电阻都是电阻元器件,所谓上拉电阻就是接电源正极,下拉的就是接负极或地。上拉就是将不确定的信号通过一个电阻钳位在高电平,电阻同时起限流作用。下拉同理,也是将不确定的信号通过一个电阻钳位在低电平

4.3.2 开漏(OC/OD,Open-Collector/Open-Drain)输出:

  • 概念:开漏输出只能将引脚拉低到地电平(低电平),不能主动拉高到电源电平。需要外部上拉电阻将引脚拉高到高电平。
  • 用途: 常用于I2C总线和多点驱动系统,多个开漏输出可以连接到同一线上,实现“与逻辑”。

4.3.3 推挽(Push-Pull)输出:

概念: 推挽输出可以将引脚拉高到电源电平(高电平),也可以拉低到地电平(低电平),驱动能力强。

用途: 常用于需要快速、高效驱动的场合,如LED驱动、数据总线驱动。

4.4   STM32的GPIO(重点掌握)

GPIO(Gerneral Purpose Input Output通用输入输出)接口。是MCU与外部电路与设备的基本外设(或接口),即通常所说的端口引脚,主要用于通用功能,常用于连接显示器、检测按键、和驱动蜂鸣器。

4.4.1 GPIO端口电路

  • 用作数字量输入功能
  • 用作数字量输出功能
  • 用作模拟量输入

4.4.2  GPIO的工作方式与寄存器的配置

4.4.2.1 GPIO工作方式

4种输入模式:

1、浮空输入GPIO_IN_FLOATING ——用于不确定高低电平输入

2、上拉输入GPIO_IPU——默认上拉至高电平的输入。

3、下拉输入GPIO_IPD—— 默认下拉至低电平的输入。

4、模拟输入GPIO_AIN ——用于模拟量的输入 。

4种输出模式

1、开漏输出GPIO_OUT_OD ——用于电平转换和线与功能的输出。

2、推挽输出GPIO_Mode_Out_PP ——用于较大功率驱动输出。

3、开漏复用输出模式GPIO_AF_OD——复用功能情况下的开漏输出。

4、推挽复用输出模式GPIO_AF_PP ——复用功能情况下的推挽输出。

4.4.2.2 GPIO寄存器配置
  • 每组GPIO端口的包括7个寄存器,STM32的每个功能都由它们来控制。
  • 每个I/O端口位可以自由编程,然而I/O端口寄存器必须按32位字被访问(不允许半字或字节访问) 。

        - GPIOx_CRL:   端口配置低寄存器

        - GPIOx_CRH:  端口配置高寄存器

        - GPIOx_IDR:   端口输入寄存器

        - GPIOx_ODR: 端口输出寄存器

        - GPIOx_BSRR:端口位设置/清除寄存器

        - GPIOx_BRR : 端口位清除寄存器

        - GPIOx_LCKR:端口配置锁存寄存器 

数据寄存器ODR、IDR,控制寄存器CRL、CRH、BSRR、BRR

  

1.GPIOx_CRL:   端口配置低寄存  &  GPIOx_CRH:  端口配置高寄存器

作用:用来配置输入输出方式、速率以及以何种驱动方式

端口位配置表

2.GPIOx_IDR:   端口输入寄存器  &  GPIOx_ODR: 端口输出寄存器

存储用户外设输入到IO口当前数据,CPU可以在适当的时机读取该该数据。

存储CPU写入到IO口当前数据,该数据输出到用户外部设备。

3.GPIOx_BSRR:端口位设置/清除寄存器  &  GPIOx_BRR :端口位清除寄存器

CPU写该寄存器,可以直接对GPIO某一路输出通道进行置1和清0操作,其它通道输出不受影响

CPU写该寄存器,可以直接对GPIO某一路输出通道进行清0操作,其它通道输出不受影响

4.GPIOx_LCKR:端口配置锁存寄存器

用来锁定端口的配置,当对应端口执行LOCK操作后,在下次系统复位之前将不能再更改端口位的配置

例题:

9.STM32 的GPIO 接口有几种工作方式?分别用于什么场合?

1、浮空输入GPIO_IN_FLOATING ——用于不确定高低电平输入

2、上拉输入GPIO_IPU——默认上拉至高电平的输入。

3、下拉输入GPIO_IPD—— 默认下拉至低电平的输入。

4、模拟输入GPIO_AIN ——用于模拟量的输入 。

5、开漏输出GPIO_OUT_OD ——用于电平转换和线与功能的输出。

6、推挽输出GPIO_Mode_Out_PP ——用于较大功率驱动输出。

7、复用功能的推挽输出GPIO_AF_PP ——复用功能情况下的推挽输出。

8、复用功能的开漏输出GPIO_AF_OD——复用功能情况下的开漏输出。

10.STM32 的GPIO 接口相关寄存器有哪些,它们各有什么作用?

- GPIOx_CRL :端口配置低寄存器

- GPIOx_CRH:端口配置高寄存器

- GPIOx_IDR:端口输入寄存器

- GPIOx_ODR:端口输出寄存器

- GPIOx_BSRR:端口位设置/清除寄存器

- GPIOx_BRR :端口位清除寄存器

- GPIOx_LCKR:端口配置锁存寄存器

第五章 中断技术

5.1 中断系统概述

  • 定义:中断指处理器正在运行某段程序时,发生某种情况(可能是处理器内部情况,也可能外部突发情况),使处理器暂停正在执行的程序,转而去中断服务(执行一段预先设定好的服务程序),服务完毕再回到原先中断的程序继续执行。
  • 中断是用来处理计算机内部和外部事件的一套软硬件系统。
  • 中断赋予计算机应变能力,将有序的程序运行和无序的突发情况结合起来,大大增强了计算机的处理能力。

5.1.1 中断的请求-响应工作机制

CPU通常在每条指令执行结束时,都会检查(硬件检查)是否有中断请求,并根据相应的中断请求编号调用预先编写好的中断服务子程序。

5.1.2 中断的管理

中断系统对众多的中断源进行管理:

1)决定中断源是否有权请求以及有效的请求方式

2)多个中断源随机产生中断请求,有可能先后产生,也有可能同时产生,而CPU在同一时间只能响应其中一个。这就需要中断系统的优先级管理来协调这种竞争关系

3)为每个请求找到其相应的服务程序地址

STM32中断功能主要由NVIC(嵌套向量中断控制器)完成

5.2 中断源及其管理

5.2.1中断源的分类

1.硬中断(在CM3中称为“外部中断”, 中断号0 ~ 239 )。

定义:硬中断是由CPU外部硬件接口电路在CPU引脚上产生的中断请求。

  • STM32芯片内的接口设备(TIM,DMA,UART,ADC,DAC等)请求的中断(系统中断)。
  • STM32芯片外的用户设备(按键、传感器)请求的中断(用户中断) 。

2.软中断(又称“内部异常”,中断号 -16 ~ -1 )(了解)

定义:软中断是在执行指令时CPU内部产生的中断。

引发软中断的原因可能是:

  • 可能是因程序员调试程序时设置断点,编译器对目标代码中设置的中断指令。
  • 也可能是程序员需要调用操作系统内核代码而使用的中断指令。
  • 也可能是指令执行时发生故障(内存出错、堆栈溢出、除数为0等)。

5.2.2 中断源的输入管理

5.2.2.1 中断的请求与挂起
  • 软件设定“中断请求”信号的有效形态( EXTI如,设定上跳沿、下跳沿、上下跳变作为有效中断信号),表示“中断请求”。(NVIC请求信号不可软件设置。必须是高电平1  作为有效的中断请求信号)

  • 硬件自动识别"中断请求":中断源一旦向中断控制器(如EXTI、NVIC)发出约定的有效中断请求信号时,中断控制器能硬件自动识别出中断请求

  • 硬件自动记录"中断挂起" :如果一个中断源(或异常源)发出请求后不能立即得到CPU的响应(CPU当前正在响应更高优先级的异常或相关屏蔽寄存器被设置,它将暂时得不到响应),这个状态称为“挂起”(悬而未决)。中断控制器硬件能自动把中断源“挂起”状态标记下来(记录到中断挂起寄存器)。

  • 清除"中断挂起"标记 :当挂起的中断得到CPU的响应后,需要在中断结束前清除"中断挂起" 状态标记(否则该中断请求会被CPU重复响应)。
  • EXTI接口,需要用软件指令清除"中断挂起"标记。
  • NVIC接口,一旦CM3内核响应中断后,硬件自动清除"中断挂起"标记。

(1)EXTI接口处理芯片外用户中断的请求与挂起

STM32中有一个用户设备中断接口EXTI用来代理19路中断源向NVIC的中断请求(芯片外用户设备中断需要经EXTI和NVIC二级管理,即芯片外用户设备须通过某个外中断请求引脚EXTIi(i=0~15)向EXTI请求中断,EXTI再向NVIC请求中断。 )

  • 16路用户设备中断源:通过GPIO引脚转接到EXTI0~15引脚上,例如按键设备。  
  • 3路系统设备中断源:电源检测PVD、RTC闹钟、USB唤醒,固定接在EXTI16~19引脚上

注意:系统设备本身带有中断请求电路,直接连在NVIC某一条中断请求信号线IRQi(i=0~239)上,不需要EXTI服务。

  • 通过对EXTI的上升沿触发选择寄存器(EXTI_RTSR)和EXTI的下降沿触发选择寄存器(EXTI_FTSR)的对应位置1,用以设定19路中断源(芯片外16路用户设备中断源+芯片内3路系统设备中断源)中断请求信号的有效形态(如:上升沿有效、下降沿有效或双边沿都有效)。

  • EXTI中有一个中断挂起寄存器EXTI_PR,硬件自动跟踪设置19路中断源(片外16路,片内3路)的挂起状态。在中断服务响应后,需要程序员用软件清除该寄存器中的相应位,否则中断结束后会重复产生新的同样的中断请求。

5.3 中断嵌套

中断嵌套是指在一个中断处理过程中,可以响应更高优先级的中断,暂时中止当前的中断处理程序,转而处理新的中断。当高优先级的中断处理完毕后,再返回继续处理原中断。这种机制可以确保系统对高优先级事件的及时响应。

5.3.1 中断优先级的排队方法

中断优先级的排队方法通常包括静态优先级和动态优先级。

  • 静态优先级:中断优先级在系统初始化时就已确定,不会在运行过程中改变。
  • 动态优先级:中断优先级可以在运行过程中根据特定规则进行调整,以优化系统响应。

5.4 Cortex-M3 中断源优先级划分和优先级分组

5.4.1 CM3中断源优先级划分

Cortex-M3处理器支持256个中断优先级,通过寄存器配置实现。优先级的划分可以按照需求进行配置,一般越小的数值表示越高的优先级。

优先级分组

Cortex-M3 通过设置AIRCR寄存器中的PRIGROUP位来分组优先级,支持的分组方式有:

  • 组优先级和子优先级:这种方式可以设置中断的组优先级和组内优先级,以实现更灵活的中断控制。

  • 抢占优先级:解决了前后中断响应竞争问题。
  • 两个中断源请求时抢占优先级别高的优先得到CPU响应。
  • 后来的高抢占优先级中断源请求可以嵌套已经处于中断服务阶段的低抢占优先级的中断。

  • 子优先级:多个挂起中断的排队问题。
  • 当多个抢占优先级相同的中断被挂起时,在当前任务完成后,就优先响应子优先级最高的异常。

5.4.2 中断服务程序和中断向量的概念

5.4.2.1 中断服务程序(ISR)
  • 中断服务程序是具体完成中断请求任务的软件,它由用户完成。
  • 一个中断源(中断通道)一定需要一个与之对应的中断服务程序。
  • 每响应一次中断请求,中断系统就会调用(硬件自动调用)一次中断服务程序,以完成该次中断要求的任务。

中断服务程序与普通的子程序的区别:

  • 服务主体不同:

      子程序使结构化主程序的一部分,为主程序服务。而中断服务程序与主程序毫无关系,它为各种异常或中断请求服务,中断服务程序与主程序是并列的。

  • 调用的时机不同:

       子程序调用是程序员在主程序中预先安排好的,什么时候调用是可预知的。而中断服务程序是在中断发生、且获得CPU响应时才会被调用。由于中断是随机发生的,因此中断服务程序的调用在时间上是随机的。

  • 调用的方式不同。

     子程序是由调用指令给出目标地址的,在主程序中可以看到明显的子程序调用指令(例如BL指令)。而中断是硬件根据中断类型自动查阅中断向量表获取中断服务程序入口地址的,在主程序中并无调用中断子程序的指令。

  • 中断服务程序一般没有参数和返回值。

5.4.2.2 中断向量

中断向量是中断源对应的处理程序的入口地址。Cortex-M3使用中断向量表来存储每个中断源的入口地址,系统复位时由SCB的VTOR寄存器指定向量表的起始地址。

  • 中断向量是中断服务程序的入口地址(首地址)。
  • 在中断响应时,中断系统将中断向量加载到程序计数器(PC),实现对中断服务程序的调用。
  • 所有的中断向量都保存在内存中一块特定的区域,这块区域称之为中断向量表。
  • ARM和X86架构的计算机中断向量表都是入口地址型,即在内存中直接存放中断服务程序的入口地址。

5.5中断处理过程(五个阶段)

中断请求:中断源发出中断信号,CPU检测到中断请求。

中断判优:CPU判断当前处理中断的优先级,决定是否响应新中断。

中断响应:CPU保存当前运行状态,跳转到中断服务程序。

中断处理中断返回:执行中断服务程序,处理具体中断事件。中断处理完成后,恢复CPU运行状态,返回主程序继续执行。

前三个为硬件自动完成,最后一个为软件完成

5.5.1 中断请求(硬件自动完成)

(1)前提: 软件配置好GPIO、AFIO、EXTI、NVIC

  • 将用户设备中断请求信号连接到EXTI通道
  • 软件写GPIO端口寄存器,将中断请求信号接入的通道配置成输入(按需要上拉\下拉\浮空)。
  • 软件写AFIO中的片外中断配置寄存器AFIO_EXTICRx,将某个GPIOX_i 通道转接到 EXTI_i 通道。

  • 设置接入EXTI通道的中断请求信号有效形式(上跳变有效、下跳变有效)。并设置用户设备连接的EXTI_i通道允许
  • 软件写EXTI的上升/下降沿触发选择寄存器RTSCR/FTSCR对应位1设定用户设备外部中断请求信号有效的形式。
  • 软件写EXTI的中断屏蔽寄存器IMR对应位1,该寄存器软件置1允许用户设备外部中断,写0禁止用户设备外部中断。

(2)用户设备外部中断请求过程(硬件自动完成)

  • 芯片外部用户设备发出中断请求信号(上/下跳变)
  • 中断请求信号通过GPIOX-i引脚接到EXTI-i通道
  • 硬件自动设置EXTI_PR对应的位1(中断挂起)
  • 如果EXTI-i通道允许,则EXTI-i会向NVIC通道(IRQn)发出有效的中断请求信号(高电平)
  • NVIC硬件检测到某通道中断请求信号有效(高电平),自动将中断挂起寄存器组NVIC_SETPENDx (x=0~7)中与该通道对应的位置1(中断挂起)。

5.5.2 中断判优(硬件自动完成)

(1)中断调度方式:

CPU同一时间只能服务于一个中断请求,必须按照一定的中断调度方式,在众多的中断请求中挑选出一个予以响应。

  • 全嵌套方式:所有中断按照优先级排队,无论何种情况下,优先级最高的总请求能得到最快的响应。
  • 无嵌套的时间排序调度方式:所有中断优先级相同,先到者先得到CPU响应,这种方式不存在嵌套问题
  • 优先级轮转方式:采用滚动的优先级,把刚刚完成服务的中断源的优先级降为最低。保证等待时间比较长的低优先级请求也能较快地得到响应。

5.5.3 中断响应(硬件自动完成)

(1)一般中断响应的过程

  • NVIC硬件保存断点(BreakPoint):发生中断时原来程序执行时程序计数器(R15)的值(断点指令地址)一般由硬件自动压入堆栈。
  • NVIC硬件保护现场:现场指被即将执行的中断服务程序使用的CPU内部寄存器。
  • NVIC硬件从向量表中找出当前响应的中断向量,传递给CM3内核R15,引导内核执行中断服务程序。

(2)STM32的中断响应过程

  • stm32不仅自动保存断点,也将中断服务程序经常用到的R0-r3自动保存,即断点与(部分)现场保存都是由硬件自动完成。
  • 由于不同的中断服务程序用到的寄存器可能不同,因此其它现信息(R4-R11)场一般需要用户根据自己的服务程序对寄存器的使用情况用软件压栈指令保存。

5.5.4 中断处理和中断返回(软件完成)

(1)用户保护现场:

  • 如果除了NVIC硬件保存的现场之外,中断程序还需要需要使用其它的寄存器寄存器( R4~R11 ),则软件将现场寄存器压栈。
  • 现场保护过程中决不允许再次发生中断(嵌套),为此中断服务程序的开中断应该在保护现场完毕后进行。 中断响应阶段会CM3自动关闭中断,指CM3硬件将PRIMASK[0]=1 )
  • c语言的stm32函数,如果用到R4~R11寄存器,编译器会在自动加入压栈指令。

(2)开中断(软件写PRIMASK[0]=0 )。

(3)中断服务:执行中断服务程序

(4)清除"中断挂起"标志位。

  • 对于STM32来说,如果是芯片外用户设备中断,需要用户软件清除中断挂起寄存器(EXTI-PR)对应的"中断挂起"标志位。
  • NVIC硬件会自动清除当前通道的“中断挂起”标志位,不需用户软件清除。

(6)关中断(软件写PRIMASK[0]=1 )

(7)恢复现场。把原来压入堆栈的现场内容恢复之原来的寄存器

(8)开中断(软件写PRIMASK[0]=0

(9)执行一条中断返回指令

例题:

1. 什么是中断?中断有什么作用?

  • 中断即打断,是指CPU 再执行当前程序时,由于系统出现了某种需要处理的紧急情况 CPU 暂停正在执行的程序,转而去执行另一段特殊程序来处理的出现的紧急事务,处理 结束后CPU 自动返回到原先暂停的程序中去继续执行,这种执行过程由于外界的的原因 被中间打断的情况成为中断。
  • 中断的作用:
  • 中断使得计算机系统具备应对对处理突发事件的能力,提高了CPU 的工作效率,如果没有中断系统,CPU 就只能按照原来的程序编写的先后顺序,对各个外设进行查询和处理, 即轮询工作方式,轮询方法貌似公平,但实际工作效率却很低,却不能及时响应紧急事 件。

2.中断的工作机制是什么?中断请求与中断服务的关系是什么?中断系统在其中起到什 么作用?

  • 工作机制:中断是实现多道程序设计的必要条件,中断是CPU 对系统发生的某个事件作出的一种反应。引起中断的事件称为中断源。中断源向CPU 提出处理的请求称为中断请求。发生中断时被打断程序的暂停点称为断点。CPU 暂停现行程序而转为响应中断请求的过程称为中断响应。处理中断源的程序称为中断处理程序。CPU 执行有关的中断处理程序称为中断处理。
  • 返回断点的过程称为中断返回。中断的实现由软件和硬件综合完成,硬件部分叫做硬件装置, 软件部分称为软件处理程序
  • 请求服务-开始服务-服务结束,三个过程。中断请求,即将发生的事在没有发生前停止
  • 中断装置和中断处理程序统称为中断系统。中断源向CPU 提出处理的请求称为中断请求。 发生中断时被打断程序的暂停点成为断点。CPU 暂停现行程序而转为响应中断请求的过程称为中断响应。处理中断源的程序称为中断处理程序

3. 一个外部中断请求会在哪些地方被挂起记录?中断挂起寄存器中的有效位是如何被清除 的?

(1)INT0 ——外部中断请求0,中断请求标志为IE0。

(2)INT1——外部中断请求1,中断请求标志为IE1。

(3)定时器/计数器T0 溢出中断请求,中断请求标志为TF0。

(4)定时器/计数器T1 溢出中断请求,中断请求标志为TF1

中断挂起状态寄存器也是在物理上为一个寄存器,而通过两个地址来实现设置和清除相关位。 这就使得每一位都可以独立修改,而无须担心在两个应用程序进程竞争访问时出现的数据丢失。

4. 如何表示中断优先级的高低?为什么一些中断优先级为负数?

为使系统能及时响应并处理发生的所有中断,系统根据引起中断事件的重要性和紧迫程度, 硬件将中断源分为若干个级别,称作中断优先级。 在实际系统中,常常遇到多个中断源同时请求中断的情况,这时CPU 必须确定首先为哪一 个中断源服务,以及服务的次序。解决的方法是中断优先排队,即根据中断源请求的轻重缓急,排好中断处理的优先次序即优先级( Priority ),又称优先权,先响应优先级最高的中断请求。另外,当CPU 正在处理某一中断时,要能响应另一个优先级更高的中断请求,而屏蔽 掉同级或较低级的中断请求,形成中断嵌套。

5. 中断优先级的作用是什么?为何要划分抢占优先级和子优先级?

  • 中断优先级的作用是确保系统能够及时响应关键任务,提高整体效率,并避免资源冲突。
  • 划分抢占优先级和子优先级的原因:
  • 抢占优先级:决定哪个中断可以中断其他中断。高抢占优先级的中断可以打断低抢占优先级的中断。
  • 子优先级:在相同抢占优先级下,决定处理顺序。高子优先级的中断先处理。
  • 这种划分提供了更细致的中断管理,优化系统响应速度,避免优先级反转,确保系统的实时性和稳定性。

7.什么是中断服务程序?它与普通的子程序有什么区别?

中断服务程序,处理器处理“急件”,可理解为是一种服务,是通过执行事先编好的某个特 定的程序来完成的,这种处理“急件”的程序被称为——中断服务程序

a、主体不同:中断服务子程序是一种服务,是通过执行事先编好的某个特定的程序来完成的。普通子程序是一个大型程序中的某部份代码,由一个或多个语句块组成。

 b、功能不同:中断服务子程序,外界发生了紧急情况,要求CPU 暂停当前的工作转去处理 这个紧急事件。处理完毕后,再回到原来被中断的地址,继续原来的工作。普通子程序,负 责完成某项特定任务,而且相较于其他代码,具备相对的独立性。

c、特点不同:中断服务子程序,为了在中断处理结束后能够使进程准确地返回到中断点, 系统必须保存当前处理机程序状态字PSW 和程序计数器PC 等的值。普通子程序,常被使用 在汇编语言层级上。子程序的主体是一个代码区块,当被调用时就会进入运行。

8.什么是中断向量?什么是中断向量表?有哪两种类型的中断向量表?

  • 中断向量是指早期的微机系统中由硬件产生的中断入口地址或存放中断服务程序的首地址。
  • 把系统中所有的中断类型码及其对应的中断向量按一定的规律存放在一个区域内,这个存储区域就叫中断向量表

9. 编写中断服务程序需要注意些什么?

 一、中断服务器子程序里面不要有printf

1、中断服务子程序设计原则是要快进快出,printf 的实现会一直调用到底层逐个字节的打印 输出,这种IO 操作效率很慢,不适合放到中断里面。如果有锁机制,可能会造成死锁。 2、printf 是不可重入函数,对于线程来说是不安全的

二、不要有浮点数运算 浮点数运算需要有额外的寄存器参入计算,也是不可重入的三、参数几返回值

没有操作系统的单片机上,中断服务程序不能传递参数和有返回值,有操作系统的上面是可 以传递参数和返回值的,其实返回值也没有太大作用。

中断嵌套 当CPU正在处理某一中断时,要能响应优先级更高的中断请求,而屏蔽掉同级 或较低级的中断请求,形成中断嵌套

中断优先级的排队方法 用软件查询方法确定中断优先级

将所有的中断请求信号存入寄存器,由三态缓冲连接到系统数据总线上,软 件可以读出所有的中断请求信号的状态,优先级由软件查询顺序确定,先查询 的优先级别高,后查询的优先级别低。

硬件优先级排队电路 各中断请求信号连接到优先级排队电路(菊花链优先级排队电路、比较器优

先级排队电路),优先级由中断请求信号连接在排队电路的引脚物理位置决定 (参看课本图5.7,5.8 )。

专用中断控制器优先级排队 专门用一个可编程的中断控制器(例如X86架构计算机的8259,arm架构的

NVIC ),通过软件对中断控制器编程,来设定或更改优先级。 CM3中断源的优先级划分

3种系统内部异常(复位,NMI和硬FAULT)拥有固定不变的负数优先级(高于 其它所有的异常)。

其它的内部异常的优先级可以通过中断由SCB_SHPRx寄存器来控制(不可设定 为负数优先级)。

外部中断通过的中断优先级寄存器组NVIC IPRx(x<=60)进行调整(不可设定为 负数优先级)。

中断服务程序 中断服务程序是具体完成中断请求任务的软件,它由用户完成

第六章 定时器与计数器

名词解释:

  1. ARR 自动重装载寄存器 :

是用来设置定时器的计数周期的。也就是说,当定时器的计数器达到ARR寄存器的值时,计数器会重置为0并且可以产生一个中断或其他事件。这种机制使定时器能够在预定的时间间隔内重复运行。

  1. PSC 预分频器寄存器

是用来设置预分频器的分频系数的。通过改变PSC寄存器的值,我们可以控制定时器的时钟频率。例如,如果系统时钟频率是72MHz,而我们希望定时器的工作频率为1MHz,可以将预分频器设置为72,这样定时器每接收到72个时钟周期才计数一次。

6.2  定时器

6.2.1  定(延)时的基本方法

1.软件延时:CPU执行一段“空”程序实现延时

  • 优点:不需要添加额外的硬件设备,简单易实现
  • 缺点:占用CPU时间,精度受中断及CPU主频时钟影响

2.硬件延时电路:采用附加的数字电路(如555单稳态芯片)产生特定的延时。

  • 优点:不占用CPU时间
  • 缺点:改变延时时间需要调整电路参数(电阻、电容值),通用性灵活性差,时间精度受电路参数影响,稳定性差。

3. 可编程定时器(计数器):

以专用芯片(如Intel8253)或MCU中集成的定时器接口设备(如STM32中的TIM1~8 )来进行定时。

  • 优点:定时器初始化后就独立于CPU工作,不占用CPU时间,时间长短不限,使用灵活精度高。
  • 缺点:增加硬件成本

6.2.2  定(延)时器硬件的一般工作原理

6.2.2.1 定时器的一般硬件结构
  • 预分频器:用以调整定时器的时间精度(定时最小单位)。
  • 时间常数寄存器:存放计数周期初值/终值,决定定时周期(时长)。
  • 计数器:从时间常数寄存器获取计数周期初值/终值,在时钟的驱动下进行计数(递增或递减),当计数溢出时,产生超时(Time Out  TO)脉冲信号

计数初值C0的设定:

    (1)根据定时需要计算计数总次数K

            K=需要延迟的时间/计数器时钟周期

    (2)设定计数常数

递增(向上)计数

递增计数终值: K-1

6.2.2.2 定时器的启动(触发)方式
  • 内触发:又称软件触发方式,计数由软件触发计数器运行
  • 外触发:又称硬件触发方式,是用外部硬件信号触发计数器开始工作

6.2.2.3 定时器在计算机中的应用
  • 用作硬件延时器,相比于软件可节约大量CPU工作时间,以用于其运算和处理。
  • 用作周期中断触发源,以进行DRAM刷新、时钟管理、定时查询、A/D及D/A转换时间间隔控制
  • 用作波特率发生器、方波发生器,以生成固定波形
  • 用作可以重复触发的单稳态电路,以用于事件间隔限时器

6.2.3  STM32 MCU定时器概述了解

1.ARM核定时器SysTick: (了解,  自学)

(1)功能特点:

24位向下自动加载计数器

更新事件/计数器溢出时产生一个可屏蔽系统中断(-1#内部异常,中断源名称SysTick)

可以通过编程选择时钟源(HCLK或HCLK/8)

(2)应用:

 用于实时OS进程切换(靠 SysTick中断(-1#内部异常)实现进程切换 )。

 普通延时等待函数。一般程序中需要的延时或等待,实现精确延时,例如OS提供的延时API函数(API函数是需要CPU不停地查询SysTick 状态实现精准定时的)

2.独立看门狗IWDG(有一个独立的时钟源,不能产生系统中断,只能复位。应用要求不高的场景)(了解,  自学)

3.窗口看门狗WWDG(使用系统时钟,可以产生系统中断,通过系统中断解决故障)(了解,  自学)

      硬件看门狗是利用一个定时器电路,其定时输出连接到电路的复位端,程序在一定时间范围内对定时器清零(俗称“喂狗”),因此程序正常工作时,定时器总不能溢出,也就不能产生复位信号。如果程序出现故障,不能在定时周期内复位看门狗,就使得看门狗定时器溢出产生复位信号并重启系统。

看门狗本身不是用来解决系统出现的问题,在调试过程中发现的故障应该要查改设计本身的错误。

加入看门狗目的是对一些程序潜在错误和恶劣环境干扰等因素导致系统死机而在无人干预情况下自动恢复系统正常工作状态。看门狗也不能完全避免故障造成的损失

4.实时时钟RTC:(了解,  自学)

(1)功能特点:

32位可编程计数器:可以初始化为当前系统时间的时间戳(以1970-1-1 00:00:00时刻为时间基准,现在距离时间基准的秒数)。预分频模块中可以设置最大的该计数器时钟周期为1s,则该计数器每隔一秒加1,自动记录系统时间。

2个专门的可屏蔽中断

闹钟中断(连到EXTI_17 上的外部中断,中断源名称 RTCAlarm,中断号41(NVIC第41通道) )

秒中断(连到NVIC的外部中断,中断源名称 RTC,中断号3(NVIC 第3通道) ):产生一个可编程的周期性中断(周期最长达1秒).

5.基本定时器TIM6~7:

(1)功能特点:

16位向上自动加载计数器

输出可直接触发DAC

更新事件时产生中断/DMA请求

(2)应用:

常规16位定时

产生DAC触发信号

6.通用定时器:TIM2~5

(1)功能特点:

16位向上、向下、向上/向下自动加载计数器。

4个独立通道,具有输入捕获、输出比较、PWM生成、单脉冲产生等功能模式。

具备同步电路,同步信号可来自外部或另一个定时器。

下列事件发生时会产生中断/ DMA请求

      更新事件:计数器溢出,计数器初始化

      触发事件“计数器启动、停止、初始化、内/外部触发计数

      输入捕获事件

      输出比较事件

可作时钟的外部触发输入。

支持定位用的增量/正交编码器和霍尔传感器

(2)应用:

定时器级联,与高级定时器协同工作

产生PWM输出

用作旋转编码器/霍尔传感器接口

7.高级定时器TIM1,TIM8:

用以产生6通道、三相互补PWM输出

6.3  STM32通用定时器

  • 每个通用定时器有6个中断源:
  • 计数器溢出(更新)中断
  • 输入捕获/输出比较通道1~4中断
  • 触发中断。

  • 每个通用定时器TIMx的6个中断源共享一个IRQ通道(NVIC的外部中断IRQ0-239中的某一路中断请求上,系统设备中断,不需经过GPIO、AFIO、EXTI),当定时器中断产生时,需要在中断服务程序中,软件查询TIMx中断源并清除TIMx中的中断请求标志(类似于清除EXTI_PR中的 ”中断挂起” 位)。

6.3.1 STM32定时器TIM工作原理分析

1.影子寄存器(Shadow Register)

  • 定义:某些寄存器(例如图中带阴影的寄存器ARR、PSC、CCxR)在芯片内部实际上对应的是2个寄存器,一个是软件可以读写的寄存器(称之为预加载寄存器Preload Register)。另一个是程序无法访问,但在该定时器运行过程中起真正作用的寄存器(称之为影子寄存器Shadow Register,该寄存器就好像预加载寄存器的影子一样,在特定事件发生的时候会自动获得预加载寄存器数据)
  • ARR、PSC、CCxR实际上是寄存器对,它们都是由一对寄存器构成(预加载寄存器和影子影子寄存器)

(1)主模式设置

(1.1)选择内部时钟源

6.3.1.1 定时器的时钟源

主片工作模式(2种):

计数器直接对内部时钟源CK_INT计数(内部时钟源模式)

计数器直接对外部时钟源ETRF进行计数计数(外部时钟模式2 )

  • (1.1)选择内部时钟源

软件设置

1)写从模式控制寄存器TIMx_SMCR的SMS[2:0]位段=000关闭从模式(主模式类) 。

2)写 TIMx_SMCR的ECE位 =0,不允许外部时钟ETRF作为时钟源。即选择内部时钟源CK _INT(内部时钟源模式)

  • (1.2)选定外部时钟源

外部时钟模式2

软件设置:

1)写从模式控制寄存器TIMx_SMCR的SMS[2:0]位段=000关闭从模式(主模式类) 。

2)写TIMx_SMCR的ECE位 =1,允许外部时钟ETRF作为时钟源,即可设置定时器工作在外部时钟模式2。

6.3.2  时基(基本定时)单元

时基(时钟源)单元包含:计数器寄存器TIMx_CNT预分频器寄存器TIMx_PSC自动装载寄存器TIMx_ARR

定时器时钟: 

  其中TIMx_PSC是16位预分频寄存器的值(0~65535)

1.计数器工作时序

以内部时钟源CLK_INT为例,预分频比分别为1和2的情况下,下图分别是向上、向下、向上/向下计数时序图(默认)

向上计数时序图(TIMx_ARR=0x36,预分频比=1)

向上计数:计数器周期性地从0递增到ARR影子寄存器设定的值36(计数最大值)

向上计数时序图(TIMx_ARR=0x36,预分频比=2)

向下计数时序图(TIMx_ARR=0x36,预分频比=1)

向下计数:计数器周期性地从ARR影子寄存器设定的值(计数最大值)递减到0

向下计数时序图(TIMx_ARR=0x36,预分频比=2)

中央对齐(向上/向下计数)时序图(TIMx_ARR=0x06,预分频比=1)

向上/下计数:计数器周期性地从0递增到ARR影子寄存器设定的值(计数最大值),再由最大值递减到0

例题6.1

问题:控制LED 0~1每隔1S闪烁一次(要求每秒定时误差不超过0.1ms)

分析:利用定时器接口TIM3,实现1s定时,利用TIM3定时器中断,在中断服务程序让LED0~1闪烁一次

控制误差不超过0.1ms,要求计数器时钟频率>=1/0.1ms=10K

预分频系数=时钟源频率/计数器时钟频率=72M/10K=7200

时间常数K=用户期望的定时周期间隔/计数器时钟周期=1s/0.1ms=10000

PWM(Pulse Width Modulation,脉宽调制)是一种通过调节脉冲信号的宽度来控制电力传输的方法。它的主要原理是通过改变脉冲的持续时间(即脉冲宽度)来调节输出的平均电压或功率。PWM信号通常用于控制电机速度、亮度调节、以及其他需要模拟信号控制的电子设备中。

占空比(Duty Cycle)是PWM信号的一个关键参数。它表示一个PWM周期内高电平(脉冲)的持续时间与整个周期时间的比例。占空比通常以百分比表示。

具体来说,占空比的计算公式为:

例如,如果一个PWM信号的周期是10毫秒,而高电平的时间是2毫秒,那么这个PWM信号的占空比就是20%。

通过调整占空比,可以控制平均输出电压。例如,在一个5V的系统中:

  • 占空比为50%时,平均输出电压为2.5V。
  • 占空比为75%时,平均输出电压为3.75V。

这种通过调节占空比来实现不同输出电压或功率的方式,使PWM在许多电子控制应用中非常有用。

6.3.3  输出比较模式

名词解释:

CCR(Capture/Compare Register)是许多微控制器(MCU)和数字信号处理器(DSP)中定时器模块的一部分。它用于捕捉事件的时间、比较定时器值以及产生PWM信号。以下是CCR的主要功能和应用:

  • 捕捉(Capture)
  • 比较(Compare)
  • PWM生成

—————————————————————————————————

对定时器进行改进,使它能更精确地测量事件发生的时间间隔,或输出精确定时的信号,这就是输入捕获和输出比较功能。

1.输出比较

原理:计数器在给定标准时钟驱动下工作。输出比较寄存器给出比较值,当计数器达到比较值时可以产生中断请求,并能驱动输出逻辑产生给定电平的输出信号

用途:

(1)利用其输出逻辑,可以用来控制输出一个想要的时序信号波形。

(2)不用其输出逻辑而只用其中断功能,则可以作为计时器,用来指示一段给定的时间已到时。

(3)若利用其比较相等输出产生复位信号,则可以用作“看门狗”

2.STM32输出比较配置

(1)逻辑框架

       输入捕获/输出比较在同一个电路通道中,此处将输出比较逻辑单独隔离开来。

3.输出比较通道1(一个定时器含4个通道)框图主电路部分

直通模式:指软件写完CCR预加载寄存器后,硬件立即把数据装入CCR影子寄存器

预装载模式:指软件写完CCR预加载寄存器后,等到更新事件信号到来,硬件才把数据装入CCR影子寄存器

输出比较通道1(一个定时器含4个通道)主电路框图

主电路:比较动态的CNT(计时器)和静态的CCR(影子寄存器)谁大谁小。

—————————————————————————————————

输出比较通道1(一个定时器含4个通道)输出电路框图

4.TIMx_CCM1寄存器中的OC1M[2:0]位段,控制输出比较模式:

011

相等则翻转模式(TIM_OCMode_Toggle):TIMx_CCR1和TIMx_CNT相等时,OC1REF输出翻转

OCyREF引脚输出方波

110

PWM1模式(TIM_OCMode_PWM1):

向上计数时,在TIMx_CNT<TIMx_CCR1时,OC1REF输出1,否则OC1REF输出0;

向下计数时,在TIMx_CNT>TIMx_CCR1时,OC1REF输出0,否则OC1REF输出1;

 PWM 模式输出

例题6.2 

问题:利用TIM3的输出比较功能,产生10Hz的方波,用来控制LED0闪烁(方波误差不超过0.1ms)。

分析:

  • 让TIM3基本定时器计数周期0.05s(20Hz ),再利用TIM3的OC2通道,工作在“相等则翻转模”式下,每个计数周期( 0.05s ),出现一次翻转(翻转2次产生一个周期方波,方波周期0.1s,方波频率生10Hz)。

  • 控制误差不超过0.1ms,要求计数器时钟频率>=1/0.1ms=10K
  • 预分频系数PSC =时钟源频率/计数器时钟频率=72M/10K=7200
  • 时间常数ARR=用户期望的定时周期间隔/计数器时钟周期=0.05/0.1ms=500

  • TIM3_CH2默认引脚是PA7,为了让方波直接控制LED0点亮,利用AFIO的引脚部分重映射功能,将TIM3_CH2映射到PB5上(开发板的LED0负极连在此引脚)

要求:

掌握TIM输出比较功能:给内部时钟源CK_INT频率,根据误差控制要求(或需要设定的计数器时钟CK_CNT频率),会计算预分频PSC的值。根据输出PWM信号的频率占空比要求,会计算ARR、CCR的值。

1. 内部时钟源CK_INT频率

CK_INT是定时器的内部时钟源频率。定时器的所有计数操作都基于这个时钟源。

2. 预分频器PSC(Prescaler)

预分频器用于将内部时钟源CK_INT分频,以获得较低频率的计数器时钟CK_CNT。通过设置预分频器的值,可以控制定时器的计数速度。

  • 公式:

3. 自动重装载寄存器ARR(Auto-Reload Register)

ARR定义了定时器的周期,也就是计数器计数的上限值。当计数器的值达到ARR的值时,计数器会重置并重新开始计数。

  • 定时器周期:

4. 捕捉/比较寄存器CCR(Capture/Compare Register)

CCR用于定义PWM信号的占空比。它决定了在一个计数周期内高电平的持续时间。

  • 占空比:

计算流程示例

确定内部时钟源CK_INT频率

    • 假设内部时钟源频率为10 MHz(10,000,000 Hz)。

计算预分频器PSC的值

    • 根据需要设定的计数器时钟CK_CNT频率和误差控制要求,选择合适的PSC值。
    • 例如,目标计数器时钟CK_CNT频率为1 MHz(1,000,000 Hz),则PSC可以计算为:

    • 这意味着PSC的值为9。

计算ARR的值

    • 假设需要生成1 kHz(1,000 Hz)的PWM信号,则周期为1 ms(0.001秒)。
    • 计数器时钟CK_CNT为1 MHz(1,000,000 Hz),则计数器在1 ms内的计数值应为:

    • 这意味着ARR的值为999。

计算CCR的值

    • 假设需要50%的占空比,则CCR的值为:

    • 这意味着CCR的值为500。

总结

  • PSC(预分频器):通过设置PSC的值,将内部时钟源CK_INT分频,得到计数器时钟CK_CNT。
  • ARR(自动重装载寄存器):设置定时器周期,决定计数器的上限值。
  • CCR(捕捉/比较寄存器):设置PWM信号的占空比,决定高电平持续时间。

6.3.4 PWM输出

直流电机PWM调速

脉宽调制

概念:PWM 是一种利用周期脉冲信号的不同占空比表示不同信息的数字调制方式。

作用:通过调节波形的占空比和相位,利用PWM可以产生精确脉冲序列输出。交直流电动机调速、伺服电机控制(利用占空比控制伺服舵机的转角,进而控制机车行走方向、机械臂转向等)、D/A转换器应用。

占空比:          

平均电压:        

PWM脉冲频率:

输出高有效时 (CC1P = 0) 脉冲占空比:

输出低有效时 (CC1P = 1) 脉冲占空比:

例题6.3

利用20%占空比的PWM信号调节LED灯的亮度

分析:利用TIM3产生不同占空比的PWM信号,驱动LED0点灯。频率足够高时,人眼感觉不到LED闪烁,占空比越高,灯越亮。

6.3.5  输入捕获

名词解释:

  1. TI1F经边沿检测器后获得上升沿检测脉冲TI1F_Rising和下降沿检测脉冲TI1F_Falling
  2. CC1P=0(正极性选择)  (在TIMx_CCER 寄存器中)
  3. 极性信号TI1FP1
  4. TIMx_CCMR 寄存器的CC1S[1:0]位段控制通道1的捕获信号IC1选择哪个通道的极性信号。
  • CC1S[1:0] =01,通道1捕获信号IC1选择来自自身通道的极性信号TI1FP1;
  • CC1S[1:0] =10,通道1捕获信号IC1选择来自伙伴通道的极性信号TI2FP1 ;
  1. TIMx_CCMR 寄存器的IC1PS [1:0]位段。
  • 用于设置通道1的分频信号IC1PS的分频因子,IC1PS=IC/分频因子。
  1. 设置TIMx_CCER 寄存器的CC1E位
  • CC1E =1,允许预分频信号IC1PS触发捕获
  • CC1E =0,禁止预分频信号IC1PS触发捕获
  1. 捕获/比较寄存器TIMx_CCR1计数器当前值被锁存到其中

—————————————————————————————————

概念:输入捕获是指通过对引脚输入信号电平变化的检测,在发现电平变化时,保存计数器的值到输入捕获寄存器中,同时设置输入捕获状态标志位;如果允许中断,则向CPU发出中断请求,进而实现对事件发生间隔时间的测量以及对实时事件的响应。

用途:雷达测速、超声波测距、发动机转速以及车速的测量等。

6.3.5.1 信号周期测量
6.3.5.1.1 输入捕获电路框图

小贴士:输入捕获通道在PWM测量模式下,需要两个通道配合完成周期和占空比的测量。故这里两个输入通道信号有交汇。

输入捕获通道输入段原理:

以通道1输入段

  1. 定时器通道1输入信号TI1经滤波器采样滤波得到信号TI1F

TIMx_CCMR 寄存器的CC1F[3:0]位段,决定滤波采样信号的频率fSAMPLING以及采样次数N。

  1. TI1F经边沿检测器后获得上升沿检测脉冲TI1F_Rising和下降沿检测脉冲TI1F_Falling

  1. TIMx_CCER 寄存器的CC1P位控制接到通道1捕获段的极性。
  • CC1P=0正极性选择),接到通道1捕获段3选1选择器的两路极性信号TI1FP1、 TI2FP1 都是上跳沿检测信号TI1F_Rising、TI2F_Rising 。

  • CC1P=1负极性选择),接到通道1捕获段3选1选择器的两路极性信号TI1FP1、 TI2FP1 都是下跳沿检测信号TI1F_Falling、TI2F_Falling 。

  1. 同理,TIMx_CCER 寄存器的CC2P位控制接到通道2捕获段的极性。

  • 通道1捕获段的捕获信号IC1的3个选择选择:
  1.    选择自身通道的极性信号TI1FP1
  2.    选择伙伴通道的极性信号TI2FP1
  3.    选择TRC(不作要求)

  • 通道2捕获段的捕获信号IC2的3个选择选择:
  1.    选择自身通道的极性信号TI2FP2
  2.    选择伙伴通道的极性信号TI1FP2
  3.    选择TRC(不作要求)

!!理解伙伴通道1、2中四个极性信号的意义:

  • TI1FP1 和TI1FP2 :
  1. 它们是通道1输入段产生的,由接入通道1的待测信号PWM_x1的跳变沿触发,它们都可以由软件设置上跳或下跳沿触发。
  2. 它们分别接入通道1捕获段和通道2捕获段,作为"捕获"信号。
  3. 综上所述:接入通道1的待测信号PWM_x1的任一个跳变沿,既可以用来触发通道1捕获,又可以用来触发通道2捕获。

  • TI2FP1 和TI2FP2 (同理):
  1. 它们是通道2输入段产生的,由接入通道2的待测信号PWM_x2的跳变沿触发,它们都可以由软件设置上跳或下跳沿触发。
  2.  它们分别接入通道1捕获段和通道2捕获段,作为"捕获"信号。
  3. 综上所述:接入通道2的待测信号PWM_x2的任一个跳变沿,既可以用来触发通道1捕获,又可以用来触发通道2捕获。

  1. TIMx_CCMR 寄存器的CC1S[1:0]位段控制通道1的捕获信号IC1选择哪个通道的极性信号。
  • CC1S[1:0] =01,通道1捕获信号IC1选择来自自身通道的极性信号TI1FP1;
  • CC1S[1:0] =10,通道1捕获信号IC1选择来自伙伴通道的极性信号TI2FP1 ;

同理, TIMx_CCMR 寄存器的CC2S[1:0]位段控制通道2捕获信号IC2选择哪个通道的极性信号。

  • CC2S[1:0] =01,通道2捕获信号IC2选择来自自身通道的极性信号TI2FP2;
  • CC2S[1:0] =10,通道1捕获信号IC2选择来自伙伴通道的极性信号TI1FP2 ;

  1. TIMx_CCMR 寄存器的IC1PS [1:0]位段。

用于设置通道1的分频信号IC1PS的分频因子,IC1PS=IC/分频因子。分频信号IC1PS脉冲每个上跳沿触发一次捕获!!!

如,1分频,每个上跳沿都触发捕获;2分频,则每隔一个上跳沿触发一次捕获

  1. 设置TIMx_CCER 寄存器的CC1E位

CC1E =1,允许预分频信号IC1PS触发捕获

CC1E =0,禁止预分频信号IC1PS触发捕获

6.3.5.1.2 通道1捕获段原理

  • 以下两种情况,会触发一次捕获: 计数器当前值被锁存到捕获/比较寄存器TIMx_CCR1中。
  • 一个IC1PS脉冲信号(来自输入通道的)会触发一次捕获
  • 软件写TIM_EGR的CC1G=1,会产生一个捕获事件脉冲信号CC1G,会触发一次捕获。

  • 在设定输入模式下(CC1S !=00),且读取CCR1期间之外,CCR1影子与预加载器直通(影子捕获到的数据立即传至预加载器)

  • 如果使能了中断(如,写寄存器TIMx_DIER中的CC1IE位=1,允许通道1捕获/比较中断),则将产生中断请求(状态寄存器TIMX_SR中的通道1捕获比较“中断挂起”标志位CC1IF被硬件置1。)。

6.3.5.1.3 单个输入捕获通道工作信号时序(可以用来测量PWM_x周期)

6.3.5.1.4 信号周期测量软件流程(一个输入捕获通道即可完成)

1)定时器输入捕获软件初始化配置(以通道1为例)

  1. 根据外部待测信号的特点,设置输入滤波器的采样频率和采样次数

TIMx_CCMR寄存器的IC1F[3:0]位段

  1. 设置接入通道1捕获段的极性信号TI1FP1的极性

设置TIMx_CCER寄存器的CC1P位=0, 边沿信号TI1FP1正极性(选择上升沿检测脉冲TI1F_Rising)。

  1. 设置通道1捕获信号IC1的来源。

设置TIMx_CCMR寄存器的CC1S[1:0]位段=01,选择来自TI1的边沿信号TI1FP1

  1. 设置通道1捕获段的预分频比

TIMx_CCMR 寄存器的CC1PSC[1:0]位段,确定捕获通道1的分频信号IC1PS 的分频因子(f IC1PS=fIC1/分频因子)。

  1. 设置通道1的捕获允许

TIMx_CCER寄存器的CC1E位=1,允许捕获通道1的预分频信号IC1PS触发“捕获”。

  1. 中断方式读取CCR:设置通道1的“捕获中断”允许

设置寄存器TIMx_DIER中的CC1IE位=1允许中断请求, 在中断服务程序中读取CCR1的值。

  1. 查询方式读取CCR:设置通道1的“捕获中断”禁止

设置寄存器TIMx_DIER中的CC1IE位=0禁止中断请求.

查询状态寄存器TIMx_SR中的CC1F标志位,确定是否完成捕获,再读CCR1的值。

2)TIMx_CH1信号周期测量的软件计算

  • 在信号第一次有效边沿到来之后,在中断函数中保存捕获/比较寄存器TIMx_CCR1值,并设置保存值有效标志,以标明已经读入一次输入捕获值,退出中断处理函数。

  • 在下一次中断函数运行中,记录新的捕获/比较寄存器TIMx_CCR1的值,并与上次保存的值相减。

  • 计算待测输入信号的周期

注意:在中断函数中,应通过软件或读寄存器 TIMx_CCR1来清除CC1IF标志(又称“中断挂起”位)

6.3.5.2 PWM输入(捕获)模式
  • PWM输入模式是输入捕获的特例,该模式提供了一种更加简便的测量脉宽和频率的方法(代价就是占用了两个捕获寄存器TIMx_CCR1、TIMx_CCR2)。

  •  PWM输入模式同时需要占用输入捕获通道IC1和输入捕获通道IC2两个通道。通道IC3和IC4不可使用该模式。

(1)PWM输入模式的基本原理

如果待测PWM_x信号接入通道1输入段TI1

  • 在待测PWM_x信号(TI1)的任一个上跳沿,触发通道1捕获段一次捕获(CNTàCCR1), CCR1硬件捕获计数器CNT当时值t1,中断标志CC1IF硬件置1,同时触发计数器复位,CNT从0开始计数。

  • 接下来的TI1下跳沿触发通道2捕获段发生一次捕获(CNTàCCR2), CCR2硬件捕获计数器CNT当时值t2。

  • TI1信号任一个上跳沿触发通道1捕获段产生一个"捕获中断请求(CC1IF=1)"。在中断服务程序中先软件读入
  • CCR1的值t1 (本次上跳沿时刻捕获的)
  • CCR2的值t2 (前一个下跳沿捕获的)
  • 最后根据t1和t2计算周期、脉宽、频率、占空比。

 1)PWM输入模式下,必须设置基本定时器工作在“复位模式”。此时需要选择触发信号TRIG来源( TI1FP1 、 TI2FP2、TRC(来源于ITR或TI1F_ED))

  • 设置从模式控制寄存器TIM_SMCR的SMS[2:0]位段=100,表示“复位模式”,表示触发信号TRIG会触发计数TIM_CNT器从0开始重新计数。

  • 如果外部待测信号PWM_x接在通道1输入段TI1上:

设置TIM_SMCR寄存器中的TS[2:0]=101,触发信号TRIG 选择TI1FP1,此时IC1用来测量周期,另一个通道IC2则用来测量脉宽。

2)PWM输入捕获模式下,必须设置接入IC1和IC2的选择哪一路极性信号。

  • 写TIMx_CCMR 寄存器的CC1S[1:0]=01,通道1捕获段的IC1选择自身通道输入段的极性信号TI1FP1;

  • 写TIMx_CCMR 寄存器的CC2S[1:0]=10,通道2捕获段的IC2选择伙伴通道输入段(TI1)的极性信号TI1FP2;

3)PWM输入捕获模式下,必须设置接入IC1和IC2的极性信号TI1FP1 和TI1FP2的极性相反。

  • 写TIMx_CCMR 寄存器的CC1P位=0,设置接到通道1捕获段极性信号TI1FP1 为正极性(即, TI1FP1来源于上升沿检测脉冲信号TI1F_Rising,表示待测信号PWM_x上升沿触发通道1捕获)。

  • 写TIMx_CCMR 寄存器的CC2P位=1,设置接到通道2捕获段的极性信号TI1FP2 为负极性(即, TI1FP2来源于下降沿检测脉冲信号TI1F_Falling,表示待测信号PWM_x下降沿触发通道2捕获)。

4)PWM输入捕获模式下,必须设置接入通道1和通道2的触发捕获允许。

捕获/比较使能寄存器TIM2_CCER中:

  • CC1E位=1,表示允许通道1的信号IC1PS触发CCR1捕获
  • CC2E位=1,表示允许通道2的信号IC2PS触发CCR2捕获

例题6.4

利用TIM2的输入捕获功能,测量任意PWM信号的频率和占空比。

分析,可以利用任意信号源产生PWM信号,此处采用例题6.3中TIM3_CH2输出PWM信号。

上一题中,TIM3-CH2利用了AFIO的部分重映射,把引脚映射在PB5上,以便控制LED0的亮度,此处不必重映射,则TIM3_CH2默认引脚在PA7上。

    本题拟采用TIM2的TI1输入通道(PA0),输入PWM信号,利用PWM输入捕获,测量频率和占空比

第7章 A/D与D/A转换技术

7.1 A/D转换基础

来自现场的各种传感器输出的往往都是模拟量信号,必须要将随时间变换的连续模拟量信号转换为离散的数字信号,才能输入计算机系统进行数据处理

7.1.1  A/D转换原理

  • 模拟信号在时间上和数值上都是连续的,而数字信号在时间和数值上都是离散的。
  • AD转换时按一定时间间隔对输入的模拟信号进行采样,然后把采样值进行量化转换成数字量输出。
  • 通常AD转换需要经过采样、保持、量化、编码四个步骤

7.1.1.1 采样和保持

(1)用途

AD转换需要一定时间,在转换过程中,如果输入到ADC的模拟量发生变化,则不能保证转换精度,为此需要在ADC之前加入采样保持电路(如果模拟信号缓变,则可不必加入此电路电路)

(2)电路工作原理

  • 采样时,VC为高电平,开关S导通,模拟信号x(t)向电容CH充电,如果电容CH很小,在很短时间内即可完成充电,输出电压VO跟踪模拟信号的变化。

  • 保持时, VC为低电平,开关S断开,由于集成运放输入阻抗高,电容放点缓慢,输出电压xs(ts)保持在模拟开关S断开时刻的输入信号值

(3)采样周期和采样频率

采样周期:连续两次采样之间的时间间隔。

采样频率:单位时间内采集数据的点数。

采样实际上是将连续模拟信号时间离散化的过程。

7.1.1.2 量化和编码
  • 原始模拟信号经过采样保持后,得到的是阶梯状的采样保持信号(依然是模拟信号)
  • 量化就是用基本量化单位的个数来表示采样到的模拟信号的幅值,从而实现模拟量到数字量的转换,这个过程也称为量化过程。
  • 编码就是把已经量化的离散值用二进制原码、BCD码或其它码来表示,这个过程称为编码。

例如: 一个12位的ADC,把输入电压分成4096份,若ADC的量程为0~3.3V,则每个量化单位q为

第i个采样点的量化值Dk

模拟电压信号数值上是连续的,不一定能被量化单位∆整除,从而可能引入量化误差。位数越多,量化误差越小。

例如:10位ADC最小量化误差为

7.1.2 A/D转换器的性能指标

7.1.2.1 分辨率

ADC分辨率是指能分辨输入模拟量的最小值,即输出数字量最低位LSB由 10或由01变化时输入模拟量变化的最小值(即Vcc/(2n))。分辨率通常用二进制的位数n来表示。理论分辨率即ADC的输出位数。(Vcc/2n=q)

位数n越大,可分辨的电压越小。即,分辨率越高

7.1.2.2 转换速率

ADC转换速率就是能够重复进行数据转换的速度,即每秒转换的次数。是完成一次AD转换所需时间的倒数。

7.1.2.3 量化误差

(1)产生的原因:量化误差是由ADC的有限位数分辨率所引起的误差。AD转换的结果只能是有限数量的确定值(例如10位ADC只能产生1024个定值),而模拟信号的取值个数是无限的。

(2)概念:一个分辨率有限的ADC阶梯状输入输出特性曲线与具有无限分辨率的ADC输入输出特性曲线(直线)之间的最大偏差(每个台阶的高度q),称为量化误差

7.1.2.4 转换精度
  • 绝对精度:在ADC整个量程范围内,所对应的模拟信号值与实际值之差的最大值。也就是ADC输出的数值偏离线性的最大的距离,单位是LSB,它包括所有的误差(量化误差、设备误差)。
  • 相对精度:绝对精度与满量程输入信号的百分比。

精度与分辨率的区别:

  • 精度是指转换后得到的实际值相对于理论值的误差或接近程度。
  • 分辨率则是指能够对转换结果发生影响的最小输入量。

百度小贴士:

  • 精度(Precision)是指对于给定模拟输入,实际数字输出与理论预期数字输出之间的接近度(误差值是多少)。换而言之,转换器的精度决定了数字输出代码中有多少个比特表示有关输入信号的有用信息。
  • 有些ADC器件的datasheet中,会注明精度值或精度范围。
  • 对于给定的一个具体ADC器件,其精度值可能会受外界环境(温度、干扰等)的影响而变化。

7.2 STM32的ADC

STM32内部最多集成3个12位AD转换器,每个ADC多达18个通道,可测量16个外部和2个模拟内部信号源。

每个通道的AD转换可以单次、连续、扫描或间断模式进行。

7.2.1  STM32 ADC功能简介

7.2.2  STM32 ADC的工作模式

7.2.2.1 独立ADC模式和双ADC模式(本节后面讨论的都是独立ADC模式)
  • 在独立ADC模式下,每个ADC模块可以独立工作,但不能同步。

  • 在双ADC模式下,可以实现同步触发和交替触发等多种不同模式。

  • 设置ADC控制寄存器ADCx_CR1的DUALMOD[3:0]位段=0000,即为独立模式。其它值,对应是双DAC下的不同模式(同步触发、交替触发等模式)

7.2.2.2 规则通道和注入通道

每个ADC都是通过内部的多路模拟开关,切换到不同的输入通道进行采样与转换。为了避免在用户程序中频繁切换通道的麻烦,STM32采用成组转换原理,即由程序员在程序中预先设定好待转换的通道后,STM32对多个模拟通道自动地逐个采样和转换。

  • 规则通道:顾名思义,就是这些通道很守规矩,按照预先设定好的顺序先后启动AD转换。这里指的是加入规则通道组的模拟信号输入通道。

  • 注入通道(了解) :可以理解位插队、插入的意思,是一种不守规矩的通道,在规则通道转换的时候强行插队的一种通道。

这里指的是加入注入通道组的模拟信号输入通道。

(1)规则通道:

  • 加入规则通道组的模拟信号输入通道。规则通道组可以安排1~16个规则通道。

  • 规则通道组中通道个数通过设置ADC规则序列寄存器ADCx_SQR1的L[3:0]位段设定。

  • 通道组中各个通道的转换顺序要通过在ADC规则序列寄存器组ADCx_SQR1~ ADCx_SQR3中SQi[4:0](i=1~16, 表示第i个转换顺序)位段写入相应的规则通道序号(共有18个通道,序号:0~17 )来确定的。

  • 规则通道的触发方式。在ADC控制寄存器ADCx_CR2中的设置EXTTRIG=0时,软件触发; EXTTRIG=1时,ADC外部硬件触发,此时由EXTSEL[2:0]位段选择ADC外部触发信号源(如,TIM1_CH1、 TIM1_CH2、…… )。

7.2.2.3 单次转换模式(一次扳机,一发子弹)
  • 将ADC控制寄存器ADCx_CR2的CONT位置0,可选定单次转换模式。
  • 在单次转换模式下,ADC每启动一次,只进行一次AD转换
  • 该模式即可以通过软件启动(只适用规则通道),也可以通过ADC外部触发启动(适用于规则通道和注入通道)。

转换结束时:

(1)如果是规则通道被转换,转换结果存储在16位ADC数据寄存器ADCx_DR中, ADC状态寄存器ADCx_SR中的转换结束标志EOC硬件置1。如果设置了ADC控制寄存器ADCx_CR1中的中断使能EOCIE位=1,则产生中断请求,然后ADC停止工作。

7.2.2.4 扫描模式(一次扳机,全部子弹射出
  • 扫描模式用来扫描一组模拟通道。将ADC控制寄存器ADCx_CR1的SCAN位置1,可设定为扫描模式, SCAN位置0,关闭扫描模式。

  • 在扫描模式下,ADC会扫描在ADC规则序列寄存器ADCx_SQR1~ ADCx_SQR3(规则通道)选择的所有通道。在每个组的每个通道执行一次单次转换,在单次转换结束时,同一组的下一通道会被自动转换

  • 如果选择了单次转换模式(CONT=0),则会在该组的最后一个通道完成后停止,并产生一个结束信号;如果选择了连续模式(CONT=1)则最后一个通道转换完成后,从选择组中的第一个通道继续AD转换。

7.2.3  STM32 ADC的转换

7.2.3.1 ADC数据格式

(1)规则通道

  • 在规则通道模式下,ADC转换结果存放在32位数据寄存器ADCx_DR中。独立DAC模式下, ADCx_DR高16位无效,在双DAC模式下,ADC1_DR的高16位存放ADC2的转换结果。

  • ADC控制寄存器ADCx_CR2中的ALIGN位用来设定转换结果数据存储的对齐方式。

    

ADC转换结果对齐方式(以独立DAC模式为例):

  • ALIGN=0,右对齐:

规则通道转换结果存储在数据寄存器ADCx_DR[11:0]

  • ALIGN=1,左对齐:

规则通道转换结果存储在数据寄存器ADCx_DR[15:4]

7.2.3.2 ADC采样时间
  • ADC使用若干个ADC_CLK周期对输入电压采样,每个通道可以使用不同的采样时间,各个ADC通道的采样周期数目可以在采样时间寄存器ADCx_SMPR1和ADCx_SMPR2中对应的SMPy[2:0](顺序号y=0~17)位中设定。
  • 总的转换时间:

TCONV=采样时间+转换时间(12.5个ADC_CLK时钟周期)

7.2.3.3 校准
  • 校准可以大幅度减少因内部电容器组的变化造成的精准度误差。

  • 通过设置控制寄存器ADCx_CR2中CAL位可以启动校准。一旦校准结束,CAL位硬件自动复位,即可以正常转换。(建议每次上电时执行一次ADC校准)。

  • 启动校准之前,ADC必须处于关电状态(控制寄存器ADCx_CR2 中ADON位=0)超过至少两个ADC_CLK。

7.2.3.4 转换启动

ADC启功可以由软件触发,也可以由外部事件触发(如定时器捕获比较事件、EXTI线)。

(1)软件触发

  • 将控制寄存器ADCx_CR2 中EXTTRIG位置0,则关闭外部事件触发转换
  • 通过控制寄存器ADCx_CR2中SWSART位开启规则通道组进行AD转换

(2)外部事件触发

  • 将控制寄存器ADCx_CR2 中EXTTRIG位置1,则外部事件就能够触发转换。
  • 通过控制寄存器ADCx_CR2中EXTSEL[2:0]位段可以选择8个可能的外部事件中的某一个规则通到组的触发源。

7.2.3.5 获取转换结果

(1)软件查询方式

软件通过查询状态寄存器ADCx_SR中的EOC位,直到规则通道组的AD转换已经完成,读取数据寄存器ADCx_DR(规则通道组) 中的结果。

(2)中断方式

  • 设置控制寄存器ADCx_CR1中的EOCIE=1(转换结束中断允许)后,可产生规则通道组中断。

  • 由于ADC1和ADC2两个接口共用一个中断源,故需要软件查阅状态寄存器ADCx_SR中的转换结束标志EOC,用以确定是何种通道引发的中断。

  • 通过转换结束标志EOC判定何种通道请求的中断后,需用软件清除该标志位(清除中断挂起位)。

7.2.4 STM32  ADC的应用

开启ADC采样转换步骤

以软件触发ADC1通道10(模拟信号输入来自PC0引脚),用查询方式获取AD转换结果为例

(1)GPIO引脚配置

GPIO_InitTypeDef   GPIO_InitStruct;

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC|RCC_APB2Periph_AFIO,  ENABLE); //使能GPIOC和AFIO设备时钟

GPIO_InitStruct.GPIO_Pin=GPIO_Pin_0; //选择要配置的引脚号

GPIO_InitStruct.GPIO_Mode=GPIO_Mode_AIN; //设置引脚位为模拟信号输入

GPIO_Init(GPIOC,& GPIO_InitStruct); //初始化配置 PC0引脚

(2)使能ADC时钟

RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1,  ENABLE);

RCC_ADCCLKConfig(RCC_PCLK2_DIV8);

//配置 预分频比例9,(ADCCLK=9MHz)

(3)设置ADC工作模式

ADC_InitTypeDef   ADC_InitStruct;

ADC_InitStruct.ADC_Mode=ADC_Mode_Independent;

 //独立ADC模式

ADC_InitStruct.ADC_ScanConvMode=DISABLE; //不使用扫描模式

ADC_InitStruct.ADC_ContinuousConvMode=DISABLE;

//不使用连续转换方式

ADC_InitStruct.ADC_ExternalTrigConv=ADC_ExternalTrigConv_None;

// 不使用外部触发方式(即使用软件触发方式)

ADC_InitStruct.ADC_DataAlign=ADC_DataAlign_Right;

//数据右对齐

ADC_InitStruct.ADC_NbrOfChannel=1; //规则通道组 通道数1个

ADC_Init(ADC,& ADC_InitStruct);

(4)设置通规则道组的转换顺序和采样时间

ADC_RegularChannelConfig(ADC1,ADC_Channel_10,1,ADC_SampleTime_55Cycles5);

(5)使能ADC工作,复位并校准ADC

ADC_Cmd(ADC1,ENABLE)

ADC_ResetCalibration(ADC1); //复位校准寄存器While(ADC_GetResetCalibrationStatus(ADC1)); //等待复位结束,

ADC_StartCalibration(ADC1); //启动ADC1校准While(ADC_GetCalibrationStatus(ADC1)); //等待复位结束

(6)触发ADC转换,并获取结果

ADC_SoftWareStartConvCmd(ADC1,ENABLE);

// 软件触发ADC1转换

While(ADC_GetFlagStatus(ADC1,ADC_FLAG_EOC)!=1);

//查询等待ADC1的EOC标志置1

ADResult=ADC_GetConversionValue(ADC1);

//保存ADC1转换结果

例题7.5

利用查询方式,获取传感器的模拟电压信号。

1.硬件设计:

(1)传感器信号接入:传感器采用电位器,1,2,3脚分别接3.3V,ADC1的CH1通道模拟输入端PA1,0V。

(2)ADC1工作方式:通道1,工作在单次启动,非扫描模式

(3)触发方式:软件触发转换。

(4)转换结果数据传送:采用查询方式进行数据传送。

7.3 D/A转换基础

7.3.1 转换原理

DA转换器的主要作用是将数字量转换成模拟量,它的基本要求是输出电压Vo应和数字量成正比。

其中

是n位二进制数字量,Vo信号呈现出台阶形状(模拟真实连续信号)。

7.3.2  D/A转换器的主要性能指标

7.3.2.1 分辨率

分辨率是指D/A转换器对输入数字量变换敏感程度的度量,它是D/A转换器所能分辨的最小输入量,通常用数字量的位数来表示,如8位、12位分辨率等。

例如VREF=5V,8位分辨率则是5V/255=1.96mV

7.2.3.2 转换精度

转换精度反映了D/A转换器的精确程度。它与芯片的结构、外部电路配置、电源等因素有关。

7.2.3.3 建立时间

又称为转换时间,即当输入数据发生变化后,输出模拟量达到稳定值,也即进入规定的精度范围内所需要的时间。

7.2.3.4 温度系数

温度系数是D/A转换器受环境影响的特征。

7.2.3.5 非线性误差

又称线性度,它是指实际转换特性曲线与理想转换特性曲线之间的最大偏差。

7.4 STM32的DAC

7.4.1  STM32 DAC 功能简介

  • 12位数字输入、电压输出型DAC
  • 可以配置成8位或12位模式,也可以与DMA控制器配合使用。
  • DAC模块有2个输出通道,每个通道都有独立的转换器。在双DAC模式下,两个通道可以独立地进行转换,也可以同时进行转换并同步更新两个通道的输出。

(1)DAC框架理解:

  • VDDA为模拟电源,VSSA为模拟电源地。VREF+ 为参考电源。
  • DAC_OUTx(x=1~2)为DAC通道x的模拟电压输出(PA4或PA5引脚)。
  • EXTI_9 为芯片外部触发事件信号。

(2)可以通过控制寄存器DAC_CR进行如下设置:

  • 设置TENx位使能或禁止触发;
  • 设置TSELx[2:0]位段选择触发方式:软件触发、定时器触发、或外部事件触发。仅当 TENx=1时选择才有效!!
  • 设置ENx位使能或禁止DAC;
  • 设置WAVENx[1:0]位段选择三角波形输出、噪声输出或禁止波形输出

(3)数据的写入

      DAC的输出直接受数据输出寄存器DAC_DORx控制,但不可直接对DAC_DORx写入数据,可以通过对数据保持寄存器DAC_DHRx写入数据,间接传给它。

(4)伪噪声的产生

     线性反馈移位寄存器LFSR,存放按照特定的算法得到伪随机数,用以产生幅度变化的伪噪声。

(5)三角波的产生

     TRIANGLE自动产生三角波数据

7.4.2  STM32 DAC 的工作模式

1.DAC的触发

(1)SIM32的启动方式可以设置为触发转换模式或非触发转换模式。

  • 触发禁止(非触发启动,数据写入DHR自动启动)
  • 触发允许(软件触发或硬件触发)

(2)触发方式

在触发允许模式下,触发方式可在DAC控制寄存器DAC_CR 的TSELx[2:0]位段设置,选择软件触发、定时器触发、外部引脚触发

2.DAC的波形输出形式

STIM32DAC可在控制寄存器DAC_CR 的WAVEx[1:0]位段设置.

  • WAVEx[1:0]=00 ,选择关闭波形输出
  • WAVEx[1:0]=1x,    三角波输出
  • WAVEx[1:0]=01 ,噪声输出。

(1)三角波输出:在一个基值上叠加一个小幅度的三角波。

(2)噪声输出

3.DAC的输出缓存

  • STIM32 DAC集成了2个输出缓存,可以用来减少输出阻抗,无需外部运放即可直接驱动外部负载。
  • 每个DAC通道的输出缓存可以通过DAC_CR的BOFFx位来使能或关闭

7.4.3  STM32 DAC 的转换

1.DAC数据格式

可配置为8位或12位, 也可配置为单通道和双通道,在12位模式下具有左对齐和右对齐两种格式以适应不同格式的用户数据

2.DAC的转换

3.DAC使能

例7.3  

利用DAC产生5Hz的正弦信号(中断方式)

(1)初始化函数sin_GPIO_DAC_TIM_NVIC_Config()

(2)TIM2更新中断服务程序

(3)主函数main()

  • 15
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值