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);
}

Logo

智能硬件社区聚焦AI智能硬件技术生态,汇聚嵌入式AI、物联网硬件开发者,打造交流分享平台,同步全国赛事资讯、开展 OPC 核心人才招募,助力技术落地与开发者成长。

更多推荐