时钟源
时钟源分为:RC振荡器,晶体振荡器。
RC振荡器起振速度比晶体振荡器起振速度快,成本低,但精度不高,两者都是先慢慢起振,再达到相应的频率。

晶体振荡器分为两种:无源晶体振荡器,需要接两个引脚,借助时钟电路才能产生震荡信号,自身没有办法震荡

有源晶体振荡器,需要外部供电才能起振,并且只需要接一个引脚OSC_IN.

基础时钟源
STM32F407有4个输入时钟源:
内部时钟源(封装到芯片内部的):HSI 内部高速时钟源(主要就是给CPU核心去提供)
LSI 内部低俗时钟源(主要是给内部的看门狗,给RTC实时时钟去使用)
外部时钟源(通过引脚输入进去):HSE 外部高速时钟源
LSE 外部低俗时钟源
HSI时钟
由内部16MHz RC振荡器生成的,可以直接用作系统时钟或者用作PLL输入。 PLL(给时钟内部的锁相环做这个分频倍频处理之后,再去给系统使用)

HSE时钟
高速外部时钟信号可以支持两种时钟源,由有源晶振和无源晶振提供,频率范围4~26MHz(一般是8MHz和12MHz),它也可以直接用作系统时钟,或者PLL输入

LSI时钟
由RC振荡器生成的,可作为低功耗时钟源在停机和待机模式下保持运行,供独立看门狗(IWDG,主要就是保证程序在异常情况下,能够自动的复位CPU)和RTC使用。频率为32kHz.

LSE时钟
是32.768kHz低速外部晶振或陶瓷谐振器。可作为实时时钟(RTC)的时钟源来提供时钟或日历或其他定时功能,具有功耗低且精度高的优点。

系统时钟源
PLL时钟
内部PLL基于HSI(内部高速时钟)或HSE(外部高速时钟)输入的时钟频率进行倍频,从而得到系统时钟SYSCLK。使用PLLM,PLLP,PLLQ可编程分频因子以及PLLN倍频因子,可调整PLLCLK输出的时钟频率。

SYSCLK时钟
SYSCLK就是系统时钟,它可以通过System ClockMux选择器来选择输入的源时钟,有HSI(内部高速时钟),HSE(外部高速时钟),PLLCLK三种输入源。

HCLK时钟
将系统时钟经过AHB Prescaler分频器 分频后就得到了HCLK时钟,HCLK时钟为AHB总线提供的时钟信号,最大频率168MHz主要用于高速外设,可以为DMA,Cortex System Timer,FCLK,APB1,APB2提供时钟输入。系统时钟经过分频器 分频后,它就会产生各种各样的时钟域了。时钟域就是给我们这个芯片内部的一些外设控制器去提供对应的这个时钟输入。

外设时钟
APB总线时钟
STM32F407 APB总线时钟分为APB1和APB2时钟,是由HCLK时钟提供时钟输入。再经过APB Prescaler分频后得到APB外设时钟。

外设控制器时钟
STM32F407外设控制器时钟主要通过AHB总线时钟,APB1总线时钟,APB2总线时钟来提供时钟输入。AHB总线时钟一般都是一些高速的外设,比如DMA,网卡。都是挂载到AHB总线上。每条总线都可以挂载多个外设控制器。

RTC时钟
RTC时钟输入源可以由LSE(外部低速),LSI(内部低速),或者HSE(外部高速)经过分频后提供,IWDG(独立看门狗)输入时钟相对简单,只有LSI(外部低速)时钟
RTC Clock Mux选择器可以选择由LSE(外部低速),LSI(内部低速)时钟直接为RTC提供输入时钟,还是由HSE(外部高速)经过分频后作为RTC的输入时钟。

时钟输入
MCO时钟输出功能
MCO是微控制器时钟输出引脚,主要作用是可以对外提供时钟,相当于一个有源晶振。再STM32F407中由MCO1(PA8)和MCO2(PC9)两个引脚。

