STM32基础知识
GPIO是General Purpose Input/Output的缩写,意为通用输入/输出。在嵌入式系统中,GPIO是一种用于与外部设备进行数字信号交互的接口。它可以通过设置为输入或输出模式来读取或控制外部设备的状态。输入:GPIO可以接收来自传感器、开关或其他外部设备的信号,以便嵌入式系统可以根据这些信号做出相应的决策或执行特定的操作。输出:GPIO可以向外部设备发送数字信号,例如控制LED的
STM32基础知识
一、时钟树
I.基础知识
1.时钟&时钟树
-
时钟在数字电路和计算机系统中是一种周期性的信号,用于同步和协调系统中各个部分的操作。时钟信号在单片机中是非常重要的,它指导着各个组件的工作,确保它们在正确的时间执行相应的任务。时钟信号通常是一个方波信号,具有固定的周期和占空比。
-
时钟树是指在数字系统或芯片中,将一个主时钟信号分配和扩展到整个系统中各个模块和部分的一种层次结构。时钟树的目的是确保系统中所有的时钟域都能够按照规定的时序要求同步运行。
- 时钟树通常包括以下几点元素
- 主时钟源(Clock Source): 时钟树的起点通常是一个主时钟源,这可以是外部晶振、振荡器或其他时钟源。
- 时钟分频器(Clock Divider): 时钟分频器用于将主时钟信号分频,以产生其他模块或部分所需的时钟频率。–使得不同部分以不同的速率工作
- 时钟缓冲器(Clock Buffer): 时钟缓冲器用于放大和驱动时钟信号,确保时钟信号能够准确地传播到系统中的各个部分。
- 时钟分配网络(Clock Distribution Network): 时钟分配网络将时钟信号传送到系统中的各个模块。这通常包括时钟线路、时钟树分支等。
- 时钟树通常包括以下几点元素
II.认识时钟树

- H、L、S、I、E代表了一些常见的缩写,通常与单片机或者数字电路中的时钟、速度和内外部资源有关。
- H(high):表示高电平或高状态。在数字电路中,可能指的是高电压或逻辑高。
- L(low):表示低电平或低状态。在数字电路中,可能指的是低电压或逻辑低。
- S(speed):表示速度。在数字电路或通信领域中,S通常用于表示速度、传输速率或时钟频率。
- I(internal):表示内部。在数字电路中,I可能用于表示内部时钟源、内部资源等。
- E(external):表示外部。在数字电路中,E可能用于表示外部时钟源、外部资源等。
1.分频器&倍频系数
- 分频器(Divider):
- 定义: 分频器用于将输入时钟信号分频,即减小其频率。
- 作用: 分频器通常用于将高频时钟信号分频为较低的频率,以供给某些模块或外设使用。
- 公式: 分频后的频率可以通过原始频率除以分频系数得到,即新频率 = 原始频率 / 分频系数。
- 相关概念
- 分频系数(Divider Ratio):
- 分频系数是用于调整输入时钟频率的比例。它是分频器的一个参数,用于控制输出频率。
- 输出频率=输入频率/N
- 分频器的应用:
- 分频器常用于微控制器、数字信号处理器(DSP)、时钟生成器、通信系统等领域。
- 在微控制器中,分频器用于为外设提供适当的时钟频率。
- 在通信系统中,分频器可用于调整射频信号的频率。
- 分频系数(Divider Ratio):
- 倍频系数(Multiplier):
- 定义: 倍频系数用于将输入时钟信号倍频,即增加其频率。
- 作用: 倍频系数通常用于提高时钟信号的频率,以满足系统对更高时钟频率的需求。
- 公式: 倍频后的频率可以通过原始频率乘以倍频系数得到,即新频率 = 原始频率 * 倍频系数。
2.锁相环(PLL)
- 锁相环(Phase-Locked Loop,PLL)是一种控制系统,用于调整输出信号的频率和相位,使其与输入信号保持特定的关系。
- 常用的表达式是
F 输出 = F 输入 × M × N P F_{输出}=\frac{F_{输入}\times M \times N}{P} F输出=PF输入×M×N
意义:通过调整M、N和P的值,可以控制输出频率F
- F:表示信号的频率。
- M:表示输入信号的参考倍频系数(Multiplier)
- N:表示反馈倍频系数
- P:表示分频系数(Divider)
二、GPIO
I.定义和组成
-
GPIO是General Purpose Input/Output的缩写,意为通用输入/输出。在嵌入式系统中,GPIO是一种用于与外部设备进行数字信号交互的接口。它可以通过设置为输入或输出模式来读取或控制外部设备的状态。
-
输入:GPIO可以接收来自传感器、开关或其他外部设备的信号,以便嵌入式系统可以根据这些信号做出相应的决策或执行特定的操作。
-
输出:GPIO可以向外部设备发送数字信号,例如控制LED的亮灭、驱动电机运转等。通过改变输出信号的状态,嵌入式系统可以与外部设备进行交互。
-
引脚:GPIO接口通常由一组引脚组成,每个引脚都可以用作输入或输出。每个引脚都有一个唯一的标识符,如GPIO0、GPIO1等。
-
状态和电平:GPIO引脚的状态表示当前引脚的输入或输出电平。高电平通常表示逻辑1,低电平表示逻辑0。在某些系统中,还可以使用其他状态,如浮空、上拉和下拉等。
-
控制寄存器:为了配置和控制GPIO引脚的功能,通常需要通过写入特定的控制寄存器来设置引脚的模式、状态和电平。这些寄存器的具体配置取决于所使用的硬件平台和操作系统。
-
II.使用与结构
- 在使用GPIO时,通常需要设置引脚的工作模式(输入或输出)、电平状态(高电平或低电平)以及其他相关参数。这些设置可以通过编程来实现,以便嵌入式系统能够正确地读取或控制外部设备。
- GPIO结构图

