【STM32笔记】STM32的串口数据收发基础(三)(USART中断模式)


  在STM32中编写串口通信数据收发有三种方式:轮询模式(阻塞方式),中断模式(非阻塞方式)以及DMA模式

一. 串口通信(中断模式)

  打开STM32CubeMX,前部分配置流程如串口数据收发基础(二)节里一样。配置好USART1的基本参数后,接下来就要开启USART1的串口中断了。
在这里插入图片描述
设置好之后,设置存储路径,选择所用IDE,然后点击GENERATE CODE创建工程,open project打开工程进行全局编译。

二. HAL库中串口收发的重要函数(中断模式)

1. 非阻塞式发送函数:HAL_UART_Transmit_IT ( UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size);

HAL_StatusTypeDef HAL_UART_Transmit_IT(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size);

@简介  以非阻塞模式发送一定数量的数据。
@参数  huart,串口实例的指针,指向UART_HandleTypeDef结构体的指针,该结构体包含指定UART模块的配置信息。
@参数  pData,待发送数据缓冲区的指针。
@参数  Size,待发送数据的字节数。
@返回值  函数执行状态。

2. 串口发送完毕中断回调函数 以及 串口发送过半中断回调函数

@简介  Tx传输完成的回调函数。
@参数  huart,串口实例的指针,指向UART_HandleTypeDef结构体的指针,该结构体包含指定UART模块的配置信息。
@返回值  空

__weak void HAL_UART_TxCpltCallback(UART_HandleTypeDef *huart)
{
  UNUSED(huart);
}

-----------------------------------------------------------------------

@简介  Tx传输完成过半的回调函数。
@参数  huart,串口实例的指针,指向UART_HandleTypeDef结构体的指针,该结构体包含指定UART模块的配置信息。
@返回值  空

__weak void HAL_UART_TxHalfCpltCallback(UART_HandleTypeDef *huart)
{
  UNUSED(huart);
}

3. 非阻塞式接收函数:HAL_UART_Receive_IT(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size);

HAL_StatusTypeDef HAL_UART_Receive_IT(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size)

@简介  以非阻塞模式发送一定数量的数据。
@参数  huart,串口实例的指针,指向UART_HandleTypeDef结构体的指针,该结构体包含指定UART模块的配置信息。
@参数  pData,数据接收据缓冲区的指针。
@参数  Size,待接收数据的字节数。
@返回值  函数执行状态。

2. 串口接收完毕中断回调函数 以及 串口接收过半中断回调函数

@简介  Rx接收完成过半的回调函数。
@参数  huart,串口实例的指针,指向UART_HandleTypeDef结构体的指针,该结构体包含指定UART模块的配置信息。
@返回值  空

__weak void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
  UNUSED(huart);
}

-----------------------------------------------------------------------

@简介  Rx接收完成过半的回调函数。
@参数  huart,串口实例的指针,指向UART_HandleTypeDef结构体的指针,该结构体包含指定UART模块的配置信息。
@返回值  空

__weak void HAL_UART_RxHalfCpltCallback(UART_HandleTypeDef *huart)
{
  UNUSED(huart);
}

以上提及的函数均在stm32f1xx_hal_uart.c中,在该文件中找到
在这里插入图片描述
在这里插入图片描述

三. 实现串口收发通信(中断模式)

  在mian.c文件中Private variables下的USER CODE BEGIN PV注释对中写入以下代码

/* Private variables ---------------------------------------------------------*/
/* USER CODE BEGIN PV */
unsigned char String_1[] = "hello world!!!\r\n";
unsigned char txbuff[16];
unsigned char rxbuff[3];
/* USER CODE END PV */

  在mian.c文件中Private function prototypes下的USER CODE BEGIN PFP注释对中写入以下代码

/* Private function prototypes -----------------------------------------------*/
void SystemClock_Config(void);
/* USER CODE BEGIN PFP */
// 串口接收中断回调函数
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart){
	if(huart == &huart1){
		if(rxbuff[0] == 0xAA && rxbuff[2] == 0xCC){ 				//检测输入的命令帧 AA为帧头,CC为帧尾
			if(rxbuff[1] == 0x01){ 									// 当接收到的中间控制字为0x01,点亮LED
				HAL_GPIO_WritePin(GPIOB,GPIO_PIN_4,GPIO_PIN_RESET); // 点亮LED
				sprintf((char *)txbuff,"LED open.\r\n");
			}else if(rxbuff[1] == 0x00){ 							// 当接收到的中间控制字为0x00,熄灭LED
				HAL_GPIO_WritePin(GPIOB,GPIO_PIN_4,GPIO_PIN_SET);   // 熄灭LED
				sprintf((char *)txbuff,"LED close.\r\n");
			}else{ 													//当接受到的中间控制字不为0x00或0x01时,输出error 
				sprintf((char *)txbuff,"error.\r\n");
			}
		}else{
			sprintf((char *)txbuff,"error.\r\n");
		}
		HAL_UART_Transmit_IT(&huart1,txbuff,sizeof(txbuff));
	}
	HAL_UART_Receive_IT(&huart1,rxbuff,sizeof(rxbuff));
}
/* USER CODE END PFP */

  在mian.c文件中main函数下的while中写入以下代码

/* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
	  HAL_UART_Receive_IT(&huart1,rxbuff,sizeof(rxbuff));
    /* USER CODE END WHILE */
    /* USER CODE BEGIN 3 */
  }
  /* USER CODE END 3 */

打开串口调试助手,配置好相关信息。复位开发板后,依次键入图下右侧命令帧,得到开发板发来的不同响应的数据,同时开发板上的LED灯也根据代码逻辑进行相应的反应。

在这里插入图片描述

### 回答1: STM32CubeMX是一款用于STM32微控制器的图形化配置工具,可以方便地配置USART串口通信的中断接收功能。 要使用USART中断接收功能,需要先在STM32CubeMX中配置USART的相关参数,包括波特率、数据位、停止位、校验位等。然后,在代码中开启USART中断接收功能,并编写中断服务函数来处理接收到的数据。 在中断服务函数中,可以使用HAL库提供的函数来读取接收缓冲区中的数据,并进行相应的处理。例如,可以将接收到的数据存储到一个缓冲区中,或者根据接收到的数据执行相应的操作。 需要注意的是,在使用USART中断接收功能时,需要确保接收缓冲区的大小足够大,以避免数据丢失。同时,还需要注意处理接收错误和溢出等异常情况,以保证通信的可靠性。 ### 回答2: stm32cubemx是一款功能强大的工具,可帮助用户为STM32系列微控制器生成初始化代码和配置工程。在进行工程配置的时候,我们常常会使用USART通信。而USART中断接收功能非常常用,因此我们需要学会在stm32cubemx中配置USART中断接收。下面将详细介绍如何在stm32cubemx中使用USART中断接收。 1.配置USART 首先,在stm32cubemx中配置USART,需要选中串口接口,然后设置波特率、数据位、停止位、奇偶校验等参数。在配置中断接收之前,需要先完成这个步骤。 2.配置NVIC 通过stm32cubemx配置NVIC中断控制器,需要在“Configuration”选项卡中打开“NVIC Settings”,并选择需要开启的中断,即“USARTx_IRQn”。 3.配置中断 首先,我们需要在“Code Generation”选项卡中打开“USART1 Global Interrupt”和“USART1 Interrupts”按钮,然后在“USART1_IRQn”中的“User Code”中选择“Interrupts”选项卡。接着,我们在IRQn_Type类型定义下方输入“void USART1_IRQHandler(void) {“,这就表示我们要开始编写中断服务程序。 在编写中断服务程序时,我们需要首先检测接收中断是不是因为接收到了一个字符。如果是,我们可以将这个字符存入一个缓冲区,以便后续使用。同时,要及时清除所有的中断标志位,来避免反复触发中断,例如USART_SR_RXNE标志位。 4.处理接收数据 最后,在中断中完成全部的处理过程后,我们可以从缓冲区中取出接收到的字符,并对其进行相应的处理。例如,我们可以在主循环中不断地轮询缓冲区,读取缓冲区中的数据并进行分析。 总之,在stm32cubemx中使用USART中断接收需要分别配置USART、NVIC和中断服务程序,且要保证程序在中断处理完后及时清除所有的中断标志位,来避免反复触发中断。只有这样,在大规模的数据传输和处理中,才能保证程序的正常运行。 ### 回答3: STM32CubeMX是一款功能强大的软件工具,用于帮助开发者对STMicroelectronics公司的微控制器和微处理器进行配置。对于USART中断接收,下面是一些关键的步骤: 1. 选择正确的USART模块和引脚 在STM32CubeMX中,首先需要选择正确的USART模块和引脚,并将其配置为接收模式。在“Pinout & Configuration”面板中,通过“USART”选项卡可以找到相应的设置。选择正确的通道(例如USART1或USART2),并为其分配正确的引脚。接下来,选择“Mode”选项卡,并将“Peripheral mode”设置为“Receiver”。 2. 配置相应的中断 在“NVIC Settings”选项卡中,可以对USART接收中断进行配置。首先需要启用中断,然后选择“USARTx global interrupt”(其中x是相应的USART通道号)。在中断控制器(NVIC)中,可以设置优先级和子优先级。确保将优先级设置为正确的级别,以确保正确的中断处理。 3. 编写中断服务程序 在C代码中,需要编写一个中断服务程序(ISR),以处理USART接收中断。该ISR应该包含相应的处理代码,以从接收缓冲区中读取数据。一般情况下,ISR中应该包含以下操作: - 从USART接收缓冲区读取接收到的数据; - 进行相应的错误检查(例如,数据完整性检查); -将数据存储到适当的缓冲区。 4. 启用USART接收中断 最后,在USART驱动程序中启用接收中断。这通常涉及到在USART初始化代码中启用相应的“接收中断(RXNEIE)”标志位。 综上所述,要使用STM32CubeMX进行USART中断接收,您需要选择正确的USART模块和引脚,并将其设置为接收模式。接下来,您需要配置相应的中断,并编写相应的中断服务程序。最后,您需要在USART驱动程序中启用接收中断。正确地配置和编写这些代码,将可以实现USART接收中断
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值