《嵌入式系统》知识总结11:STM32串口 | 您所在的位置:网站首页 › 总线通信协议分为 › 《嵌入式系统》知识总结11:STM32串口 |
串行通信vs并行通信
• 并行:使用8根数据线一次传送一个字节(或使用16根数据线一次传送2个字节,...) • 串行:使用少量数据信号线(8根以下),将数据逐位分时传送 • 并行vs串行:类似于多车道vs单车道 通信特性对比• 在工作频率相同的情况下,并行通信的数据传输速率明显高于串行通信。(注意前提) • 由于并行传输对同步要求较高,且随着通信速率的提高,信号干扰的问题会显著影响通信性能。随着技术的发展,越来越多的应用场合采用高速率的串行差分传输。 接口举例并行接口举例: Centronics打印接口、PATA硬盘接口、AT键盘接口串行接口举例: Ps/2接口、usb接口、SATA硬盘接口、I2C接口、SPI接口 STM32的串行通信接口USARTSTM32具有多达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库函数列表
|
CopyRight 2018-2019 实验室设备网 版权所有 |