STM32:串口通信(UART/USART)
STM32的串口通信(UART/USART)是嵌入式开发中最常用的通信方式之一,用于设备与上位机,如电脑、其他嵌入式设备之间的异步数据传输。相比SPI/I2C,串口只需2根线,TX 发送和RX 接收。
一、通信方式的不同维度
1.同步通信和异步通信
同步通信:在时钟线的作用,进行数据的收发
异步通信:发送器只管发送数据,接收器只管接收数据,收发数据互不影响
2.全双工、半双工、单工通信
全双工:同一时刻,既可以发送数据也可以接收数据
半双工:同一时刻,只能接受或者发送数据
单工:数据只能往一个方向,只能发或者只能收
3.串行通信和并行通信
串行通信:数据以bit为单位,一位接一位发送或者接收数据。LSB(低位先行) ,MSB(高位先行)
并行通信:数据以字节为单位收发数据。
二、串口通信核心原理
1.基础概念
STM32的串口是一种同步异步可以选择,全双工,串行,低位先行的通信方式
UART(通用异步收发传输器):异步通信,无需时钟线,通过预先约定的波特率同步数据。USART(通用同步异步收发传输器):STM32 的串口外设支持同步和异步模式,常用异步模式,即 UART。
引脚:TX:发送端 RX:接收端
串口通信的接线方式:最少需要有三根线,RX\TX\GND
两个设备之间的TX和RX需要交叉相接,GND需要接到一起
2.关键参数(必须主从一致)
波特率:每秒传输的比特数,如9600、115200,常用 115200。
起始位:标识一帧数据开始,通常1位(固定低电平)。
数据位:每帧数据的有效位数,通常8位。
停止位:标识一帧数据结束,通常1位(固定高电平)。
校验位:用于数据校验,无校验、奇校验、偶校验,常用无校验。
三、代码实战
void drv_usart6_init(void)
{
GPIO_InitTypeDef GPIO_InitStruct;
USART_InitTypeDef USART_InitStruct;
NVIC_InitTypeDef NVIC_InitStruct;
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOG, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART6, ENABLE);
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF;
GPIO_InitStruct.GPIO_OType = GPIO_OType_PP;
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_9|GPIO_Pin_14;
GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_UP;
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_25MHz;
GPIO_Init(GPIOG, &GPIO_InitStruct);
GPIO_PinAFConfig(GPIOG, GPIO_PinSource9, GPIO_AF_USART6);
GPIO_PinAFConfig(GPIOG, GPIO_PinSource14, GPIO_AF_USART6);
USART_InitStruct.USART_BaudRate = 115200;
USART_InitStruct.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
USART_InitStruct.USART_Mode = USART_Mode_Tx|USART_Mode_Rx;
USART_InitStruct.USART_Parity = USART_Parity_No;
USART_InitStruct.USART_StopBits = USART_StopBits_1;
USART_InitStruct.USART_WordLength = USART_WordLength_8b;
USART_Init(USART6, &USART_InitStruct);
USART_ClearFlag(USART6, USART_FLAG_TC);
USART_ITConfig(USART6, USART_IT_RXNE, ENABLE);
USART_ITConfig(USART6, USART_IT_IDLE, ENABLE);
NVIC_InitStruct.NVIC_IRQChannel=USART6_IRQn;
NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority=2;
NVIC_InitStruct.NVIC_IRQChannelSubPriority=0;
NVIC_InitStruct.NVIC_IRQChannelCmd=ENABLE;
NVIC_Init(&NVIC_InitStruct);
USART_Cmd(USART6, ENABLE);
}
更多推荐
所有评论(0)