- GPIO特点
- 不同型号的芯片,IO数量可能不同
- IO口每次翻转需要2个时钟周期
- 每个IO口都可以作为中断
- 支持8种工作模式
三、I2C通信
I.说明
- I2C为半双工通信(一种通信类型):允许双向通信,但是同一时刻只能一端发送,无法两端同时进行
- 采用一主多从的形式,(也有多主多从情况,这种情况下总线上任何一个模块都可以主动跳出来当老大)
II.通信结构

- SCL提供时钟信号,用于同步数据的发送和接收。时钟信号仅由主设备生成。因此,I2C与串口不同,为同步通信(即由主机通过SCL发送固定频率的脉冲信号)
- SDA负责传输数据。数据以串行方式在主设备和从设备之间传输,每次传输一个比特。并且基本上配置为开漏输出
- GND:电压其实是描述电势的变化量的物理量,如果不连接GND会导致各个设备有不同的基准,导致数 据传输错误

III.开漏输出
- 正如前文所述,I2C采用开漏输出,接下来解释why
- 虽然主机在SCL线拥有绝对控制权可以使用推挽输出,但是SDA在输入输出中反复切换,如果因为差错导致了主机从机同时输出,且一个高电平一个低电平,那么就会导致电源短路,故禁止所有设备输出强上 拉高电平,采用外置弱上拉电阻加开漏输出的电路结构。
- SDA和 SCL 可以被拉低为低电平,但是不能被驱动为高电平,所以每条线上都要使用一个上拉电阻,默认情况下将其保持在高电平。
- 只要有任意一个设备输出低电平,总线为低电平,只 有所有设备设备都输出高电平,总线才属于高电平,同时它避免了引脚模式频繁切换,开漏模式下输出 高电平就相当于断开,故无需切换为输入模式,直接输出高电平即可
IV.时序
1.起始与终止条件
- 起始条件:SCL高电平期间,SDA从高到低
- 终止条件:SCL高电平期间,SDA从低到高
- SCL 高电平期间是数据采样的时间点

(SCL和SDA均为高的时候,为空闲状态)
2.发送与接收一个字节
<1>发送
- SCL低电平期间,主机将数据位依次放到SDA线上(高位先行),然后释放SCL,从机将在SCL高电平期 间读取数据位,所以SCL高电平期间SDA不允许有数据变化,依次循环上述过程8次,即可发送一个字节

<2>接收
-
SCL低电平期间,从机将数据位依次放到SDA线上(高位先行),然后释放SCL,主机将在SCL高电平期 间读取数据位,所以SCL高电平期间SDA不允许有数据变化,依次循环上述过程8次,即可接收一个字节
-
主机在接收之前,需要释放SDA(其实就相当于切换为输入模式),因为任何一个设备拉低了,总线就是低电平;如若主机接收之前不释放SDA,则总线始终是低电平

<3>应答
- 发送应答:主机在接收完一个字节之后,在下一个时钟发送一位数据,数据0表示应答,数据1表示非应答
- 接收应答:主机在发送完一个字节之后,在下一个时钟接收一位数据,判断从机是否应答,数据0表示应答, 数据1表示非应答(主机在接收之前,需要释放SDA)
v.访问设备的确定
-
主机在起始条件之后,会发送一个字节,此字节就是想要联系的设备的地址(所有从机都会收到第一个字节,与自己的地址进行比较,故I2C总线里面,挂载的每个设备地址必须不一样)
-
每个I2C设备出场 时厂商一般都会为他分配一个七位地址(如MPU6050的地址为1101000),如果有相同型号芯片挂载在 同一条总线怎么办?
- 运用地址中的可变部分,一般情况下,器件地址的最后几位是可以在电路中改变的(比如MPU6050地址 最后一位可由板子上引脚AD0决定,接低电平为1101000,接高电平为1101001),关于地址,前几个 位由厂商决定,后几位一般由引脚决定。
1.指定地址写
-
对于指定设备(Slave Address),在指定地址(Reg Address)下,写入指定数据(Data)

