STM32CubeMX实现串口中断通信


一. 环境

  • 硬件:stm32f103c8t6 核心板
  • 软件:STM32CubeMX 6.3.0
  • 软件:keil5 mdk

二. 使用STM32CubeMX

这里与前一篇文章只在于多了个开启串口中断使能。STM32CubeMX实现串口通信_diyu-CSDN博客

image-20211104162750224

三. USART中断通信

1. UART函数库介绍

结构体以及函数定义均在头文件: stm32f1xx_hal_uart.h

  • UART结构体定义
UART_HandleTypeDef huart1;
  • 串口发送/接收函数

HAL_UART_Transmit():串口发送数据,使用超时管理机制
HAL_UART_Receive():串口接收数据,使用超时管理机制
HAL_UART_Transmit_IT():串口中断模式发送
HAL_UART_Receive_IT():串口中断模式接收
HAL_UART_Transmit_DMA():串口DMA模式发送
HAL_UART_Transmit_DMA():串口DMA模式接收

  • 串口中断函数

HAL_UART_IRQHandler(UART_HandleTypeDef *huart); //串口中断处理函数
HAL_UART_TxCpltCallback(UART_HandleTypeDef *huart); //串口发送中断回调函数
HAL_UART_TxHalfCpltCallback(UART_HandleTypeDef *huart); //串口发送一半中断回调函数(用的较少)
HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart); //串口接收中断回调函数
HAL_UART_RxHalfCpltCallback(UART_HandleTypeDef *huart);//串口接收一半回调函数(用的较少)
HAL_UART_ErrorCallback();串口接收错误函数

2. 编写代码

在文件main.cmain函数外部 添加以下代码

#define LENGTH 4     //接受缓冲区大小
uint8_t	RxBuffer[LENGTH];   //接受缓冲区 
uint8_t RxFlag = 0;       //接收完成标志;0表示接受未完成,1表示接收完成

图中 #define LENGTH 4 这个没有显示出来,但是必须要添加
在这里插入图片描述

main函数内部,while循环外部添加以下代码

//发送提示信息
HAL_UART_Transmit(&huart1,(uint8_t *)"****UART commucition using IT****\n",34,HAL_MAX_DELAY);  
HAL_UART_Transmit(&huart1,(uint8_t *)"Please enter 4 characters: \n",30,HAL_MAX_DELAY);
//使能接收中断
HAL_UART_Receive_IT(&huart1, (uint8_t *)RxBuffer,LENGTH); 

image-20211104224536349

while循环内部添加一下代码

while (1)
  {
    /* USER CODE END WHILE */
   
    /* USER CODE BEGIN 3 */
     //添加下面代码
   HAL_UART_Transmit(&huart1, (uint8_t *)"hello windows!\r\n", 16 , HAL_MAX_DELAY);
	HAL_Delay(1000);  //延时1s
	if(RxFlag == 1)  //如果接受完成,不在发送数据
	{
		HAL_UART_Transmit(&huart1,(uint8_t *)"Recevie Success!\n",17,HAL_MAX_DELAY);  //提示接受成功
		break;  //退出循环,不在发送数据
	}
  }

image-20211104224237555

main函数后面,添加中断回调函数

void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)  //串口接收中断回调函数
{
	if(huart->Instance == USART1)   //判断发生接收中断的串口
	{
		RxFlag=1;   //置为接收完成标志
	}
}

image-20211104224307333

3. 最终效果

编译,将程序烧录或下载进核心板,打开串口助手查看接收到的数据。

波特率、停止位、数据位、校验位要与配置的一致

当串口没有接受4个字节内容时,每隔一秒串口发送 “hello windows”

image-20211104225030822

当发送4个字节内容时,比如发送“stop”,串口接受完毕后,发送“Recevie Success!”表示接收成功后,不再发送数据

image-20211104225326592

四. 软件调试

如果要进行软件调试,与前一篇文章相同。STM32CubeMX实现串口通信_diyu-CSDN博客

五. 总结

总体而言还是很简单的,只要了解HAL库中的串口发送接收函数以及中断函数,然后调用即可。

这种方式只能固定长度收发,想实现任意长数据收发,可以采用IDLE中断以及DMA接收。

在使用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 ]
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值