当前位置: 首页 > article >正文

STM32 串口发送与接收

接线图

代码配置

根据上一章发送的代码配置,在GPIO配置的基础上需要再配置PA10引脚做RX接收,引脚模式可以选择浮空输入或者上拉输入,在USART配置串口模式里加上RX模式。

配置中断

//配置中断
USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);

配置NVIC

//配置NVIC
	
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//中断分组
NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;//配置中断通道
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;//使能中断通道
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;//抢占优先级
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;//响应优先级
	
NVIC_Init(&NVIC_InitStructure);

整体函数

void USART_Config(void)
{
	//定义结构体变量
	GPIO_InitTypeDef GPIO_InitStructure;//定义GPIO结构体变量
	USART_InitTypeDef USART_InitStructure;//定义USART1结构体变量
	NVIC_InitTypeDef NVIC_InitStructure;//定义NVIC结构体变量
	//开启时钟
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);//开启USART1的时钟
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);//开启GPIO A族的时钟
	
	
	//配置GPIO
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;//这里选择复用推挽输出
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;//只需要发送 所以只配置PA9引脚
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;//速率
	GPIO_Init(GPIOA, &GPIO_InitStructure);
	
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;//这里选择上拉输入模式
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;//只需要发送 所以只配置PA9引脚
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;//速率
	
	GPIO_Init(GPIOA, &GPIO_InitStructure);
	
	//配置USART
	
	USART_InitStructure.USART_BaudRate = 9600;//波特率
	USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;//硬件流控制
	USART_InitStructure.USART_Mode = USART_Mode_Tx | USART_Mode_Rx;//串口模式 TX发送 RX接受 这里选择发送模式
	USART_InitStructure.USART_Parity = USART_Parity_No;//校验位 这里选择无校验
	USART_InitStructure.USART_StopBits = USART_StopBits_1;//停止位
	USART_InitStructure.USART_WordLength = USART_WordLength_8b;//字长
	USART_Init(USART1, &USART_InitStructure);
	
	//配置中断
	USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);
	
	//配置NVIC
	
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//中断分组
	NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;//配置中断通道
	NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;//使能中断通道
	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;//抢占优先级
	NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;//响应优先级
	
	NVIC_Init(&NVIC_InitStructure);
	//开启USART
	USART_Cmd(USART1, ENABLE);//使能USART1
	
}

中断函数

uint8_t RX_Data;//定义串口接收数据变量
uint8_t RX_Flag;//定义串口接收标志位变量

//获取串口接收标志位 flag自动清除函数
uint8_t Serial_GetRXFlag(void)
{
	if(RX_Flag == 1)//如果标志位为1
	{
		RX_Flag = 0;
		return 1;		//则返回1,并且清除标志位
	}
		return 0;//如果为0 则返回0
}

//获取串口接受的数据
uint8_t Serial_GetRXData(void)
{
	
	return RX_Data;//返回接收的数据
	
}


//中断函数
void USART1_IRQHandler(void)
{
	//判断中断标志位
	if(USART_GetITStatus(USART1, USART_IT_RXNE) == SET)
	{
		RX_Data = USART_ReceiveData(USART1);//读取数据寄存器,并存放在数据变量里
		RX_Flag = 1;												//将接收标志位置1
		
		//清除标志位
		USART_ClearITPendingBit(USART1, USART_IT_RXNE);
	}
	
}

主函数

#include "USART.h"
int main(void)
{
	OLED_Init();
	USART_Config();
	OLED_ShowString(1, 1, "RXData:");
	while(1)
	{
		if(Serial_GetRXFlag() == 1)
		{
			RX_Data = Serial_GetRXData();
			Serial_SendByte(RX_Data);
			OLED_ShowHexNum(1, 8, RX_Data, 2);
		}
		
	}
	
	
}


http://www.kler.cn/a/532691.html

相关文章:

  • Windows图形界面(GUI)-QT-C/C++ - QT MDI Area
  • CompletableFuture
  • 25.02.04 《CLR via C#》 笔记14
  • 刷题记录 动态规划-7: 63. 不同路径 II
  • Kubernetes学习之包管理工具(Helm)
  • C++11 多线程 锁与条件变量:mutex、lock_guard、unique_lock 和 condition_variable
  • 硬件产品经理:需求引力模型(DGM)
  • 用 OpenCV 画圆:让图像处理更简单有趣
  • 昇思打卡营第五期(MindNLP特辑)番外:硅基流动 x 华为云DeepSeek V3 API推理MindTinyRAG
  • 排序算法--冒泡排序
  • 最新版Node.js下载安装指定版本图文版教程(非常详细)
  • 动态获取脚本名称作为日志文件的名称
  • 要将DsspSeek微调为行业专用的大模型,需要结合领域知识、数据优化和模型调整策略。
  • 【Linux系统】SIGCHLD 信号(选学了解)
  • 基于微信小程序的私家车位共享系统设计与实现(LW+源码+讲解)
  • linux内核源代码中__init的作用?
  • 【仿12306项目】基于SpringCloud,使用Sentinal对抢票业务进行限流
  • Linux01——初识Linux
  • 【Python】NumPy(一):数据类型、创建数组及基本操作
  • Docker使用指南(二)——容器相关操作详解(实战案例教学,创建/使用/停止/删除)
  • 开发指南094-in语句的处理
  • Maven(Ⅱ):依赖范围,依赖传递,依赖阻断,可选依赖
  • 10分钟本地部署Deepseek-R1
  • Laravel Validation validated() 的实现
  • Selenium记录RPA初阶 - 基本输入元件
  • js --- 获取随机数