一,UART控制器
串口通讯是一种通过串行传输数据的通信方式,用过UART控制器实现的。串口的硬件连接,需要TX,RX,GND,3条线,TX连RX,GND接GND。

串口的波特率表示在1秒钟内,两个串口这杯之间能传输多少个码元。在串口通信中,波特率等于比特率。常用的波特率有2400,4800,9600,115200.
一帧完整的串口数据帧由开始位,传输数据,校验位,停止位组成,并且开始为是以低电平开始,停止位以高电平结束。常用8位数据位模式是进行数据收发,9位数据位是为了使用校验位。
校验位分为奇校验和偶校验,就是保证一帧数据中的高电平的数量是奇数个还是偶数个。如果使用了校验位,那么校验位将占用数据位中的一位去使用。

串口收发流程
发送流程:将串口数据写入内存,然后程序将内存中的数据填入到串口控制器的TDR寄存器,TDR寄存器中的数据会自动传入发送移位寄存器,在从TX引脚发送。
接收流程:
当RX引脚上有数据时,会依次流入到接收移位寄存器,接收完后会将数据写入到RDR寄存器,程序读取RDR寄存器的数据写入内存中使用。
MODBUS协议概述
MODBUS时一种基于串行通信的通信协议,旨在为工业现场提供一种通用的通信标准。用来实现不同设备之间的数据交换和控制。
一帧modbus协议包含地址域(从机地址),功能码,数据(寄存器地址,和发的内容),差错校验(CRC校验)

常用功能码
01 (0x01):读取线圈状态
02 (0x02):读取离散输入
03(0x03):读取保持寄存器
04(0x04):读取的输入寄存器
05(0x05):写单个线圈
06(0x06):写单个寄存器
MODBUS通讯流程
在MODBUS通讯中两个设备间使用应答机制实现数据间交互。当设备需要获取数据时需先发出请求,当传感器收到请求后将单片机请求的数据发送给单片机。
由主站主动发送请求帧,看是发送到那个从机地址,从机匹配地址后被动响应,且从站绝对不能主动发起通信。

modbus协议控制led灯

配置PC6引脚为GPIO输出,使用外部高速时钟,配置串口1进行收发


代码





二,STM32 DMA控制器
DMA代表直接存储器访问。DMA是一种嵌入式系统中用于高效传输数据的机制,提供在外设于存储器,存储器和存储器之间的高速数据传输,他允许外设中的数据直接传输到系统存储器,而无需通过CPU干预。特别是在大量数据据传输的场景下,通过减少CPU的干预,系统性能得到提升。

STM32F407有两个DMA控制器,每个控制器有8个数据流,每个数据流有8个通道,一次只能搬运一个通道的数据。

DMA的仲裁器
它是一个用于管理多个DMA通道之间竞争访问系统总线的组件。仲裁器的任务就是协调这些通道的访问。
软件优先级:每个通道的优先权可以在DMA_CCRX寄存器中设置,分为4个等级,最高优先级,高优先级,中等优先级,低优先级
硬件优先级:如果2个请求有相同的软件优先级,则较低编号的通道比较高编号的通道有较高的优先权。(DMA优先处理优先级高的,再处理优先级低的,如果DMA此时正在处理优先级低的,但这个时候进来一个优先级高的,DMA会把正在处理的处理完再去处理优先级高的。如果优先级一样,那就先处理编号低的。)

