串行通信vs并行通信
• 并行:使用8根数据线一次传送一个字节(或使用16根数据线一次传送2个字节,...)
• 串行:使用少量数据信号线(8根以下),将数据逐位分时传送
• 并行vs串行:类似于多车道vs单车道
通信特性对比
• 在工作频率相同的情况下,并行通信的数据传输速率明显高于串行通信。(注意前提)
• 由于并行传输对同步要求较高,且随着通信速率的提高,信号干扰的问题会显著影响通信性能。随着技术的发展,越来越多的应用场合采用高速率的串行差分传输。
接口举例
并行接口举例:
Centronics打印接口、PATA硬盘接口、AT键盘接口
串行接口举例:
Ps/2接口、usb接口、SATA硬盘接口、I2C接口、SPI接口
STM32的串行通信接口USART
STM32具有多达5个USART接口
• USART1连接高速APB2总线、运行速度为72MHz(支持高达4.5Mbps的传输速率)
• 其他位于APB1总线、36MHz(2.25Mbps传输速率)
STM32的USART接口具有多种操作模式
• 异步全双工通信、同步单路通信和半双工单线通信
• 支持LIN、智能卡、IrDA、多处理器通信
每个USART接口具有两个DMA通道
• 用于接收Rx和发送Tx数据与存储器之间的高速传送
USART的增强功能
局部互联网络LIN(Local Interconnection network)
• 主要针对车辆中低成本的LIN总线
智能卡(Smart Card)
• 内嵌芯片的集成电路(IC)卡
• 兼容ISO 7816-3标准的异步智能卡协议
红外线接口IrDA(Infrared Data Association)
• 短距离、点对点直线数据传输
• 支持SIR ENDEC传输编码解码协议
串口功能框图讲解
接收发送数据过程
接收数据过程:
由Rx接收数据,根据波特率按位写入”接收移位寄存器”,待接收完毕后一次性写入”接收数据寄存器(RDR)”,CPU读取寄存器获取传输的数据
发送数据过程:
由CPU写数据到”发送数据寄存器(TDR)”,再由TDR一次性将要发送的数据写入”发送移位寄存器”,按照波特率逐位移出
波特率控制
如图:
发送控制器和接收控制器分别控制发送移位寄存器和接收移位寄存器
发送器时钟和接收器时来自同一个时钟单元发送和接收控制器的波特率公用波特率发生器
接收器时钟产生
STM32F103共5个串口:
串口1时钟来自PLCK2
串口2-5时钟来自PLCK1
例如:串口1的时钟由PCLK2经过/USARTDIV(分频)得到,而分频由波特率发生器控制,通过相关寄存器进行配置
USART接口的引脚
USART接口通过3个引脚连接外设
• Tx 发送数据输出(Transmit Data Out)
• Rx 接收数据输入(Receive Data In)
• CK 发送时钟输出,用于同步传输模式(CK引脚早期版本被称为SCLK)
实现硬件流程控制需要如下引脚
• nCTS 清除发送(Clear To Send)
• nRTS 发送请求(Request To Send)
硬件流控具体表现为:当串口已经准备好接收新数据时,由硬件自动把RTS脚拉低(向外表示可接收数据);在发送数据前,由硬件自动检查CTS脚是否为低(表示是否可以发送数据),再进行发送。
USART寄存器
波特率的计算方法
波特率由波特率发生器和PCLKx共同产生 PCLKx的值由
串口本身决定,通过配置USART_BRR寄存器确定波特率发生器的值,经过USARTDIV分频器除以16得到最终的波特率
USARTDIV:无符号的定点数
FCK:串口的时钟,注意区分APB2和APB1两条总线
波特率计算举例
设置串口1波特率为115200
串口1的时钟来自PCLK2=72MHz
由公式得到:
USARTDIV=72000000/(115200*16)=39.0625
整数部分DIV_Mantissa=39=0x27
小数部分DIV_Fraction=16*0.0625=1=0x01
所以设置USART->BRR=0x0271,就可以实现设置串口1的波
特率为115200
USART操作相关数据结构和库函数
USART初始化结构体
typedef struct
{
uint32_t USART_BaudRate; //波特率 BRR
uint16_t USART_WordLength; //字长 CR1_M
uint16_t USART_StopBits; //停止位 CR2_STOP
uint16_t USART_Parity; //校验控制 CR1_PCE、CR1_PS
uint16_t USART_Mode; //模式选择CR1_TE、CR1_RE
// 硬件流选择 CR3_CTSE、CR3_RTSE
uint16_t USART_HardwareFlowControl;
} USART_InitTypeDef;
USART编程常用固件库函数
1-串口初始化函数
void USART_Init
(USART_TypeDef* USARTx, USART_InitTypeDef* USART_InitStruct)
USART初始化
//USART初始化函数
void USART_Init ( USART_TypeDef * USARTx,
USART_InitTypeDef * USART_InitStruct)
//USARTx(要配置的串口):USART1~UART5
// USART_InitStruct指向USART_InitTypeDef结构变量的指针
typedef struct
{ uint32_t USART_BaudRate; /* 通信波特率 */
uint16_t USART_WordLength; /* 数据位数 */
uint16_t USART_StopBits; /* 停止位数 */
uint16_t USART_Parity; /* 校验模式 */
uint16_t USART_Mode; /* 接收发送模式 */
uint16_t USART_HardwareFlowControl;/* 硬件流控制 */
} USART_InitTypeDef;
2-中断配置函数
void USART_ITConfig
(USART_TypeDef* USARTx, uint16_t USART_IT,FunctionalState NewState)
3-串口使能函数
void USART_Cmd(USART_TypeDef* USARTx,FunctionalState NewState)
4-数据发送函数
void USART_SendData(USART_TypeDef* USARTx, uint16_t Data)
5-数据接收函数
uint16_t USART_ReceiveData(USART_TypeDef* USARTx)
6-中断状态位获取函数
ITStatus USART_GetITStatus(USART_TypeDef* USARTx, uint16_t USART_IT)
USART库函数列表