摘要
本章讲解STM32单片机的串行通信使用方法,主要讲解STM32 HAL库的轮询与中断方式的串口通信。实现单片机将串口接收到的数据再次发送出去。
配置工程
复制复制 STM32CubeMX系列教程0:创建工程 创建的工程目录GPIO_test,修改文件目录名称为USART,双击打开GPIO_test.ioc。
串口轮询方式发送
启用串口通信
配置USART1为异步通信方式,默认波特率为115200bps,同时自动设置PA9与PA10为串口的发送与接收引脚。其他参数默认,无需更改。设置完成,点击生成代码。
编写用户代码
打开生成的代码,打开mian.c入口文件,找到main(void)函数,删除while中原有的代码。
添加新的代码
HAL_UART_Transmit(&huart1,(uint8_t *)"USART_TEST\r\n",12,100); //以轮询的方式发送字符串
HAL_Delay(500); //延时500ms
HAL_UART_Transmit(&huart1,(uint8_t*)"USART_TEST\r\n",12,100);
这条语句的功能是以串口1发送字符串“USART_TEST\r\n”,12表示12个字符,100表示超时时间100ms。这个函数来自于stm32f4xx_hal_uart.c
编译下载
代码编写完成后,编译下载进入单片机。
STM32单片机程序下载方法有多种,有需要请跳转
STM32程序下载0:STM32CubeProgrammer安装
STM32程序下载1:通过keil-ST-Link方式下载
STM32程序下载2:通过STM32CubePro-ST-Link下载
STM32程序下载3:通过STM32CubePro-UART下载
STM32程序下载4:通过STM32CubePro-USB下载
选择你所需要的程序下载方法。
下载完成,点击复位。打开串口助手,连接到相应的端口,设置波特率为115200,即可接收到单片机发送的数据。
中断方式收发
启动串口中断
回到STM32CubeMX,其他参数不变,依然是选中串口1,启动异步通信,打开中断设置,勾选USART1全局中断。
编写用户代码
配置完成后,重新生成代码,打开生成的代码,在main.c文件的用户变量去建立串口接收缓冲区数组。
uint8_t rx1_buf[10];
找到主函数,在while语句之前,开始通过串口中断接收数据。
HAL_UART_Receive_IT(&huart1,rx1_buf,10);
这句话的意思是以中断的方式从串口1接收数据,接收道到的数据存在rx1_buf数组中,每次接收10个字节。
这个函数的实现是在stm32f4xx_hal_uart.c
中。
删除while语句中的程序。
编写中断回调函数
在main.c文件的底部,填入串口中断接收回调函数,
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart){ if(huart == &huart1) //判断中断是否来自于串口1
{
HAL_UART_Transmit_IT(&huart1,rx1_buf,10); //将接收到的数据通过中断的方式发送出去
HAL_UART_Receive_IT(&huart1,rx1_buf,10); //开始接收下一轮数据
}
}
编译下载
代码编写完成后,编译下载进入单片机。
STM32单片机程序下载方法有多种,有需要请跳转
STM32程序下载0:STM32CubeProgrammer安装
STM32程序下载1:通过keil-ST-Link方式下载
STM32程序下载2:通过STM32CubePro-ST-Link下载
STM32程序下载3:通过STM32CubePro-UART下载
STM32程序下载4:通过STM32CubePro-USB下载
选择你所需要的程序下载方法。
下载完成,点击复位。打开串口助手,连接到相应的端口,设置波特率为115200,从串口助手向单片机发送10个字节的数据,单片机将会把发过去的数据在返回给串口助手。必须发够10个字节的数据,才能够触发中断。
串口相关函数
串口的发送接收函数:
HAL_UART_Transmit(); 串口轮询模式发送,使用超时管理机制。
HAL_UART_Receive(); 串口轮询模式接收,使用超时管理机制。
HAL_UART_Transmit_IT(); 串口中断模式发送,
HAL_UART_Receive_IT(); 串口中断模式接收
HAL_UART_Transmit_DMA(); 串口DMA模式发送
HAL_UART_Receive_DMA(); 串口DMA模式接收
串口相关的中断函数:
HAL_UART_TxHalfCpltCallback(); 一半数据(half transfer)发送完成后,通过中断处理函数调用。
HAL_UART_TxCpltCallback(); 发送完成后,通过中断处理函数调用。
HAL_UART_RxHalfCpltCallback(); 一半数据(half transfer)接收完成后,通过中断处理函数调用。
HAL_UART_RxCpltCallback(); 接收完成后,通过中断处理函数调用。
HAL_UART_ErrorCallback(); 传输过程中出现错误时,通过中断处理函数调用。
可看到串口发送和就是有三种通信模式:
第一种是上面用到的轮询的模式。CPU不断查询IO设备,如设备有请求则加以处理。例如CPU不断查询串口是否传输完成,如传输超过则返回超时错误。轮询方式会占用CPU处理时间,效率较低。
第二种就是中断控制方式。当I/O操作完成时,输入输出设备控制器通过中断请求线向处理器发出中断信号,处理器收到中断信号之后,转到中断处理程序,对数据传送工作进行相应的处理。
第三种就是直接内存存取技术(DMA)方式。所谓直接传送,即在内存与IO设备间传送一个数据块的过程中,不需要CPU的任何中间干涉,只需要CPU在过程开始时向设备发出“传送块数据”的命令,然后通过中断来得知过程是否结束和下次操作是否准备就绪。