DMA事务
它包含了三个操作:通过DMA_SXPAR或DMA_SXM0AR寄存器寻址,从外设数据寄存器或存储器中加载数据。然后再通过DMA_SXPAR或DMA_SXM0AR寄存器寻址,将加载的数据存储到外设寄存器或存储器。
同时DMA_SXNDTR计数器在数据存储结束后,该计数器中包含仍需执行的事务数。
要传输的数据项的数目及其宽度(8位,16位,32位)可用软件编程。
DMA的传输模式
数据传输方向使用DMA_SXCR寄存器中的DIR位进行配置,有三种可能的传输方向:存储器到外设,外设到存储器,存储器到存储器。
|-----|---------|--------|---------|
| DIR | 模式 | 源地址 | 目标地址 |
| 00 | 外设到存储器 | 外设控制器 | 存储器地址 |
| 01 | 存储器到外设 | 存储器地址 | 外设控制器 |
| 10 | 存储器到存储器 | 源存储器地址 | 目标存储器地址 |
FIFO
当启用FIFO后,每个数据流都有一个独立的4字(16字节)FIFO,源地址中的数据不会直接由DMA搬运到目标地址中,而是先将数据存入FIFO中,当到达设置的阈值时DMA会从FIFO中将数据取出放入存储器。
FIFO相当于一个队列做数据缓存的,如果数据比较多就会启用FIFO,先将数据放到缓存里,再从缓存放到目标里。

DMA的指针增量
根据DMA_SXCR寄存器中PINC和MINC位的状态,外设和存储器指针在每次传输后可以自动向后递增或保持常量。
当设置为增量模式时,下一个要传输的地址将是前一个地址加上增量值。(DMA搬完以后自动去般下一个)
当设置为保持常量时,每次传输的将会是同一个内存地址中存放的数据。(DMA就一直在这家搬运)
在直接模式下,不允许源于目标的传输数据宽度不同,二者必须相等,并由DMA_SXCR中的PSIZE位定义,MSIZE位无效。
当使用内部FIFO时,源和目标数据的数据宽度可以通过DMA_SXCR寄存器的PSIZE和MSIZE位(可以是8,16,32位)编程。
DMA的循环模式
循环模式可用于处理循环缓冲区和连续数据流(比如ADC扫描模式)
可以使用DMA_SXCR寄存器中的CIRC位使能此特性。
当激活循环模式时,要传输的数据项的数目在数据流配置阶段自动用设置的初始值进行加载,并继续响应DMA请求。(DMA搬运完一圈后,它的任务清单会自动重置。永远不会停工,循环往复的在同一条路线上搬运。)
DMA的双缓冲模式
通过将DMA_SxCR寄存器中的DBM位置1,即可使能双缓冲区模式,存储器到存储器模式不适用。
在此模式下,DMA_SxM0AR与DMA_SxM1AR寄存器互相协作,每次事务结束时,DMA控制器都从一个存储器目标交换为另一个存储器目标。
软件在处理一个存储器区域的同时,DMA传输还可以填充/使用第二个存储器区域。
(有A,B两个地方,DMA搬运完A以后,会自动的去B搬运。这个时候CPU就可以去处理A的数据了,CPU和DMA相互不打扰,彻底杜绝数据溢出。)
DMA的流控制器
控制要传输的数据数目的实体称为流控制器。
流控制器使用DMA_SXCR寄存器中的PFCTRL位针对于每个数据流独立配置。
DMA控制器:在这种情况下,要传输的数据项的数目在使能DMA数据流之前由软件编程到DMA_SXNDTR寄存器。
外设源或目标:当要传输的数据项的相互木未知时属于这种情况。当所传输的是最后的数据时,外设通过硬件向DMA控制器发出指示。仅限能够发出传输结束信号的外设支持此功能(SDIO)。

DMA数据传输实验
STM32CUBEMX配置

使用内部高速时钟,设置PA9为USART1_TX,PA10为USART1_RX

设置USART1的参数为异步通信,不使用RS232协议,波特率为115200比特每秒,8位数据位,没有奇偶校验位,1位停止位

设置USART1_RX的DMA,使用的是DMA1的通道5,搬运的方向为从外设到存储器,模式为普通模式,外设的地址不自增,存储器的地址自增,每次搬运一个字节。

然后使能DMA中断
生成配置代码并编写代码



最终效果
三,STM32 ADC控制器
ADC,即模/数转换器,是一种将模拟信号转换为数字信号的电子元件

