STM32CubeMX——串口数据收发基础(HAL 库)

一、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 */

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

一、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 */

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

生成海报
点赞 0

~莘莘

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

暂无评论

发表评论

相关推荐

STM32CubeMX配置编码器测速

前言 提示:带编码器的电机很常用,用电机肯定需要测速测速,再搞搞pid啥的,最近刚上手STM32CubeMX,在这里做个记录。 我用的是STM32F103ZET6 一、S