串口通信基本原理
通信接口背景知识
并行通信
-传输原理:数据各个位同时传输。
-优点:速度快
-缺点:占用引脚资源多
串行通信
-传输原理:数据按位顺序传输。
优点:占用引脚资源少-缺
点:速度相对较慢
串行通信:
按照数据传送方向,分为:
单工:(a)
数据传输只支持数据在一个方向上传输
半双工:(b)
允许数据在两个方向上传输,但是,在某一时刻,只允许数据在一个方向上传输,它实际上是一种切换方向的单工通信
全双工:(c)
允许数据同时在两个方向上传输,因此,全双工通信是两个单工通信方式的结合,它要求发送设备和接收设备都有独立的接收和发送能力。
![](https://i-blog.csdnimg.cn/blog_migrate/3509af7affbf453c83683c5cd52701b9.png)
串行通信的通信方式:
同步通信:带时钟同步信号传输。
-SPI,IIC通信接口
异步通信:不带时钟同步信号。
-UART(通用异步收发器),单总线
(双方事先必须约定好波特率(传输速度))
常见的串行通信接口:
![](https://i-blog.csdnimg.cn/blog_migrate/450630bc15d5880ca76ce3a8bf88ae06.png)
STM32串口通信基础
STM32的串口通信接口:
UART:通用异步收发器
USART:通用异步同步收发器
大容量STM32F10x系列芯片,包含3个USART和2个UART
UART异步通信方式引脚连接方法:
RXD:数据输入引脚。数据接受。
TXD:数据发送引脚。数据发送。
串口号 | RXD | TXD |
1 | PA10 | PA9 |
2 | PA3 | PA2 |
3 | PB11 | PB10 |
4 | PC11 | PC10 |
5 | PD2 | PC12 |
UART异步通信方式特点
全双工异步通信。
分数波特率发生器系统,提供精确的波特率。
-发送和接受共用的可编程波特率,最高可达4.5Mbits/s
可编程的数据字长度(8位或者9位);
可配置的停止位(支持1或者2位停止位);
可配置的使用DMA多缓冲器通信。
单独的发送器和接收器使能位。
检测标志:① 接受缓冲器 ②发送缓冲器空 ③传输结束标志
多个带标志的中断源。触发中断。
其他:校验控制,四个错误检测标志。
STM32串口异步通信需要定义的参数
① 起始位
② 数据位(8位或者9位)
③ 奇偶校验位(第9位)——提高数据传输的准确率
④ 停止位(1,15,2位)
⑤ 波特率设置
STM32 USART框图
![](https://i-blog.csdnimg.cn/blog_migrate/3ad9e1e94edda0d10ef65960aba5cddb.png)
STM32串口寄存器库函数配置方法
常用的串口相关寄存器
USART_SR状态寄存器
USART_DR数据寄存器
USART_BRR波特率寄存器
串口操作相关库函数(省略入口参数):
void
USART_Init
();
//
串口初始化:波特率,数据字长,奇偶校验,硬件流控以及收发使能
void
USART_Cmd
();//
使能串口
void
USART_ITConfig
();//
使能相关中断
void
USART_SendData
();//
发送数据到串口,
DR
uint16_t
USART_ReceiveData
();//
接受数据,从
DR
读取接受到的数据
FlagStatus
USART_GetFlagStatus
();//
获取状态标志位
void
USART_ClearFlag
();//
清除状态标志位
ITStatus
USART_GetITStatus
();//
获取中断状态标志位
void
USART_ClearITPendingBit
();//
清除中断状态标志位
串口配置的一般步骤
①
串口时钟使能,
GPIO
时钟使能
:
RCC_APB2PeriphClockCmd();
②
串口复位
:
USART_DeInit
();
这一步不是必须的
③
GPIO
端口模式设置
:
GPIO_Init
();
模式设置为
GPIO_Mode_AF_PP(具体需要查表)
④
串口参数初始化
:
USART_Init
();
⑤
开启中断并且初始化
NVIC
(如果需要开启中断才需要这个步
NVIC_Init
();
USART_ITConfig
();
⑥使能串口
:
USART_Cmd
();
⑦编写中断处理函数
:
USARTx_IRQHandler
()
⑧串口数据收发:
void
USART_SendData
();//
发送数据到串口,
DR
uint16_t
USART_ReceiveData
();//
接受数据,从
DR
读取接受到的数据
⑨串口传输状态获取:
FlagStatus
USART_GetFlagStatus
(
USART_TypeDef
*
USARTx
, uint16_t USART_FLAG);
void USART_ClearITPendingBit
(
USART_TypeDef
*
USARTx
, uint16_t USART_IT);
实战训练:
main.c:
![](https://i-blog.csdnimg.cn/blog_migrate/9d81c446fd8cbc4acea1f9f17e46d250.png)
![](https://i-blog.csdnimg.cn/blog_migrate/8f39d67b5cc06eeda22adefef4bdb9ce.png)
这里用串口调试助手可以知道代码运行成功了!
参考文献:
【正点原子】精英STM32F103开发板资料