一、STM32CubeMX 中关于 USART 的配置(以 USART1 为例):

1、配置异步通信:

在这里插入图片描述

2、

此处硬件流控制不使能:
在这里插入图片描述

3、设置数据属性:

在这里插入图片描述

4、使能 USART1 中断:

此处有需要则使能 USART1 中断:

在这里插入图片描述

二、代码编写:

1、HAL 库中关于串口收发重要函数:

① 阻塞式发送函数:

HAL_StatusTypeDef HAL_UART_Transmit(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size, uint32_t Timeout);
/*			阻塞式发送函数,发送未完成时函数阻塞			*/
/*
huart 参数:  实例,句柄
			  如 &huart1
			
pData 参数:  存放要发送的数据的指针

Size 参数:   存放要发送的数据的长度

Timeout 参数:超时时间,超过此长度仍未发送成功则阻塞完毕,停止发送,函数执行完毕

*/

② 非阻塞式发送函数:

HAL_StatusTypeDef HAL_UART_Transmit_IT(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size);
/*			非阻塞式发送函数,发送一半时或完毕后响应发送中断			*/
/*
huart 参数:  实例,句柄
			  如 &huart1
			
pData 参数:  存放要发送的数据的指针

Size 参数:   存放要发送的数据的长度

*/

__weak void HAL_UART_TxCpltCallback(UART_HandleTypeDef *huart);
/*			发送完毕中断回调函数			*/

__weak void HAL_UART_TxHalfCpltCallback(UART_HandleTypeDef *huart);
/*			发送一半中断回调函数			*/

③ 阻塞式接收函数:

HAL_StatusTypeDef HAL_UART_Receive(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size, uint32_t Timeout);
/*			阻塞式接收函数,接收未完成时函数阻塞			*/
/*
huart 参数:  实例,句柄
			  如 &huart1
			
pData 参数:  存放接收到的数据

Size 参数:   存放要接收的长度

Timeout 参数:超时时间,超过此长度仍未接收成功则阻塞完毕,停止接收,函数执行完毕

*/

④ 非阻塞式接收函数:

HAL_StatusTypeDef HAL_UART_Receive_IT(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size);
/*			非阻塞式接收函数,接收一半时或完毕后响应接收中断			*/
/*
huart 参数:  实例,句柄
			  如 &huart1
			
pData 参数:  存放接收到的数据

Size 参数:   存放要接收的长度

*/

__weak void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart);
/*			接收完毕中断回调函数			*/

__weak void HAL_UART_RxHalfCpltCallback(UART_HandleTypeDef *huart);
/*			接收一半中断回调函数			*/

2、参考代码:

可以注意到usart.c中的定义和初始化函数:
在这里插入图片描述

示例: 从串口接收一个 16 进制数,若接收到的数为0xA1,则翻转 LED0,并向串口发送字符串Toggle LED0!\r\n,若接收到的数为0xA2,则翻转 LED1,并向串口发送字符串Toggle LED1!\r\n

  /* USER CODE BEGIN 2 */

  HAL_UART_Receive_IT(&huart1, &cmd, 1);

  /* USER CODE END 2 */
/* USER CODE BEGIN 0 */

#define LED0_Tog HAL_GPIO_TogglePin(GPIOA, GPIO_PIN_8);
#define LED1_Tog HAL_GPIO_TogglePin(GPIOD, GPIO_PIN_2);

uint8_t cmd = 0;

void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
	if(huart->Instance == USART1){
		if(cmd == 0xA1){
			LED0_Tog;
			HAL_UART_Transmit(&huart1, "Toggle LED0!\r\n", sizeof("Toggle LED0!\r\n"),10000);
		}
		if(cmd == 0xA2){
			LED1_Tog;
			HAL_UART_Transmit(&huart1, "Toggle LED1!\r\n", sizeof("Toggle LED1!\r\n"),10000);
		}
		HAL_UART_Receive_IT(&huart1, &cmd, 1);
	}
}

/* USER CODE END 0 */

此处串口接收循环在中断中形成闭环,此闭环也可以在main函数中的while中形成,如:

  /* USER CODE BEGIN WHILE */

  while (1)
  {
    HAL_UART_Receive_IT(&huart1, &cmd, 1);

    /* USER CODE END WHILE */
/* USER CODE BEGIN 0 */

#define LED0_Tog HAL_GPIO_TogglePin(GPIOA, GPIO_PIN_8);
#define LED1_Tog HAL_GPIO_TogglePin(GPIOD, GPIO_PIN_2);

uint8_t cmd = 0;

void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
	if(huart->Instance == USART1){
		if(cmd == 0xA1){
			LED0_Tog;
			HAL_UART_Transmit(&huart1, "Toggle LED0!\r\n", sizeof("Toggle LED0!\r\n"),10000);
		}
		if(cmd == 0xA2){
			LED1_Tog;
			HAL_UART_Transmit(&huart1, "Toggle LED1!\r\n", sizeof("Toggle LED1!\r\n"),10000);
		}
	}
}

/* USER CODE END 0 */
Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