目录

STM32-USART-串口发送接收

STM32-USART-串口发送+接收


一:串口发送

串口发送–原文链接:https://blog.csdn.net/rxy0727/article/details/1460446498

二:串口接收

  • 在串口发送初始化部分上加上接收的部分

  • 首先是GPIO口,要使用RX引脚,在引脚定义表里可以知道,USART的RX复用在PA10引脚。所以要再初始化一下PA106

        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10; 
    	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; 
    	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; //浮空输入
    	GPIO_Init(GPIOA, &GPIO_InitStructure); 
    
  • 在USART_Mode中加上串口模式RX,就开启了同时发送和接收部分

        //配置USART
    	USART_InitTypeDef USART_InitStructure; 
    	USART_InitStructure.USART_BaudRate = 9600; 
    	USART_InitStructure.USART_WordLength = USART_WordLength_8b; 
    	USART_InitStructure.USART_StopBits = USART_StopBits_1; 
    	USART_InitStructure.USART_Parity = USART_Parity_No; 
    	USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None; 
    	USART_InitStructure.USART_Mode = USART_Mode_Tx | USART_Mode_Rx;  
    	USART_Init(USART1, &USART_InitStructure); 
    

三:串口查询的两种方法

1.查询

如果使用查询,那初始化到上一步就结束了,查询的流程是,在主函数里不断判断RXNE标志位,如果置1了,就说明收到数据了。再调用ReceiveData,读取DR寄存器。

函数: USART_ GetFlagStatus

函数功能

检查指定的

USART

标志位设置与否

参数1:USARTx

x

可以是

1

2

或者

3

,来选择

USART

外设

参数2:USART_FLAG

:待检查的

USART

标志位

https://i-blog.csdnimg.cn/direct/0ca500a894e648f5bf9084409ae1ce1a.png

由状态寄存器USART_SR可得,读DR可以自动清除标志位,所以不需要重新清除标志位

https://i-blog.csdnimg.cn/direct/a62cb47f555c49bdbd77097e49177185.png

函数: USART_ ReceiveData

函数功能: 返回

USARTx

最近接收到的数据

参数:USARTx

x

可以是

1

2

或者

3

,来选择

USART

外设

代码:

while(1)
	{
		if(USART_GetFlagStatus(USART1, USART_FLAG_TXE) == SET)
		{
			//如果if成立
			RxData = USART_ReceiveData(USART1);
            OLED_ShowHexNum(1,1,RxData,2);
		}
		
	}

结果:

https://i-blog.csdnimg.cn/direct/1afb2fd52cb54c54812be63611348648.png

https://i-blog.csdnimg.cn/direct/f52ba35953f246df8d5be781c95ad7cc.jpeg

2.中断

如果使用中断,则还需要开启中断,配置NVIC.

第一步:开启RXNE标志位到NVIC的输出

函数 USART_ITConfig

函数功能: 使能或者失能指定的

USART

中断

参数1: USARTx

x

可以是

1

2

或者

3

,来选择

USART

外设

参数2:USART_IT

:待使能或者失能的

USART

中断源

输入参数

USART_IT

使能或者失能

USART

的中断。可以取下表的一个或者多个取值的组合作为该参数的值。

https://i-blog.csdnimg.cn/direct/882aeb602e114f209db73a44a22dac87.png

代码:

USART_ITConfig(USART1, USART_IT_RXNE ENABLE);

第二步:配置NVIC

函数 NVIC_PriorityGroupConfig

函数功能: 设置优先级分组:先占优先级和从优先级

参数:NVIC_PriorityGroup

:优先级分组位长度

该参数设置优先级分组位长度,见下表

https://i-blog.csdnimg.cn/direct/88116efec3dd494098dae2e8d6c6b65d.png

函数NVIC_Init

功能描述: 根据

NVIC_InitStruct

中指定的参数初始化外设

NVIC

寄存器

NVIC的相关函数:

  • NVIC_IRQChannel

    该参数用以使能或者失能指定的

    IRQ

    通道

  • NVIC_IRQChannelPreemptionPriority

    该参数设置了成员

    NVIC_IRQChannel

    中的先占优先级

配置NVIC代码:
//配置NVIC
	
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
	
	NVIC_InitTypeDef NVIC_InitStructure;
	NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn; 
	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1; 
	NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1; 
	NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; 
	NVIC_InitStructure(&NVIC_InitStructure); 

总结:RXNE一旦置1,就会向NVIC申请中断,之后就可以在中断里接收数据

函数封装
uint8_t Serial_GetRxFlag(void)
{
	if(Serial_RxFlag == 1)
	{
		Serial_RxFlag=0;//读后自动清除功能
		return 1;
	}
	return 0;
}

uint8_t Serial_GetRxData(void)
{
	return Serial_RxData;
}

void USART1_IRQHandler(void)
{
	if(USART_GetITStatus(USART1, USART_IT_RXNE)== SET)
	{
		//如果置1了就进入if
		Serial_RxData = USART_ReceiveData(USART1);
		Serial_RxFlag = 1;//读完之后置一个自己的标志位
		USART_ClearITPendingBit(USART1, USART_IT_RXNE);//清除标志位
	}
}

主函数调用

while(1)
	{
		if(Serial_GetRxFlag()==1)
		{
			//如果if成立
			RxData = Serial_GetRxData();
			Serial_SendByte(RxData);//数据回传
			OLED_ShowHexNum(1,1,RxData,8);
		}
		
	}
结果:

https://i-blog.csdnimg.cn/direct/cc57bd5e38cc4e8280adf7738b574ec2.png

四:学习心得

在这个学习过程中,对USART通信有了更清楚的认识

USART的配置和使用方法

配置STM32的USART主要包括以下几个步骤:

  1. 初始化 ‌:设置波特率、数据位、停止位和校验方式。
  2. 发送数据 ‌:通过 函数发送数据,并等待发送缓冲区为空。
  3. 接收数据 ‌:使用 函数接收数据,并处理接收到的数据。
  4. 中断处理 ‌:配置中断源,处理接收和发送完成的中断事件。

今天也是收获满满的一天,开心!!!