STM32实现串口和DMA功能(1)

目录

一、串口简介

二、产品两个USART的作用

三、USART和UART的区别

四、USART1和USART2代码实现


一、串口简介

串口通讯是一种设备间非常常用的串行通讯方式,因为它简单便捷,大部分电子设备都支持该通讯方式,调试设备的时候也经常使用该通讯输出调试信息。

二、产品两个USART的作用

1、USART1的作用

        产品总共用到两个串口,串口1是用于产品Debug功能,主要用于监控串口2和Wifi模块的通讯数据,方便调试,目前做物联网产品基本是通过串口来接收和发送数据,而这种一般有一个复杂的通讯协议,在调试过程中肯定会有很多问题,如果能把MCU和WIFI模组的交互数据通过别的别的串口打印出来,那将大大提高开发效率。

2、USART2的作用

串口2我们是用来跟WIFI模块通讯,用来远程和数据交互。

三、USART和UART的区别

USART:通用同步异步收发器

UART:通用异步收发器

简单来说就是USART和UART的加强版,增加了同步功能,USART除了可以串口通讯以外,还能支持和ISO7816(用于接触式IC卡)、LIN总线(用于汽车CAN总线)、IrDA(红外通讯)协议接口通讯。而UART就只能单纯使用串口通讯协议。

四、USART1和USART2代码实现

需要实现的功能:USART1用于Debug,主要用来打印usart2接收到的数据,usart2接的式wifi模组,所以usart1的作用就是用来监控mcu和WiFi模组之间的交互数据用的。

usart配置流程

1、开启复用功能、IO口、USART时钟。

2、配置IO口,USART结构体变量

GPIO_InitTypeDef GPIO_InitStructure;  
	USART_InitTypeDef USART_InitStructure; 
	NVIC_InitTypeDef NVIC_InitStructure;   // 定义结构体
 
	RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOA,ENABLE); // 开端口时钟
	RCC_APB2PeriphClockCmd( RCC_APB2Periph_USART1,ENABLE); // 开Usart时钟
	RCC_APB1PeriphClockCmd( RCC_APB1Periph_USART2,ENABLE);
	 
	/*
	*  USART1_TX -> PA9 , USART1_RX ->	PA10
	*/				
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;	         
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;  // Tx配置为推挽复用模式
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GPIOA, &GPIO_InitStructure);		   

	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;	        
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;  // Rx 配置为上拉输入模式
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;  
	GPIO_Init(GPIOA, &GPIO_InitStructure);

	USART_InitStructure.USART_BaudRate = 115200;  // 波特率
	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_Rx | USART_Mode_Tx;  // 收发模式

	USART_Init(USART1, &USART_InitStructure);   // 完成初始化
	USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);  // 使能串口接收中断
	USART_ITConfig(USART1, USART_IT_TXE, DISABLE);  // 失能串口发送中断
	USART_Cmd(USART1, ENABLE);  // 使能串口
	
	//USART1 INT Cofig
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);
	NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;
	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 3;
	NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
	NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
	NVIC_Init(&NVIC_InitStructure);

3、完善USART中断回调函数

// 串口发送函数
static void hal_DebugSendByte(unsigned char  Dat)
{
	USART_SendData(USART1, Dat);  // 往串口1发送数据
	USART_ITConfig(USART1, USART_IT_TXE, ENABLE); 	 // 开启串口一发送中断
	
}

// 串口中断回调函数
void USART1_IRQHandler(void)
{
	unsigned char dat;
	if(USART_GetITStatus(USART1,USART_IT_RXNE) != RESET) // 判断串口是否接收到数据
	{							
		dat = USART_ReceiveData(USART1);  // 把接收到的数据赋值给dat
		//hal_DebugSendByte(dat);
		
		USART_ClearITPendingBit(USART1,USART_IT_RXNE); // 清除中断标志位
		
	}
	
	if(USART_GetITStatus(USART1,USART_IT_TXE) != RESET) // 判断串口是否有数据发送
	{
		 USART_ClearITPendingBit(USART1, USART_IT_TXE);     // 清楚中断标志位
		 USART_ITConfig(USART1, USART_IT_TXE, DISABLE); 	// 关闭串口中断
	}
}

版权声明:本文为CSDN博主「刘远远」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_45806510/article/details/120848939

生成海报
点赞 0

刘远远

我还没有学会写个人说明!

暂无评论

发表评论

相关推荐

4路红外循迹模块使用教程

4路红外循迹模块使用教程 个人原创博客:点击浏览模块详细信息: 工作电压:DC 3.3V~5V 工作电流:尽量选择1A以上电源供电 工作温度:-10℃~50℃ 安装孔

HAL库串口中断

一,配置串口初始化 void MX_USART1_UART_Init(void) {huart1.Instance USART1;huart1.Init.BaudRate 115200;huart1.Init.WordLen

拉绳位移传感器在接线时需要注意哪几点?

拉绳位移传感器在接线时需要注意哪几点? 1、拉绳位移传感器在接线时务必确认在电源关闭的情况下进行接线,接线应采用锡焊工艺,各引脚应焊接牢固,避免虚焊情况发生。焊接各引脚时应严格按照传感器厂