ADC将模拟信号转换为数字量一般都需要经过三个步骤:采样,量化,编码。
采样:
首先要对模拟信号进行采样,采样的作用就是将时间上连续的模拟信号离散化。简单来说就是以固定的时间间隔采集连续信号,这样就可以得到一个在时间上离散的信号,而这个固定的时间间隔被称为采样周期,用T表示,那么采样频率Fs = 1 / T,单位是Hz,公式中的分母1表示1s,那么其含义就是1s有几个时间间隔,也就等价于1s时间可以采集多少个点。一个系统以超过信号最高频率至少两倍的速率对模拟信号进行均匀采样,那么原始信号就能从采样产生的离散值中完全恢复(奈奎斯特采样定理Fs > 2fmax)。

量化:
量化的作用其实就是将采样出来的模拟信号值进行分级,然后每一个级别对应一个数字值。
量化的两种方式:四舍五入和只舍不入量化
方式一:只舍不入法,量化中不足量化单位部分舍弃掉。如,数值在0 ~ 0.625之间的电压都被量化为0V,0.625 ~ 1.25之间的电压都被量化为0.625V,以此类推。
量化方式二:四舍五入,以量化间隔/ 2为分界,进行取舍。如,0 ~ 0.3125(0.625/2)之间的电压都被量化为0V;0.3125 ~ 0.9375(1.875/2)之间的电压都被量化为0.625V;以此类推。
ADC的分辨率和参考电压
分辨率:量化间隔越小,把规定范围的电压分成的份数就越多,这就代表它的分辨率越高,分辨率也就是系统能够测量的最小电压。常见的ADC分辨率一般有8位、10位、12位等等。
参考电压:要想得到量化的间隔,就需要两个参数,一个就是分辨率,确定划分的份数,另一个就是一个基准电压,STM32的ADC控制器,其参考电压一般是3.3V
编码
经过量化之后,模拟信号已经成功数字化了,下一步就是编码,编码的含义就是用"1"和"0"的组合,为每个量化等级进行编号,从而代替相应区间的电压值。
ADC的参考电压于分辨率
ADC的参考电压是ADC进行量化的基准
参考电压:
VREF+ / VDDA:正/高参考电压(通常等于模拟电源电压,范围 1.8V ~ 3.6V)。
VREF- / VSSA:负/低参考电压(通常接地)。

分辨率:
由ADC_CR1.RES位控制。
STM32F407 的 ADC 最高支持 12位 分辨率(也可配置为 6位、8位或 10位)。
计算公式:数字值 = (模拟电压 / (VREF+ - VREF-)) * (2^分辨率 - 1)。
ADC通道指的是将模拟信号输入到ADC控制器的单个输入路径或者是信号通道,通常,一个ADC控制器可以具有多个输入通道,每个通道都可以连接到一个模拟信号源。


ADC转换序列
当需要转换多个通道时,需要定义转换的顺序和长度。长度是需要转换的通道个数;顺序:指的是想要以什么样的顺序转换需要转换的通道。ADC提供了两种序列:规则序列,注入序列
规则序列:
定义:主要的转换序列,类似于"日常工作"
长度:最大长度16
顺序:通过ADC_SQRX寄存器设置通道在修序列中的位置(SQ1,SQ2...SQ16)

注入序列:
注入序列中最多可以放入4个通道进行转换,注入序列的转换顺序与设置的注入序列长度有关

定义:一种"插入式"的转换序列,具有更高的优先级,类似于"突发事件处理"。
长度:最大长度位4(由ADC_JSQR.JL位设置)
优先级:注入序列可以打断规则序列的转换。转换完成后,规则序列会从被打断的地方恢复。
自动注入模式:如果使能 (ADC_CR1.JAUTO),注入序列会在规则序列转换完成后自动触发,无需外部触发。
那么注入序列存在的意义是什么呢?
情况1:规则序列的最大长度是16,但是ADC控制器最多可有19个ADC通道,并且同一个通道还可以占据多个规则序列。
情况2:针对于突发情况:需要临时打断规则序列的转换。

