一、时钟控制器

时钟源

STM32F407共有4个时钟源,分别是HSE、HSI、LSE、LSI.

HSE:外部高速时钟  HSI:内部高速时钟  LSE:外部低速时钟  LSI:内部低速时钟

HSI:HSI时钟信号由内部16 MHz RC振荡器生成,可直接用作系统时钟,或者用作PLL输入。

HSE:可以支持两种时钟源,由有源晶振或者是无源晶振提供,频率范围4~26MHz.

LSI:可作为低功耗时钟源在停机和待机模式下保持运行,供独立看门狗(IWDG)和RTC使用。时钟频率为32kHz。

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

系统时钟

PPL时钟:PLL基于HSI或HSE输入的时钟频率进行倍频,从而得到系统时钟SYSCLK。使用PLLM、PLLP、PLLQ可编程分频因子以及PLLN倍频因子,可调整PLLCLK输出的时钟频率。

SYSCLK时钟:可以通过System Clock Mux选择器来选择输入的源时钟,有HSI、HSE、PLLCLK三种输入源。

HCLK时钟:将SYSCLK时钟经过AHB Prescaler分频器分频后就得到了HCLK时钟,HCLK时钟为AHB总线提供的时钟信号,最大频率168MHz主要用于高速外设,可以为DMA、Cortex System Timer、FCLK、APB1、APB2提供时钟输入。

外设时钟

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

RTC时钟:RTC时钟输入源可以由LSE、LSI或者HSE经过分频后提供,IWDG(独
立看门狗)输入时钟相对简单只有LSI时钟。

RTC Clock Mux选择器可以选择由LSE、LSI时钟直接为RTC提供输入
时钟,还是由HSE经过分频后作为RTC的输入时钟。

二、UART控制器

串口通讯是一种通过串行(一位接着一位地)传输数据的通信方式。串口硬件连接非常简单,只需要Tx、Rx和GND 3条线,接线时两个设备的Tx与Rx要交叉连接,GND可以直接连接。

串口的波特率表示在1秒钟内,两个串口设备之间能传输多少个码元,在串口通信中,波特率等于比特率。串口通讯中常用的波特率有2400、4800、9600、115200。

数据帧:一帧完整的串口数据帧由开始位、传输数据、校验位和停止位组成。开始位是以低电平开始,停止位总是以高电平结束。常用8位数据位模式是进行数据收发,9位数据位是为了使用校验位。校验位分为奇校验和偶校验,就是保证一帧数据中的高电平的数量是奇数个还是偶数个。如果使用了校验位,那么校验位将占用数据位中的一位去使用。帧格式中停止位除了1位停止位,还可以配置为0.5位1.5位或2位停止位。

串口发送流程:将串口数据写入内存,程序将内存的数据填入串口控制器的TDR寄存器,TDR寄存器中的数据自动传入发送移位寄存器,由移位寄存器将数据从TX引脚发出去。

串口接收流程:当RX引脚上有数据时,会依次流入到接收移位寄存器,接收完后会将数据写入到RDR寄存器,程序读取RDR寄存器的数据写入内存中使用。

MODBUS协议

Modbus是一种基于串行通信的通信协议,旨在为工业现场提供一种通用的通信标准,以实现不同设备之间的数据交换和控制。
一帧modbus协议包含地址域、功能码、数据和差错校验(crc)四部分。

Modbus通讯流程

在modbus通讯中两个设备间使用应答机制实现数据交互。当设备需要获取数据时需先发出请求,当传感器收到请求后将单片机请求的数据发送给单片机。

常用功能码

01 (0x01):读取线圈状态

02 (0x02):读取离散输入

03(0x03):读取保持寄存器

04(0x04):读取的输入寄存器

05(0x05):写单个线圈

06(0x06):写单个寄存器

用Modbus协议控制LED灯

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

配置代码

定义本设备的 Modbus 从机地址为 0x01。以及定义串口 DMA 接收缓冲区大小为 64 字节

rx_buf:为DMA 接收缓冲区。串口每收到一个字节,DMA 硬件自动把它搬进这块内存,无需 CPU 干预。

rx_len:记录本次空闲中断时 DMA 实际收到的字节数

rx_flag:接收完成标志位

三、STM32 DMA控制器

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

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

DMA的仲裁器

DMA中的仲裁器是一个用于管理多个DMA通道之间竞争访问系统总线的组件。仲裁器的任务就是协调这些通道的访问。

软件优先级:每个通道的优先权可以在DMA_CCRX寄存器中设置,分为4个等级,最高优先级,高优先级,中等优先级,低优先级

硬件优先级:如果2个请求有相同的软件优先级,则较低编号的通道比较高编号的通道有较高的优先权。

DMA的传输模式

