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