STM32CubeMX实现串口通信(中断方式)

一、STM32CubeMX工程创建

1、题目要求

完成一个STM32的USART串口通讯程序(中断方式),要求: 1)设置波特率为115200,1位停止位,无校验位;
2)STM32系统给上位机(win10)连续发送“hello windows!”。win10采用“串口助手”工具接收。

根据题目,我设置,串口自动发送Hello windows!,如果接收到其他数据,则返回其他数据,之后继续发送Hello windows

在我的上篇博客中大致介绍了中断方式的使用方法以及作用,我也提到了使用中断方式和传统的扫描方式的区别,简而言之就是 中断方式对CPU的占用率更低,扫描方式对CPU的占用率高。 并且在使用中断方式的时候我们的CPU可以处理其他事情。所以这次我们选择用中断方式来进行串口通信。

2、配置STM32CubeMX工程

2.1 时钟的设置

我们无论完成怎样的工程都需要对时钟进行配置,首先需要我们设置RCC,打开外部时钟HSE,在选择外部时钟源:
在这里插入图片描述
设置好RCC以后,还需要我们对时钟树进行配置:
在这里插入图片描述

2.2 USART的配置

在我们之前的博客中点亮LED用到的是管脚输出高低电平,在这之前我们对GPIO进行了初始化,现在我们要实现USART串口通信所以我们也要先对对应的串口进行初始化并配置模式等,所以我们要设置串口
点击USART1
1)将模式改为异步通信——Asynchronous
在这里插入图片描述

2)设置参数,因为我们要求的基本参数是“设置波特率为115200,1位停止位,无校验位”,所以我们要根据题目要求设置基本参数,波特率115200 Bits/s,传输数据长度为8 ,没有奇偶校验位,停止位为1
在这里插入图片描述
3)由于这次要求的是中断方式,所以我们还需要打开中断,点击NVIC Settings,使能中断:
在这里插入图片描述
4)现在我们看右边芯片的示意图,发现A9、A10已被配置为USART1传送和接收数据的默认管脚:
在这里插入图片描述

二、Keil工程的创建

首先我们需要在main.c和usart.c中添加头文件* #include stdio.h *
这是因为我们需要用到一些库函数,所以要调用这个头文件。
由于我们用的是中断方式,所以我们要先在main.c中开启中断:

HAL_UART_Receive_IT(&huart1, (uint8_t *)&aRxBuffer, 1);

接着打开我们的usart.c,在里面加上如下代码,进行重定义:



//加入以下代码,支持printf函数,而不需要选择use MicroLIB	  
//#define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)	
#if 1
//#pragma import(__use_no_semihosting)             
//标准库需要的支持函数                 
struct __FILE 
{ 
	int handle; 
}; 

FILE __stdout;       
//定义_sys_exit()以避免使用半主机模式    
void _sys_exit(int x) 
{ 
	x = x; 
} 
//重定义fputc函数 
int fputc(int ch, FILE *f)
{ 	
	 HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, 0x0001);  
	return ch;
}
#endif 




接着我们再回到main.c文件中加上我们的串口发送程序,用来向我们电脑的串口助手发送数据:

printf("Hello windows!\r\n");
		HAL_Delay(500);

既然我们要向串口助手发送数据,所以我们必须要用到一个数组来存放我们当然需要一个数组来存放我们的数据啦,所在我们main.c文件中添加如下定义:

uint8_t aRxBuffer;			//接收中断缓冲
uint8_t Uart1_RxBuff[256];		//接收缓冲
uint8_t Uart1_Rx_Cnt = 0;		//接收缓冲计数
uint8_t	cAlmStr[] = "数据溢出(大于256)\r\n";

我们知道中断是需要我们自己来写中断回调函数的,执行到中断时就会跳到回调函数中来,所以我们需要在我们main.c文件中的main函数外添加如下程序:


void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
  /* Prevent unused argument(s) compilation warning */
  UNUSED(huart);
  /* NOTE: This function Should not be modified, when the callback is needed,
           the HAL_UART_TxCpltCallback could be implemented in the user file
   */
 
	if(Uart1_Rx_Cnt >= 255)  //溢出判断
	{
		Uart1_Rx_Cnt = 0;
		memset(Uart1_RxBuff,0x00,sizeof(Uart1_RxBuff));
		HAL_UART_Transmit(&huart1, (uint8_t *)&cAlmStr, sizeof(cAlmStr),0xFFFF);	
	}
	else
	{
		Uart1_RxBuff[Uart1_Rx_Cnt++] = aRxBuffer;   //接收数据转存
	
		if((Uart1_RxBuff[Uart1_Rx_Cnt-1] == 0x0A)&&(Uart1_RxBuff[Uart1_Rx_Cnt-2] == 0x0D)) //判断结束位
		{
			HAL_UART_Transmit(&huart1, (uint8_t *)&Uart1_RxBuff, Uart1_Rx_Cnt,0xFFFF); //将收到的信息发送出去
			Uart1_Rx_Cnt = 0;
			memset(Uart1_RxBuff,0x00,sizeof(Uart1_RxBuff)); //清空数组
		}
	}
	
	HAL_UART_Receive_IT(&huart1, (uint8_t *)&aRxBuffer, 1);   //再开启接收中断
}

三、效果展示

在这里插入图片描述

总结

STM32CubeMX软件配置USART 串口通信按照上面我们就已经完成了,看到这不妨自己动手去试试,整体下来并不是很难,在我们用熟了之后,我们只需简单的看看需要注意的哪些点即可。

在使用STM32CubeMX进行串口中断通信接收时,首先需要在工程设置中进行一些配置。首先,打开STM32CubeMX并创建一个新的工程,选择所需的芯片。然后,需要对该工程进行一些设置。 首先,在时钟配置中,点击左侧的System Core,然后点击"RCC",将HSE设置为外部晶振。接下来,在Connectivity中选择USART1串口,将Mode设置为异步通信,设置波特率为115200Bit/s,数据长度为8Bits等参数,并将芯片上的GPIO端口设置为对应的形式。 由于采用的是串口中断方式,所以需要勾选NVIC中的USART1 global interrupt选项。然后,在时钟树设置中,将HCLK设置为72MHZ。 在代码中,可以使用HAL_UART_Transmit()函数进行串口发送数据,使用超时管理机制。可以使用HAL_UART_Receive()函数进行串口接收数据,同样使用超时管理机制。还可以使用HAL_UART_Transmit_IT()函数进行串口中断模式发送,使用HAL_UART_Receive_IT()函数进行串口中断模式接收。另外,还可以使用HAL_UART_Transmit_DMA()函数进行串口DMA模式发送,使用HAL_UART_Transmit_DMA()函数进行串口DMA模式接收。 在main函数后面,需要添加中断回调函数void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart),该函数是串口接收中断的回调函数。在该函数中,可以判断发生接收中断的串口,并将接收完成标志RxFlag置为1。 综上所述,以上是使用STM32CubeMX进行串口中断通信接收的配置和代码示例。 #### 引用[.reference_title] - *1* [STM32CubeMX使用串口中断方式实现串口通信](https://blog.csdn.net/boomboomy/article/details/121170004)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* *3* [STM32CubeMX实现串口中断通信](https://blog.csdn.net/qq_45945548/article/details/121153469)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值