ADC的触发源
启动ADC转换的方式有两种:软件触发,硬件触发。
软件触发
规则序列:向ADC_CR2.SWSTART位置1.

注入序列:向ADC_CR2.JSWSTART位置1.

硬件触发(外部触发转换,定时器捕获,EXTI中断线)
规则序列:通过ADC_CR2.EXTSEL选择触发源,再通过ADC_CR2.EXTEN位选择触发极性

注入序列:通过ADC_CR2.JEXTSE选择触发源,再通过ADC_CR2.JEXTEN位选择触发极性

ADC转换时间
ADC外设挂载在APB2外设时钟总线上,ADC具有两个时钟,其来源都是APB2。
ADC时钟1:用于模拟电路的时钟ADCCLK此时钟决定了ADC通道的采样和转换的时间,此时钟来自于经可编程预分频器分频的APB2时钟,该分频器允许ADC在fpclk/2、fpclk/4、fpclk/6或fpclk/8下进行工作,分频器系数的选择可由ADC_CCR.ADCPRE位进行选择。但是需要注意的一点是:ADCCLK被允许的最大频率36MHz。
ADC的时钟2:用于数字接口的时钟。此时钟用于ADC控制器寄存器的读/写访问
ADC 的工作模式
ADC 的工作模式由 单次/连续 和 扫描/非扫描 两个维度组合而成。
|----------|---------------------------------------|
| 模式组合 | 描述 |
| 单次 + 非扫描 | 最基础模式。启动后只转换序列中的第一个通道一次,然后停止。 |
| 连续 + 非扫描 | 启动后不断重复转换序列中的第一个通道。 |
| 单次 + 扫描 | 启动后按照序列顺序转换所有配置的通道(长度 > 1),转换完一轮后停止。 |
| 连续 + 扫描 | 启动后不断重复转换整个序列(最常用的多通道采集模式)。 |
如果关闭扫描模式 (ADC_CR1.SCAN = 0),即使序列长度设置大于 1,ADC 也只会转换序列中的第一个通道。
ADC 的数据寄存器与对齐
转换完成后,结果存储在数据寄存器中。
规则数据寄存器 (ADC_DR):只有一个。用于存储规则序列的转换结果。如果启用了扫描模式,该寄存器只保存最后一个完成转换的通道的数据(因此通常配合 DMA 使用,防止数据被覆盖)。
注入数据寄存器 (ADC_JDRx):有 4 个(JDR1-JDR4)。每个寄存器对应注入序列中的一个位置,用于存储注入通道的转换结果。

数据对齐:
右对齐:数据低位对齐寄存器低位(低 12 位有效,高 4 位为 0)。
左对齐:数据高位对齐寄存器高位(高 12 位有效,低 4 位为 0)。
ADC 的状态寄存器
用于查询 ADC 的当前工作状态或判断转换是否完成。
|-------|--------|--------------------------------|
| 标志位 | 含义 | 触发条件 |
| STRT | 规则序列开始 | ADC_SR.STRT = 1 (正在转换) |
| EOC | 规则转换结束 | ADC_SR.EOC = 1 (一个通道转换完成) |
| JSTRT | 注入序列开始 | ADC_SR.JSTRT = 1 (正在转换注入) |
| JEOC | 注入转换结束 | ADC_SR.JEOC = 1 (注入序列转换完成) |
| OVR | 溢出标志 | ADC_SR.OVR = 1 (数据被覆盖/未及时读取) |
| AWD | 模拟看门狗 | ADC_SR.AWD = 1 (电压超出设定阈值) |

