实验内容:通过上位机发送数据,MCU接收到以后,发送数据到上位机。
一、原理图
二、 CubeMX配置
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时,接受到一个字节数据就进入中断函数,然后再进入到回调函数中。