STM32F407 USART配置

什么是USART?
USART(Universal Synchronous/Asynchronous Receiver Transmitter)是一种通用同步/异步收发器,常用于串行通信。USART可以通过串行线路将数据进行传输,用于与其他设备(如计算机、微控制器、外设)进行通信。

通信相关:
全双工:同时接收和发送
半双工:同一时间只能发送或接收
单 工:要么只能发送要么只能接收

串行:(单车道)
传输原理:数据按位顺序来传输
优点:占用引脚少
缺点:速度低
并行:(8车道)
传输原理:数据各个位同时传输
优点:速度快
缺点:占用多个引脚

USART可以通过两种模式进行通信:同步模式异步模式

本章节stm32中以异步模式配置

在异步模式下,数据以帧的形式传输,每个帧包含一个起始位(Start Bit)、数据位(Data Bits)、校验位(Parity Bit)和停止位(Stop Bit)。帧的长度通常为 8 位(1 个起始位、6-8 个数据位、1 个奇偶校验位和 1-2 个停止位),但也可以是其他长度。

串口:
串口一般默认为全双工通信,USART一般也被称为串口
串口必备要素:
信号线:
TXD:发送数据的信号线
RXD:接收数据的信号线
传输参数:
起始位:发送器一般是通过发送起始位来表示一个字符的传输
数据位:要发送的那个字符的每一位数据
停止位:用来表示一个字符的传输结束
校验位:用于检测数据传输是否正确,USART使用的是奇偶校验位,用来检查数据是否有丢失
波特率:每秒传输多少bit位数据,例如115200就是一秒传输115200个bit位

在STM32使用串口,首先添加USART外设,添加相关固件
在这里插入图片描述
根据芯片封装原理图找到每块开发板对应的引脚(例如我的stm32F407ZET6主控开发板)

在这里插入图片描述
由图可以看出,我这款芯片串口1复用的引脚为PA9(tx)和PA10(rx)
根据原理图可知,串口1 的两条信号线分别为:
PA9:USART_TX,发送信号线,复用输出模式
PA10:USART_RX,接收信号线,复用输入模式

分析串口初始化配置,如图(图片来的更直观一些)

在这里插入图片描述
下面是具体的配置步骤,虽然图片已经很清楚了,但是为了还有人不明白,再具体写一下
具体芯片以具体情况来看,我这个是STM32F4系列的库函数,如果有小伙伴学习STM32F1系列的,库函数可能不同,但是配置步骤大同小异
1、使能时钟:USART1、GPIO

	RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);
	RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA,ENABLE);

2、初始化GPIO,并选择复用功能

	//初始化GPIO引脚,以及复用
	GPIO_InitTypeDef GPIO_struct_init;
	GPIO_struct_init.GPIO_Pin = GPIO_Pin_9|GPIO_Pin_10;	//引脚
	GPIO_struct_init.GPIO_Mode = GPIO_Mode_AF;			//输出模式:复位
	GPIO_struct_init.GPIO_Speed = GPIO_Speed_25MHz;		//输出速度:中速
	GPIO_struct_init.GPIO_OType = GPIO_OType_PP;		//输出类型:推挽
	GPIO_struct_init.GPIO_PuPd = GPIO_PuPd_NOPULL;		//上下拉:不拉
	GPIO_Init(GPIOA, &GPIO_struct_init);
		//复位声明
	GPIO_PinAFConfig(GPIOA, GPIO_PinSource9, GPIO_AF_USART1);
	GPIO_PinAFConfig(GPIOA, GPIO_PinSource10, GPIO_AF_USART1);

3、初始化串口参数:波特率、数据位、停止位、检验位、、、

	//初始化串口
	USART_InitTypeDef USART_InitStruct;
	USART_InitStruct.USART_WordLength = USART_WordLength_8b;			//字长
	USART_InitStruct.USART_Parity = USART_Parity_No;					//奇偶校验位
	USART_InitStruct.USART_HardwareFlowControl = USART_HardwareFlowControl_None;	//硬件流控制位
	USART_InitStruct.USART_StopBits = USART_StopBits_1;					//停止位
	USART_InitStruct.USART_Mode = USART_Mode_Rx|USART_Mode_Tx;			//模式
	USART_InitStruct.USART_BaudRate = 115200;							//波特率(可手动设置,比如函数传参)
	USART_Init(USART1,&USART_InitStruct);

4、配置串口中断
注意:只要配置了中断,就一定还要配置一个NVIC嵌套向量控制器

	//配置嵌套向量表
	NVIC_InitTypeDef NVIC_InitTypeDef_init;
	NVIC_InitTypeDef_init.NVIC_IRQChannel = USART1_IRQn;		//中断通道都不一样,一定要记得去中断向量表找,具体的中断向量表如何寻找,可查看以前中断配置
	NVIC_InitTypeDef_init.NVIC_IRQChannelPreemptionPriority = 0;//抢占优先级
	NVIC_InitTypeDef_init.NVIC_IRQChannelSubPriority = 0;//响应优先级
	NVIC_InitTypeDef_init.NVIC_IRQChannelCmd = ENABLE;
	NVIC_Init(&NVIC_InitTypeDef_init);
	
	USART_ITConfig(USART1,USART_IT_RXNE,ENABLE);

5、使能串口

	//串口使能
	USART_Cmd(USART2, ENABLE);

6、编写中断服务函数,这个中断服务函数就要看个人要实现什么功能,例如,我这里接收到数据就点亮一个led蹬

GPIO_ResetBits(GPIOF,GPIO_Pin_9);	//我这个板子是低电平点亮

做到这里,串口的一些基本配置步骤就搞定了,只要接线没问题,这个串口就可以正常使用了,下面是一些串口相关的函数

7、获取接收到的数据,这个函数具体寻找步骤用图列出来
在这里插入图片描述

void USART1_IRQHandler(void)
{
	uint16_t ret;
	if(USART_GetITStatus(USART1,USART_IT_RXNE) == SET)		判断是那条中断线产生的字段
	{
		ret = USART_ReceiveData(USART1);		//使用这个库函数读取数据

		printf("ret = %c\n",ret);				//并将数据打印出来
	
	}
	USART_ClearITPendingBit(USART1,USART_IT_RXNE);		//清除中断标志位

}

关于stm32中的printf函数不能使用和重定向问题在下一节具体分析

8、发送数据,发送函数个接收函数找寻方法一致,这里就不过多介绍

void USART_SendData(USART_TypeDef* USARTx, uint16_t Data)

注意:连续多行发送会导致数据覆盖,因为上一个字节的数据还没发送就被下一个字节覆盖了
所以要确保上一个字节数据发送完毕后再发送下一个字节数