数据传输方向使用DMA_SXCR寄存器中的DIR位进行配置,有三种可能的传输方向:存储器到外设,外设到存储器,存储器到存储器。

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串口收发实验

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

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

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

生成配置代码并编写代码

实现效果


四、STM32 ADC控制器

ADC,即模/数转换器,是一种将模拟信号转换为数字信号的电子元件

ADC将模拟信号转换为数字量一般都需要经过三个步骤:采样,量化,编码。

ADC的分辨率和参考电压

分辨率:量化间隔越小,把规定范围的电压分成的份数就越多,这就代表它的分辨率越高,分辨率也就是系统能够测量的最小电压。常见的ADC分辨率一般有8位、10位、12位等等。

参考电压:要想得到量化的间隔,就需要两个参数,一个就是分辨率,确定划分的份数,另一个就是一个基准电压,STM32的ADC控制器,其参考电压一般是3.3V

ADC转换序列
当需要转换多个通道时,需要定义转换的顺序和长度。长度是需要转换的通道个数;顺序:指的是想要以什么样的顺序转换需要转换的通道。ADC提供了两种序列:规则序列,注入序列

规则序列:
定义:主要的转换序列,类似于“日常工作”

长度:最大长度16

顺序:通过ADC_SQRX寄存器设置通道在修序列中的位置(SQ1,SQ2...SQ16)

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

定义:一种“插入式”的转换序列,具有更高的优先级,类似于“突发事件处理”。

长度:最大长度位4(由ADC_JSQR.JL位设置)

优先级:注入序列可以打断规则序列的转换。转换完成后,规则序列会从被打断的地方恢复。

自动注入模式:如果使能 (ADC_CR1.JAUTO),注入序列会在规则序列转换完成后自动触发,无需外部触发。
 

ADC 的工作模式

ADC 的工作模式由 单次/连续 和 扫描/非扫描 两个维度组合而成

如果关闭扫描模式 (ADC_CR1.SCAN = 0),即使序列长度设置大于 1,ADC 也只会转换序列中的第一个通道。

ADC 的状态寄存器

用于查询 ADC 的当前工作状态或判断转换是否完成。

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光照采集实验

开启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,从外设到存储器,循环模式,外设地址不变,存储器地址自增,半个字节地般运

参数配置完成生成代码

定义一个数组让DMA搬运。以及设置一个标志位

将标志位置为1,停止DMA的搬运,然后是printf的重定向

实验实现的效果

高于3000光照强度LED就亮,低于3000光照强度就灭。

五、STM32 TIM控制器

1.定时器的基本原理

使用精准的时基、通过硬件的方式,实现定时功能。定时器的核心就是计数器。

STM32定时器又分为基本定时器,通用定时器和高级定时器,它们有不同的功能,适用于不同的应用场景。

1.基本定时器:

特点:只有计数功能,没有输入捕获和输出比较功能,结构简单,常用于基础时间基准的生成。

应用场景:实现简单的定时,提供DAC的转换触发信号。

2.通用定时器:

特点:功能较为灵活,支持输入捕获,输出比较,PWM等功能,既可以用作普通的时间计时器,也可以处理外部信号。

应用场景:外部信号捕获,PWM信号生成(电机控制,屏幕背光控制等)

3.高级定时器

特点:功能最为强大,处了通用定时器的所有功能外,还支持专门的功能(如死区时间控制和刹车机制),专为复杂控制认为设计,如电机控制。

应用场景:专用于电机控制,复杂的功率信号生成,尤其是需要安全机制(刹车)和高精度PWM的应用。


基本定时器

1.时钟源:基本定时器(TIM6和TIM7 )的时钟源来源于APB1总线时钟

2.预分频器:负责对定时器输入时钟进行分频,它的主要作用是通过降低定时器的输入时钟频率,为定时器的计时和定时功能提供更灵活的时间控制。

3.计数器:计数器通过对输入时钟(由预分频器分频后的时钟信号),记录经过的时间。计数器的计数模式有三种,递增计数、递减计数、中央对齐计数,但是,基本定时器仅支持递增模式。

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使用系统内部时钟作为计数基准。
 
PWM的频率为:Freq = CK_PSC/(PSC+1)/(ARR+1)

Freq = 64x10*6/(63+1)/(999+1) =1000

PWM的占空比:Duty = CCR/(ARR+1)   

Duty = CCR/(999+1)

auto-reload preload: 自动重装载预装载使能,这是一个保护机制。当修改周期值时,新数值不会立即生效,而是等到当前这个周期跑完(溢出)后才加载进去。这能防止波形出现毛刺或异常。

配置代码为

Logo

智能硬件社区聚焦AI智能硬件技术生态,汇聚嵌入式AI、物联网硬件开发者,打造交流分享平台,同步全国赛事资讯、开展 OPC 核心人才招募,助力技术落地与开发者成长。

更多推荐