-
首先产生起始条件,之后紧跟着的时序必须是发送一个字节的时序(找到从机),字节内容必须是从机地址+读写位,读写位即确定是要发送还是要读出,0为写入,1为读出;
-
之后从机返回应答–此时其实主机释放了SDA,但被从机控制保持了低电位。后面的上升沿便是从机释放SDA产生的,即交出了SDA控制权。
-
之后发送了寄存器地址(从机设备是可以自己定义第二个字节之后的用途的,第二个字节可以是从机的寄存器地址或者从机的存储器地址等)
-
再然后就发送了我们想要发送的内容了,不想继续输入,则产生停止信号即可
2.当前地址读
- 对于指定设备(Slave Address),在当前地址指针指示的地址下,读取从机数据(Data)

- 第一个字节读写位为1,表示读取,之后由从机进行SDA的控制。但读取的是哪个寄存器的数据应该如何 判断?
- 在当前地址读中主机无法决定自己读取的寄存器,在从机中所有的寄存器被分配到一个线性区域中(连续),并且会有一个单独的指针变量指示着其中一个寄存器(该指针默认一般指向0地址,即它的固定起始状态),并且每写入/读出一个字节后,该指针自动自增一次指向下一个字节。故未指定地址时,从机返回当前指针指向的寄存器的值
3.指定地址读
- 对于指定设备(Slave Address),在指定地址(Reg Address)下,读取从机数据(Data)

- 前半部分为指定地址写,后半部分为当前地址读(此类为复合格式)
- Sr意为重复起始条件,相当于另起一个时序,因为指定读写标志位只能是跟着起始条件后的第一个字节,之后如同当前地址读一样操作即可(前半部分没有进行写入/读出一个字节,故指针没有变化)
- 或者,你也可以在Sr之前加一个停止条件,这样就是完整的两个时序
4.读、写多个字节
- 指定地址写:最后一部分多重复几次即可,此时存储的数据地址是连续的
- 当前地址读/指定地址读:最后一部分多重复几次即可,连续读出一片区域的寄存器
- 注意:仅读一个字节就停止的话,一定要让主机发送非应答,让从机释放SDA,同理,多个字节读的话 在最后一个字节发送非应答即可
四、串口通讯
I.串口
1.串行通信
- 工作方式: 在串行通信中,数据位按照顺序依次传输,也就是说,每一位数据都依次发送或接收。
- 优点: 相对简单,不容易出现数据冲突。由于只有一个通信通道,线路的布线较为简单。是点对点的通信模式
- 缺点: 速度相对较慢,因为每次只能传输一个位。不适合大量数据的快速传输。
- 典型应用:USB,UART,光纤通信。
2.硬件电路
- 简单双向串口通信有两根通信线(发送端TX和接收端RX)
- TX与RX要交叉连接
- 当只需单向的数据传输时,可以只接一根通信线
- 当电平标准不一致时,需要加电平转换芯片

3.电平标准
-
电平标准是数据1和数据0的表达方式,是传输线缆中人为规定的电压与数据的对应关系,串口常用的电平标准有如下三种:
-
TTL电平:+3.3V或+5V表示1,0V表示0
- 线路对地是3.3或5就发了逻辑1,线路对地是0就发送逻辑0
-
RS232电平:-3-15V表示1,+3+15V表示0
-
RS485电平:两线压差+2+6V表示1,-2-6V表示0(差分信号)–抗干扰能力强
-
4.串口参数及时序
-
波特率:串口通信的速率
-
起始位:标志一个数据帧的开始,固定为低电平
-
数据位:数据帧的有效载荷,1为高电平,0为低电平,低位先行
-
校验位:用于数据验证,根据数据位计算得来,如右下图所示
-
停止位:用于数据帧间隔,固定为高电平
-
空闲状态:高电平


II.USART
-
USART(Universal Synchronous/Asynchronous Receiver/Transmitter)通用同步/异步收发器
-
USART是STM32内部集成的硬件外设,可根据数据寄存器的一个字节数据自动生成数据帧时序,从TX引脚发送出去,也可自动接收RX引脚的数据帧时序,拼接为一个字节数据,存放在数据寄存器里
-
自带波特率发生器,最高达4.5Mbits/s
-
可配置数据位长度(8/9)、停止位长度(0.5/1/1.5/2)
-
可选校验位(无校验/奇校验/偶校验)
-
支持同步模式、硬件流控制、DMA、智能卡、IrDA、LIN

(USART结构)
###如有侵权,联系立删
更多推荐



所有评论(0)