【STM32Cube HAL】USART发送/接收(二)

实验内容:通过上位机发送数据,MCU接收到以后,发送数据到上位机

一、原理图

 二、 CubeMX配置

Step1. 打开 STM32CubeMX ,点击“ New Project ”,选择芯片型号, STM32F103VETx

 Step2.选择时钟源,并配置时钟树。选择Crystal/Ceramic Resonator,并配置系统时钟为72M。

  

Step3.配置SYS,我们这里选择的是Serial Wire。(正常情况配置不配置不影响,debug可以使用。但是你不可以把这两个引脚用于其他复用功能,如果用于其他复用功能,debug就不起作用了。)

 

Step4.配置串口通讯参数

基本参数设置

串口中断配置(我们这里需要用到接收中断)

 IO口配置(要确认IO口是否与我们实际电路一致,如果不一致需要手动通过搜索栏修改IO口)

 因为我们这边没有使用到DMA所以不需要去配置。

到这里关于串口参数配置基本已经完成,只需要根据之前文章《STM32Cube HAL:GPIO输入/输出(一)Step4-Step8,设置相关工程参数和生成代码。

三、添加功能代码

定义全局变量用来存储接收到的数据:

uint8_t rx_data;

 在主函数中使能接收中断函数:

HAL_UART_Receive_IT(&huart1,&rx_data,1); //使能接收中断,每接收1个字
	                                     //节会进入一次回调函数

在main.c文件中添加回调函数:

void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
	HAL_UART_Transmit(&huart1,&rx_data,1,1000);
	HAL_UART_Receive_IT(&huart1,&rx_data,1);//回调函数中需要重新使能中断
}                                         //否则下次无法进入回调函数

至此,就可以实现上位机给MCU发送一个字节数据,MCU接收到数据又返回给上位机的实验效果。

本文主要注意的是中断服务函数和回调函数区别。中断服务函数是在接收到数据都会进去一次,而进入回调函数的条件则取决于HAL_UART_Receive_IT(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size) 中的Size,当Size=1时,接受到一个字节数据就进入中断函数,然后再进入到回调函数中。

猜你喜欢

转载自blog.csdn.net/qq_29031103/article/details/119893758