模拟看门狗(AWD)
模拟看门狗用于监测规则序列或者是注入序列的转换结果。如果ADC 转换的模拟电压低于阈值下限或者是高于阈值上限,则模拟看门狗状态位AWD会置1。阈值下限由ADC_LTR寄存器设置,阈值上限由ADC_HTR寄存器设置。
模拟看门狗的阈值设置:需要根据当前使用的分辨率进行设置,例如:2 位的ADC,那么其模拟看门狗的阈值范围就是0 ~ 4095,10 位的ADC,那么其模拟看门狗的阈值范围就是0 ~ 1023。
规则序列通道的模拟看门狗监测,由ADC_CR1.AWDEN位使能;
注入序列通道的模拟看门狗监测,由ADC_CR1.JAWDEN位使能;
模拟看门狗的通道检测模式,由ADC_CR1.AWDSGL位进行配置。
将AWDEN、JAWDEN、AWDSGL三个位区进行组合,可以有一下几种模拟看门狗通道的监测选择:

ADC的中断和DMA请求
当特定事件发生时,ADC 可以产生中断或 DMA 请求。
中断请求 (由 ADC_CR1 使能):
EOCIE:规则转换结束中断(对应 EOC 标志)。
JEOCIE:注入转换结束中断(对应 JEOC 标志)。
AWDIE:模拟看门狗中断(对应 AWD 标志)。
OVRIE:溢出中断(对应 OVR 标志,通常在 DMA 传输慢时触发)。

DMA 请求:
使能:由 ADC_CR2.DMA 位控制(0: 禁止, 1: 使能)。
模式:由 ADC_CR2.DDS 位控制。
DDS = 1:即使 DMA 计数结束,只要 ADC 继续转换,就会继续生成 DMA 请求(常用于连续模式下的循环缓冲区)。
DDS = 0:当 DMA 的传输计数结束时,停止生成 DMA 请求。

ADC采集光照强度实验
STM32CUBEMX配置

开启PC2的ADC1通道12

Mode :Independent mode表示当前配置的 ADC1是独立工作的。
Data Alignment: Right alignment数据右对齐
Scan Conversion Mode :Disabled不使用扫描模式
Continuous Conversion Mode :Enabled使用连续转换模式
Discontinuous Conversion Mode :Disabled不使用间断模式
Enable Regular Conversions :Enable启用规则组转换。
Number Of Conversion 1:转换数量为 1。
External Trigger Conversion Source :Software trigger外部触发源为软件触发。
Rank :1排序为第 1
当前ADC1是独立工作的,不依赖别的 ADC。只采集 1 个通道的数据。采用连续转换模式,一旦启动就会一直采集。由软件代码控制启动。

启动ADC的DMA,从外设到存储器,循环模式,外设地址不变,存储器地址自增,半个字节地般运

使用外部高速时钟

定义一个FLAG标志位,再定义一个数组让DMA每次搬运5.


STM32 的 ADC 通常是 12位 的精度,这意味着 ADC 会把输入的电压范围划分成 4096(2^12) 个等级,输出的数字量(adc_val)范围是 0 ~ 4095。0代表最低电压(通常是 0V)。
4095 代表最高电压(参考电压)。STM32 开发板通常使用 3.3V 作为 ADC 的参考电压。
实验现象
四,STM32 TIM控制器
定时器基本原理
使用精准的时基,通过硬件的方式,实现定时功能。定时器的核心就是计算器。

