STM32hal库学习(F1)-串口UART

发布时间:2024年01月24日

通信基础概念

串行/并行

串行540fe54a05ee4bf3be00611f0dfcfe34.png

并行

6c27903098814db99a512e82a510ae9a.png

串行并行的区别

特点

传输速率

抗干扰能力

通信距离

IO资源占用

成本

串行通信

较低

较强

较长

较少

较低

并行通信

较高

较弱

较短

较多

较高

单工/半双工/全双工

单工通信:数据只能沿一个方向传输

3c4e85241eb24fca81e5cba3cac165db.png

半双工通信:数据可以沿两个方向传输,但需要分时进行

2265a34aef2f44d18ae39e63ef082c88.png

全双工通信:数据可以同时进行双向传输

5f3eba57b3d84a2e9dc33bd571a3752d.png

同步/异步通信

同步通信:共用同一时钟信号

a427e088a824485e81aebb2a22b4cc7f.png

异步通信:没有时钟信号,通过在数据信号中加入起始位和停止位等一些同步信号

e433e860a570482397bd2958771cb6b1.png

波特率/比特率

比特率:每秒钟传送的比特数,单位bit/s

波特率:每秒钟传送的码元数,单位Baud

比特率 = 波特率 * log2 M ,M表示每个码元承载的信息量。

二进制波特率视为比特率也可

常用串行通信

通信接口

接口引脚

数据同步方式

数据传输方向

UART

(通用异步收发器)

TXD:发送端

RXD:接收端

GND:公共地

异步通信

全双工

1-wire

DQ:发送/接收端

异步通信

半双工

IIC

SCL:同步时钟

SDA:数据输入/输出端

同步通信

半双工

SPI

SCK:同步时钟

MISO:主机输入,从机输出

MOSI:主机输出,从机输入

CS:片选信号

同步通信

全双工

几种电平

RS-232? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?逻辑1:-15V ~ -3V? ? ? ? 逻辑0:+3V ~ +15V

COMS电平(3.3V)?????????????????逻辑1:3.3V ?????????????????逻辑0:0V

TTL电平(5V)?????????????????????????逻辑1:5V ????????????????????逻辑0:0V

RS232通信示意图

fde3e376565d4ef0a6daf730faac507f.png

USB串口通信

ce56968f911d419e854fae352bb6cf3f.png

RS-232异步通信协议

683839a7b21f436fa9f6d13ef261f7a3.png

启动位:必须占1个位长,保持逻辑0电平

有效数据位:可选5、6、7、8、9个位长,LSB最低有效位在前,MSB最高有效位在后

校验位:可选占1个位长,也可以没有该位

停止位:必须有,可选占0.5、1、1.5、2个位长,保持逻辑1电平

USART

F1/F4/F7 USART框图

483bc79b77e448ee9d12150f51e8ffa6.png

简化框图

b825c0e85d2c44f685b71a93dea6569a.png

设置UASRT波特率

fcdc49e3ef4041a89d77efe1a1cf1d63.png

波特率计算公式

064acd72bd2f47e688bd2c18ee76466c.png

其中Fck是串口时钟,USART1的时钟是PCLK2,其他串口都是PCLK1

波特比率寄存器BRR

8a00ef7c52904555bb20a9cfcea7ea26.png

用寄存器方法设置波特率

以波特率115200为例

a9e7146f7a474a90b58f4371bdcfc36d.png

寄存器代码

uint16_t mantissa; 
uint16_t fraction; 
mantissa=39; //整数部分
fraction=0.0625*16+0.5=0x01    //四舍五入减少误差

/* USARTDIV = DIV_Mantissa + (DIV_Fraction/16) */
USART1->BRR = (mantissa << 4) + fraction;

USART寄存器介绍

控制寄存器(CR1)

位13:使能USART

位12:配置8个数据位

位10:禁止检验控制

位5:使能接收缓冲区非空中断

位3:使能发送

位2:使能接收

控制寄存器(CR2)

配置1个停止位

a5967896fe3349f79866eea1bce1eda0.png

控制寄存器(CR3)

配置不选择半双工模式

9ee564867f214bf3ba42b05c0d990f6c.png

数据寄存器(DR)

设置好控制和波特率寄存器,往该寄存器写入数据即可发送,接受数据即可读该寄存器a831f94be72d403993098dabb993e24d.png

状态寄存器

通过TC位知道能否发数据

通过RXNE位知道是否收到数据

USART/UART异步通信配置步骤

94081a61260345cf8a7beceb4377cf83.png

函数介绍

HAL_UART_Init()

HAL_StatusTypeDef HAL_UART_Init(UART_HandleTypeDef *huart)
typedef struct 
{    uint32_t BaudRate; 		/* 波特率 */ 
     uint32_t WordLength; 	    /* 字长 */
     uint32_t StopBits; 		/* 停止位 */ 
     uint32_t Parity; 			/* 奇偶校验位 */ 
     uint32_t Mode; 			/* UART 模式 */ 
     uint32_t HwFlowCtl; 		/* 硬件流设置 */ 
     uint32_t OverSampling; 	/* 过采样设置 */ 
}UART_InitTypeDef

HAL_UART_Receive_IT()

//作用:以中断的方式接收指定字节的数据
//形参 1 是 UART_HandleTypeDef 结构体类型指针变量
//形参 2 是指向接收数据缓冲区
//形参 3 是要接收的数据大小,以字节为单位
HAL_StatusTypeDef HAL_UART_Receive_IT(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size)

                                                                                                           

HAL_UART_Transmit()

//作用:以阻塞的方式发送指定字节的数据
//形参 1 :UART_HandleTypeDef 结构体类型指针变量
//形参 2:指向要发送的数据地址
//形参 3:要发送的数据大小,以字节为单位
//形参 4:设置的超时时间,以ms单位
HAL_StatusTypeDef HAL_UART_Transmit(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size, uint32_t Timeout)

                                                                             

HAL回调

MSP回调

98b79b86e9f64ae1a6e6ccb23fd07f71.png

例子

57cb4237c3614c0a9eb245f512d3cf50.png

中断回调

498a8d1e7e2448fcbd9add9d471f2d3a.png

例子

6178aa6bb1014976b5200319d1226b1e.png

引脚复用

复用映射图

8d452cbd9bc045f2be192e10b6ff62de.png

GPIO 复用功能低位寄存器(AFRL)

6a831ac5b3fd4f7c8669420122304fe4.png

3db1920517fc414a8daf20e0bba314fd.png

GPIO 复用功能高位寄存器(AFRH)

27cbb9a7ad664ebb8eb558bbd7aa715e.png

该文章参考正点原子资料,请勿商用

有错误地方请大家指点

文章来源:https://blog.csdn.net/ymcdd_ZJU/article/details/135767960
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。