STM32 HAL库开发学习笔记: USART1串口通讯(中断方式) IDE-STM32CubeIDE

STM32串口通讯有三种方式,分别为阻塞(轮询)、中断、DMA。这里将用中断的方式开发。

笔者也是刚入门STM32 HAL库开发,该笔记致希望于能帮到初学者,文中配置步骤、代码、实验现象均是笔者实践可行后所得,绝对真实有效。同时也希望大神前辈指出文中不足或者告之更好的开发方式,让初学者少走弯路!

目录

一、串口模式和配置

1、配置USART1为异步中断工作模式

2、串口参数设置并生成配置代码

二、代码编写

1、在main.c中定义缓存数组;

2、在main函数中打开接收中断;

3、在main.c中定义接收完成的回调函数;

4、在中断文件stm32f1xx_it.c中引用main.c中的接收缓冲数组(extern)和重新使能USART1接收中断。

三、实验现象

四、过程填坑


一、串口模式和配置

1、配置USART1为异步中断工作模式

STM32 HAL库开发学习笔记: USART1串口通讯(中断方式) IDE-STM32CubeIDE_第1张图片

2、串口参数设置并生成配置代码

STM32 HAL库开发学习笔记: USART1串口通讯(中断方式) IDE-STM32CubeIDE_第2张图片

 

二、代码编写

1、在main.c中定义缓存数组;

/* USER CODE BEGIN PV */

uint8_t OT_RxBuffer[20];

/* USER CODE END PV */

2、在main函数中打开接收中断;

  /* USER CODE BEGIN 2 */

  HAL_UART_Receive_IT(&huart1,OT_RxBuffer,10);

  /* USER CODE END 2 */

3、在main.c中定义接收完成的回调函数;

/* USER CODE BEGIN 4 */

void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)		//定义 USART1 接收完成回调函数功能
{
  /* Prevent unused argument(s) compilation warning */
//  UNUSED(huart);
  /* NOTE: This function should not be modified, when the callback is needed,
           the HAL_UART_RxCpltCallback could be implemented in the user file
   */
	HAL_UART_Transmit(&huart1, OT_UartBuffer, 10, 1000);	//将usart1接收到的数据通过usart1发�?�出�?
//	HAL_UART_Transmit_IT(&huart1, OT_UartBuffer, 10);	//用此种发送方式在回调函数中,当发送的数据没有10位时,会让返回的数据不正常
}

/* USER CODE END 4 */

4、在中断文件stm32f1xx_it.c中引用main.c中的接收缓冲数组(extern)和重新使能USART1接收中断。

/* USER CODE BEGIN PV */

extern uint8_t OT_RxBuffer[20];

/* USER CODE END PV */
void USART1_IRQHandler(void)
{
  /* USER CODE BEGIN USART1_IRQn 0 */

  /* USER CODE END USART1_IRQn 0 */
  HAL_UART_IRQHandler(&huart1);
  /* USER CODE BEGIN USART1_IRQn 1 */

  HAL_UART_Receive_IT(&huart1,OT_RxBuffer,10);

  /* USER CODE END USART1_IRQn 1 */
}

三、实验现象

将程序保存、编译后下载到STM32中,在调试助手中输入1234567890点击发送,单片机接收到数据后会把接收的数据通过串口1发送出来(蓝色是发送,绿色是接收)。

STM32 HAL库开发学习笔记: USART1串口通讯(中断方式) IDE-STM32CubeIDE_第3张图片

如果发送数据一次不足10个,不会触发接收中断,将会把后面接收到的数据补足10个后触发接收中断,再将这10个数据(多余的舍弃)发送回来。现象如下图所示。

STM32 HAL库开发学习笔记: USART1串口通讯(中断方式) IDE-STM32CubeIDE_第4张图片

四、过程填坑

学习的过程中,开始将使能接收中断的代码写在main.c中的循环体内,也可以实现上诉场景,但是当串口调试助手在快速发送数据的时候,单片机就会死机,程序跑飞。

所以建议在USART1全局中断处理函数中使能串口接收中断。

你可能感兴趣的:(STM32,单片机,stm32,串口通信,嵌入式)