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为异步中断工作模式
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发送出来(蓝色是发送,绿色是接收)。
如果发送数据一次不足10个,不会触发接收中断,将会把后面接收到的数据补足10个后触发接收中断,再将这10个数据(多余的舍弃)发送回来。现象如下图所示。
四、过程填坑
学习的过程中,开始将使能接收中断的代码写在main.c中的循环体内,也可以实现上诉场景,但是当串口调试助手在快速发送数据的时候,单片机就会死机,程序跑飞。
所以建议在USART1全局中断处理函数中使能串口接收中断。
如果觉得《STM32 HAL库开发学习笔记: USART1串口通讯(中断方式) IDE-STM32CubeIDE》对你有帮助,请点赞、收藏,并留下你的观点哦!