定时器分类
分为常规定时器,特殊功能定时器,系统定时器
常规定时器
STM32定时器又分为基本定时器,通用定时器和高级定时器,它们有不同的功能,适用于不同的应用场景。
1.基本定时器:
特点:只有计数功能,没有输入捕获和输出比较功能,结构简单,常用于基础时间基准的生成。
应用场景:实现简单的定时,提供DAC的转换触发信号。
2.通用定时器:
特点:功能较为灵活,支持输入捕获,输出比较,PWM等功能,既可以用作普通的时间计时器,也可以处理外部信号。
应用场景:外部信号捕获,PWM信号生成(电机控制,屏幕背光控制等)
3.高级定时器
特点:功能最为强大,处了通用定时器的所有功能外,还支持专门的功能(如死区时间控制和刹车机制),专为复杂控制认为设计,如电机控制。
应用场景:专用于电机控制,复杂的功率信号生成,尤其是需要安全机制(刹车)和高精度PWM的应用。
特殊功能定时器
独立看门狗,窗口看门狗,用于系统允许时的安全保护
实时时钟RTC,提供准确的时间和日期
系统定时器
SYSTICK系统滴答,操作系统的任务切换。
基本定时器
基本定时器只有计数功能,没有输入捕获和输出比较功能,结构简单,常用于基础时间基准的生成。实现简单的定时、提供DAC的转换触发信号。
基本定时器结构

1.时钟源
基本定时器的时钟源来自APB1总线时钟。
2.预分频器(PSC)
负责对定时器输入时钟进行分频,它的主要作用是通过降低定时器的输入时钟频率,为定时器的计时和定时功能提供更灵活的时间控制。TIMx_PSC寄存器是定时器的预分频器寄存器,用于设置定时器的预分频因子,分频因子决定了定时器的时钟频率。需要注意的是实际的分频值为TIMx_PSC+1(如图预分频器的分频值为5但是其寄存器TIMx_PSC里的值为0000000000000100(4))。预分频器的分频系数介于1和65536之间。由于TIMx_PSC控制寄存器有
缓冲,因此可对预分频器进行实时更改。而新的预分频比将在下一更新事件(UEV事件)发生时被采用。
3.计数器
计数器通过对输入时钟(由预分频器分频后的时钟信号),记录经过的时间。计数器的计数模式有三种,递增计数、递减计数、中央对齐计数,但是,基本定时器仅支持递增模式。
TIMx_CNT寄存器是计数寄存器,用于存储定时器的计数值。
计数器由预分频器输出CK_CNT提供时钟,仅当TIMx_CR1寄存器中的计数器启动位(CEN)
置1时,才会启动计数器。计数器从0计数到自动重载值(TIMx_ARR寄存器的内容),然后重新从0开始计数并生成计数器上溢事件。
4.自动重装载器
控制计数器的最大计数值,从而影响定时器的溢出时间和功能行为。
TIMx_ARR是自动重装载器的重装载值寄存器,当TIMx_CNT寄存器等于TIMx_ARR寄存器时,计数器上溢,TIMx_CNT寄存器的值自动重置为0,同时产生一个UEV更新信号。
自动重载寄存器是预装载的。每次尝试对自动重载寄存器执行读写操作时,都会访问预装载寄
存器。预装载寄存器的内容既可以直接传送到影子寄存器(TIMx_CR1寄存器中的UDIS位为1),也可以在每次发生更新事件UEV时传送到影子寄存器,这取决于TIMx_CR1寄存器中的自动重载预装载使能位(ARPE)。当计数器达到上溢值并且TIMx_CR1寄存器中的UDIS位为0时,将发送更新事件。该更新事件也可由软件产生。
UEV事件的产生
可能产生UEV事件的信号来源:
①计数器上溢(TIMx_CNT寄存器值==TIMx_ARR寄存器值)
②手动产生(将TIMx_EGR.UG位写1)
产生UEV事件的信号来源是否可以产生一个UEV的更新事件,取决于TIMx_CR1.UDIS位域。TIMx_CR1.UDIS为0时,允许产生更新事件;TIMx_CR1.UDIS为1时,则禁止产生UEV事件。
通用定时器(TIM2~TIM5,TIM9~TIM14)
这些定时器彼此完全独立,不共享任何资源,所以可以同步操作。
用途:测量输入信号的脉冲宽度(输入捕获),或生成输出波形(输出比较和PWM)
有递增,递减,中央对齐模式,4个独立通道:输入捕获,输出比较,PWM生成(边沿和中心对齐模式),单脉冲模式输出。
PWM波输出原理
PWM简称脉冲宽度调制,是利用微处理器的数字输出来对模拟电路进行控制的一种非常有效的技术,广泛应用在测量、通信、工控等方面。
PWM的频率是指在1秒钟内,信号从高电平到低电平再回到高电平的次数,也就是说一秒钟PWM有多少个周期,单位Hz。
PWM的周期T=1/f,T是周期,f是频率。
占空比是一个脉冲周期内,高电平的时间与整个周期时间的比例,单位是% (0%-100%)

