STM32-USART-串口发送+接收

目录

一:串口发送

二:串口接收

三:串口查询的两种方法

1.查询

[函数: USART_ GetFlagStatus](#函数: USART_ GetFlagStatus)

[函数:USART_ ReceiveData](#函数:USART_ ReceiveData)

代码:

结果:

2.中断

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

函数USART_ITConfig

第二步:配置NVIC

函数NVIC_PriorityGroupConfig

函数NVIC_Init

配置NVIC代码:

函数封装

结果:

四:学习心得

USART的配置和使用方法


一:串口发送

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

二:串口接收

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

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

    cpp 复制代码
        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,就开启了同时发送和接收部分

    cpp 复制代码
        //配置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标志位

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

函数:USART_ ReceiveData

函数功能:返回USARTx最近接收到的数据

参数:USARTx:x可以是1,2或者3,来选择USART外设

代码:

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

结果:

2.中断

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

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

函数 USART_ITConfig

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

参数1:USARTx:x可以是1,2或者3,来选择USART外设

参数2:USART_IT:待使能或者失能的USART中断源
输入参数 USART_IT 使能或者失能 USART 的中断。可以取下表的一个或者多个取值的组合作为该参数的值。

代码:

cpp 复制代码
USART_ITConfig(USART1, USART_IT_RXNE ENABLE);

第二步:配置NVIC

函数 NVIC_PriorityGroupConfig

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

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

函数NVIC_Init

功能描述:根据NVIC_InitStruct中指定的参数初始化外设NVIC寄存器

NVIC的相关函数:

  • NVIC_IRQChannel
    该参数用以使能或者失能指定的 IRQ 通道
  • NVIC_IRQChannelPreemptionPriority
    该参数设置了成员 NVIC_IRQChannel 中的先占优先级
配置NVIC代码:
cpp 复制代码
//配置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申请中断,之后就可以在中断里接收数据

函数封装
cpp 复制代码
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);//清除标志位
	}
}

主函数调用

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

四:学习心得

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

USART的配置和使用方法

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

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

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

相关推荐
国科安芯2 小时前
ASP4644芯片低功耗设计思路解析
网络·单片机·嵌入式硬件·安全
充哥单片机设计2 小时前
【STM32项目开源】基于STM32的智能厨房火灾燃气监控
stm32·单片机·嵌入式硬件
CiLerLinux9 小时前
第四十九章 ESP32S3 WiFi 路由实验
网络·人工智能·单片机·嵌入式硬件
时光の尘9 小时前
【PCB电路设计】常见元器件简介(电阻、电容、电感、二极管、三极管以及场效应管)
单片机·嵌入式硬件·pcb·二极管·电感·三极管·场效应管
Lu Zelin9 小时前
单片机为什么不能跑Linux
linux·单片机·嵌入式硬件
宁静致远202110 小时前
stm32 freertos下基于hal库的模拟I2C驱动实现
stm32·嵌入式硬件·freertos
Wave84515 小时前
STM32--智能小车
stm32·单片机·嵌入式硬件
wdfk_prog17 小时前
[Linux]学习笔记系列 -- lib/timerqueue.c Timer Queue Management 高精度定时器的有序数据结构
linux·c语言·数据结构·笔记·单片机·学习·安全
helesheng20 小时前
用低成本FPGA实现FSMC接口的多串口(UART)控制器
stm32·fsmc·fpga·uart控制器
充哥单片机设计20 小时前
【STM32项目开源】基于STM32的智能家居环境(空气质量)检测系统
stm32·单片机·嵌入式硬件