文章目录
USART串口通信
USART
(Universal Synchronous/Asynchronous Receiver/Transmitter
,通用同步/异步收发器)是一种用于串行通信的硬件模块,它支持同步(需要SCL时钟线)和异步两种通信模式
Ⅰ、硬件电路
TX
为发送端,RX
为接收端- 若是设备之间的电平标准不一致时,则需要加上电平转换芯片
Ⅱ、常见的电平标准
- TTL电平:
- 供电范围在0~5V
- 输出:
- 高电平1:
大于2.7V
- 低电平0:
小于0.5V
- 输入:
- 高电平1:
大于2.0V
- 低电平0:
小于0.8V
- TTL电平输入脚悬空时内部认为是高电平,且TTL电平输出不能驱动CMOS电平输入
- CMOS电平:
- 供电范围在3~15V
- 输出:
- 高电平1:
大于4.6V
- 低电平0:
小于0.05V
- 输入:
- 高电平1:
大于3.5V
- 低电平0:
小于1.5V
- LVTTL电平:
- 是TTL的一种低功耗变种,供电电压通常小于等于3.3V
- 输出:
- 高电平1:
大于2.4V
- 低电平0:
小于0.4V
- 输入:
- 高电平1:
大于2.0V
- 低电平0:
小于0.8V
- RS232电平:
- 输出:
-5~-15V
输出1+5~+15V
输出0- 输入:
-3~-15V
输入1+3~+15V
输入0- LVDS电平:
- 低电压差分信号,驱动器由驱动差分线对的电流源组成,电流通常为3.5mA
- 接收器具有很高的输入阻抗,输入端允许信号上携带的直流偏置电平范围为0.227~2.173V
- RS485电平:
- 采用差分传输方式,输出A、B之间的电压差:高电平:
+2~+6V
,低电平:-2~-6V
- STM32使用的是TTL电平
Ⅲ、串口参数及时序
- 波特率(Baud Rate):
- 波特率是串口通信中每秒传输的符号数,通常以bps(位/秒)为单位
- 波特率必须在通信双方之间匹配,否则会导致数据传输错误
- 数据位(Data Bits):
- 数据位是指每个字符中用于传输实际数据的位数
- 常见的数据位设置有8位
- 停止位(Stop Bits):
- 停止位是在每个字符传输结束后,用于标识字符结束的位数
- 可以是1位、1.5位或2位停止位
- 奇偶校验(Parity):
- 奇偶校验是一种错误检测机制,通过在数据位后面添加一个校验位来实现
- 可以设置为无校验(None)、奇校验(Odd)、偶校验(Even)或标记/空格校验(Mark/Space)
波特率:串口通信的速率
起始位:标志一个数据帧的开始,固定为低电平
数据位:数据帧的有效载荷,1为高电平,0为低电平,低位先行
校验位:用于数据验证,根据数据位计算得来
停止位:用于数据帧间隔,固定为高电平
- 一个数据帧10位
- 起始位:1bit
- 数据位:8bit(1byte)
- 停止位:1bit
- 一个数据帧11位
- 起始位:1bit
- 数据位:8bit
- 校验位:1bit
- 停止位:1bit
- 实测串口时序
Ⅳ、STM32的USART简介
USART是STM32内部集成的硬件外设,可根据数据寄存器的一个字节数据自动生成数据帧时序,从TX引脚发送出去,也可自动接收RX引脚的数据帧时序,拼接为一个字节数据,存放在数据寄存器里
自带波特率发生器,最高达4.5Mbits/s(可据此配置通讯的波特率)
可配置数据位长度(无校验位8bit,有校验位9bit)、停止位长度(0.5/1/1.5/2 确定了帧的间隔)
可选校验位(无校验/奇校验/偶校验)
支持同步模式(有时钟CLK输出)、硬件流控制(可控的发送和接收数据)、DMA(串口支持DMA转运数据)、智能卡、IrDA、LIN
STM32F103C8T6 USART资源: USART1(挂载在上APB2总线上)、 USART(APB1)、 USART3(APB1)
- 流控:
nCTS
: 清除发送,若是高电平,在当前数据传输结束时阻断下一次的数据发送(判断对方是否准备好接收数据)nRTS
: 发送请求,若是低电平,表明USART准备好接收数据(告诉对方自己是否准备好接收数据)
TXE
和RXNE
是判断发送状态和接收状态的重要标志位
TDR
与RDR
都是通过DR
寄存器来实现其功能
数据帧
起始位侦测
数据采样
- 进行三次数据采样,增加容错
- 采样时钟是波特率的16倍
波特率发生器
发送器和接收器的波特率由波特率寄存器BRR里的DIV确定
计算公式:
波特率 = f P C L K 2 / 1 16 ∗ D I V 波特率 = \frac{f_{PCLK2/1} }{16 * DIV} 波特率=16∗DIVfPCLK2/1
解释:PCLK1或PLCK2的时钟频率除以16倍的DIV
- DIV分为整数部分(12bit)和小数部分(4bit),整数部分高位补0,小数部分低位补0
Ⅴ、USART函数介绍
// 重置指定的USART为默认值
void USART_DeInit(USART_TypeDef* USARTx);
// 初始化指定的USART,根据初始化结构体配置参数
void USART_Init(USART_TypeDef* USARTx, USART_InitTypeDef* USART_InitStruct);
// 初始化USART初始化结构体的默认值
void USART_StructInit(USART_InitTypeDef* USART_InitStruct);
// 初始化指定的USART时钟,根据时钟初始化结构体配置参数
void USART_ClockInit(USART_TypeDef* USARTx, USART_ClockInitTypeDef* USART_ClockInitStruct);
// 初始化USART时钟初始化结构体的默认值
void USART_ClockStructInit(USART_ClockInitTypeDef* USART_ClockInitStruct);
// 开启或关闭指定的USART
void USART_Cmd(USART_TypeDef* USARTx, FunctionalState NewState);
// 开启或关闭USART的中断
void USART_ITConfig(USART_TypeDef* USARTx, uint16_t USART_IT, FunctionalState NewState);
// 开启或关闭USART的DMA请求
void USART_DMACmd(USART_TypeDef* USARTx, uint16_t USART_DMAReq, FunctionalState NewState);
// 设置USART地址
void USART_SetAddress(USART_TypeDef* USARTx, uint8_t USART_Address);
// 配置USART唤醒模式
void USART_WakeUpConfig(USART_TypeDef* USARTx, uint16_t USART_WakeUp);
// 开启或关闭USART接收器唤醒功能
void USART_ReceiverWakeUpCmd(USART_TypeDef* USARTx, FunctionalState NewState);
// 配置USART LIN断裂检测长度
void USART_LINBreakDetectLengthConfig(USART_TypeDef* USARTx, uint16_t USART_LINBreakDetectLength);
// 开启或关闭USART LIN模式
void USART_LINCmd(USART_TypeDef* USARTx, FunctionalState NewState);
// 通过USART发送数据
void USART_SendData(USART_TypeDef* USARTx, uint16_t Data);
// 通过USART接收数据
uint16_t USART_ReceiveData(USART_TypeDef* USARTx);
// 发送USART断点信号
void USART_SendBreak(USART_TypeDef* USARTx);
// 设置USART保护时间
void USART_SetGuardTime(USART_TypeDef* USARTx, uint8_t USART_GuardTime);
// 设置USART预分频器
void USART_SetPrescaler(USART_TypeDef* USARTx, uint8_t USART_Prescaler);
// 开启或关闭USART智能卡模式
void USART_SmartCardCmd(USART_TypeDef* USARTx, FunctionalState NewState);
// 开启或关闭USART智能卡NACK应答
void USART_SmartCardNACKCmd(USART_TypeDef* USARTx, FunctionalState NewState);
// 开启或关闭USART半双工模式
void USART_HalfDuplexCmd(USART_TypeDef* USARTx, FunctionalState NewState);
// 开启或关闭USART 8位过采样模式
void USART_OverSampling8Cmd(USART_TypeDef* USARTx, FunctionalState NewState);
// 开启或关闭USART单线方法
void USART_OneBitMethodCmd(USART_TypeDef* USARTx, FunctionalState NewState);
// 配置USART IrDA模式
void USART_IrDAConfig(USART_TypeDef* USARTx, uint16_t USART_IrDAMode);
// 开启或关闭USART IrDA模式
void USART_IrDACmd(USART_TypeDef* USARTx, FunctionalState NewState);
// 获取USART标志状态
FlagStatus USART_GetFlagStatus(USART_TypeDef* USARTx, uint16_t USART_FLAG);
// 清除USART标志
void USART_ClearFlag(USART_TypeDef