一、串行通信的基本概念
1、串行通信的基本概念
1.1、同步通信和异步通信
- 通信,最少要有两个对象,一个收,一个发。根据数据通信是否同步,可分为同步通信和异步通信
- 同步通信:
一般情况下同步通信指的是通信双方根据同步信号进行通信的方式。比如通信双方有一个共同的时钟信号,通讯中通常双方会统一规定在时钟信号的上升沿或
下降沿对数据线进行采样。
- 异步通信:是指数据传输速度匹配依赖于通信双方有自己独立的系统时钟,大家约定好通信的速度。异步通信不需要同步信号,但是并不是说通信的过程不同布
1.2、串行通信和并行通信的区别
- 串行通信:指的是同一时刻只能收或发一个bit位信息。因此只用1根信号线即可。
- 并行通信:指的是同一时刻可以收或发多个bit位的信息,因此需要多根信号线才行
-串行传输:数据按位顺序传输。
-优点:占用引脚资源少
-缺点:速度相对较慢
-并行传输:数据各个位同时传输。
-优点:速度快
-缺点:占用引脚资源多
1.3、单工、半双工、全双工
- 单工:要么收,要么发,只能做接收设备或者发送设备。比如收音机
- 半双工:可以收,可以发,但是不能同时收发, 比如对讲机
- 全双工:可以在同一时刻既接收,又发送。 手机
1.4、常见通信总结
2、STM32 的 USART 简介
-
USART: Universal Synchronous Asynchronous Receiver and
Transmitter的缩写,即通用同步异步收发器可以灵活地与外部设备进行全双工数据交换。 -
UART 外设(Universal Asynchronous Receiver and Transmitter),它是在
USART基础上裁剪掉了同步通信功能,只有异步通信。简单区分同步和异步就是看通信时需不需要对外提供时钟输出,我们平时用的串口通信基本都是
UART。USART 在 STM32应用最多莫过于“打印”程序信息,一般在硬件设计时都会预留一个 USART通信接口连接电脑,用于在调试程序是可以把一些调试信息“打印”在电脑端的串口调试助手工具上,从而了解程序运行是否正确、指出运行出错位置等等。
2.1、STM32 的 USART 简介
STM32F407有四个 USART 和两个 UART,其中 USART1和 USART6 的时钟来源于 APB2 总线时钟,其最大频率为 84MHz,其他四个的时钟来源于 APB1总线时钟,其最大频率为 42MHz。
2.2、串口电路连接
3、串口通信协议介绍
波特率
-
在串行通信中,用“波特率”来描述数据的传输速率。所谓波特率,既每秒传送的二进制位数,其单位为bps(bits per
second)。它是衡量串行数据速度快慢的重要指标。 -
国际上规定一个标准的波特率系列:
110、300、600、1200、1800、2400、4800、9600、115200、14.4Kbps、19.2Kbps、……
例如:115200bps、指每秒传送115200位。通信双方必须设置同样的同学速率才能正常通信 -
注意:实际的数据没这么多,还包括起始位,结束位,校验位
二、串口寄存器介绍
- 控制寄存器——USART_CR
- 波特率寄存器——USART_BRR
- 状态寄存器——USART_SR
- 数据寄存器——USART_DR
1、串口数据的发送和接收
发送数据,首先判断TDR是否为空,为空把数据给TDR,TDR再给移位寄存器,由其发出
2、串口寄存器-USART_CR1
3、串口寄存器-USART_CR2
4、串口寄存器-USART_BRR
fPLCK 为 USART 时钟OVER8为 USART_CR1 寄存器的 OVER8位对应的值,USARTDIV 是一个存放在波特率寄存器(USART_BRR)的一个无符号定点数。其中 DIV_Mantissa[11:0]位定义 USARTDIV 的整数部分,DIV_Fraction[3:0]位定义
5、串口寄存器-USART_SR
- 位 7 TXE:发送数据寄存器为空 (Transmit data register empty)
0:数据未传输到移位寄存器
1:数据传输到移位寄存器 - 位 6 TC:发送完成 (Transmission complete)
0:传送未完成
1:传送已完成 - 位 5 RXNE:读取数据寄存器不为空 (Read data register not empty)
0:未接收到数据
1:已准备好读取接收到的数据
6、串口寄存器-USART_DR
三、STM32实现串口数据的收发
通过寄存器操作
1、串口硬件原理图
2、配置串口
2.1、功能配置
配置为异步通信
2.2、协议配置
3、功能代码
四、HAL串口库函数的使用及printf的实现
1、HAL串口库函数
Stm32f0xx_hal_uart.c 文件中
串口的发送函数
HAL_UART_Transmit(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size, uint32_t Timeout)
串口的接收函数
HAL_UART_Receive(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size, uint32_t Timeout)
2、printf的实现
printf函数调用的是c库中的fputc函数。因此我们如果重新写了fputc函数,就可以改变printf函数的功能,可以向串口打印输出。