在递增模式下当 TIMx_CNT 的值等于 TIMx_CCRx 寄存器时,根据 TIMx_CCMR1 寄存器中设的 OC1M 位设置的 PWM 模式设置决定OCxREF 的状态。
通过向 TIMx_CCER 寄存器中的 CC1P 位写入 0 设置 OC1REF 为高电平有效,并设置 CC1E 为 1 设置TIM3_CH1 为输出功能
PWM 模式 1:
在递增计数模式下,只要 TIMx_CNT<TIMx_CCR1,通道 1 便为有效状态(OC1REF=1),
否则为无效状态(OC1REF=0)。
在递减计数模式下,只要 TIMx_CNT>TIMx_CCR1,通道 1 便为无效状态(OC1REF=0),否则为有效状态 (OC1REF=1)。
PWM 模式 2:
在递增计数模式下,只要 TIMx_CNT<TIMx_CCR1,通道 1 便为无效状态(OC1REF=0),
否则为有效状态(OC1REF=1)。
在递减计数模式下,只要 TIMx_CNT>TIMx_CCR1,通道 1 便为有效状态(OC1REF=1),否则为无效状态(OC1REF=0)。
PWM完成呼吸灯实验

选择PA3为TIM2通道4模式

选择TIM2的模式为使用内部时钟,通道4为配置为脉宽调制输出模式
第一个Slave Mode(从模式)不使用,它不会受其他定时器或外部信号的触发控制,而是独立运行。
第二个Trigger Source(触发源)表示没有外部或内部事件作为触发信号来启动或控制TIM3。
第三个Clock Source(时钟源)TIM3使用系统内部时钟作为计数基准。
预分频器为63,实际记数频率为64MHz/(63+1)=100KHz
计数模式设置为UP,即为向上计数
自动重装载值为999,PWM 频率为100KHz/(999+1)=100Hz,时间周期为1/100Hz*100=0.01S
auto-reload preload: 自动重装载预装载使能,这是一个保护机制。当修改周期值时,新数值不会立即生效,而是等到当前这个周期跑完(溢出)后才加载进去。这能防止波形出现毛刺或异常。
Trigger Output (TRGO) Parameters(触发输出参数)
Master/Slave Mode (M... Disable): 主/从模式不使用
Trigger Event Selection: 触发事件选择,当前软件产生更新事件(Update Generation)时发出触发信号。
选择为PWM 模式 1,当计数器 CNT < 比较值 CCR 时,输出有效电平;否则输出无效电平。
Pulse (16 bits value): 脉冲值 (CCR)为0,占空比 = Pulse / (Counter Period + 1) = 0 / 1000 = 0%。
Output compare preload: 输出比较预装载使能。使能后,修改 Pulse 值会在下一次更新事件生效,保证波形平滑过渡。
Fast Mode: 快速模式。
作用:主要用于单脉冲模式,加速响应外部触发。
CH Polarity: 通道极性。决定输出引脚的有效电平是高还是低,当前为高电平有效。
配置代码

函数原型:HAL_StatusTypeDef HAL_TIM_PWM_Start(TIM_HandleTypeDef *htim, uint32_t Channel);
作用:使能定时器并开启指定通道的 PWM 输出。
函数原型:#define __HAL_TIM_SET_COMPARE(HANDLE, CHANNEL, COMPARE)
作用:直接修改定时器的捕获/比较寄存器(CCR1)。
实验现象