本文首先讲解STM32CubeMX配置串口的操作,以及HAL库串口函数接口,详细的讲解各种收发方式(普通收发、中断收发、DMA收发),本文将HAL库与STM32CubeMX结合在一起讲解,可以更快速的学会各种收发方式的使用。
UART 是指数据一位一位地顺序传送,其特点是通信线路简单,只要一对传输线就可以实现双向通信,特别适用于远距离通信,但传送速度较慢。可实现全双工。
本文提供在中断接收后普通发送回显的示例代码;
后续还有DMA实现不定长收发示例代码; 【STM32】串口DMA空闲中断不定长收发配自定义装包与解包
DMA双缓冲收发。 【STM32】串口DMA之双缓冲
基本所有常用方式全部涵盖,一次通透。
所用工具:
- 开发板:野火挑战者STM32H743IIT6
- STM32CubeMX
- IDE: Keil-MDK
STM32CubeMX UART配置
- 时钟配置 (如不了解点击下面链接)
【STM32】CubeMX+HAL库之时钟.


- UART配置
1.选择所需UART
2.选择Mode为异步通讯方式(常用)
3.设置基础参数:波特率为115200 Bits/s;传输数据长度为8 Bit;奇偶检验无;停止位1;接收和发送都使能 。
注意 CubeMX默认打开的引脚确实为最常用的引脚,但有时与电路板并不相符。

- UART中断方式设置/DMA设置
1.如使用普通收发模式可以什么都不用配置
2.使用中断接收就需要开启中断使能

3.使用DMA就需要开启DMA 相关通道并选择模式(常规、循环)
注意 需要TX还是RX就打开相应的通道

- 生成代码 点击右上角 GENERATE CODE
HAL库函数介绍
HAL_UART_Transmit(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size, uint32_t Timeout);
HAL_UART_Receive(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size, uint32_t Timeout);
HAL_UART_Transmit_IT(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size);
HAL_UART_Receive_IT(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size);
HAL_UART_Transmit_DMA(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size);
HAL_UART_Receive_DMA(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size);
函数分别是普通模式超时管理的发收、中断模式的发收、DMA模式下的发收。按需求直接使用就可以了。
普通发送接收在需要处调用就可以了;
中断模式接收一般将处理函数放入 HAL_UART_RxCpltCallback 串口接收中断回调函数中,在处理完后需要重新调用 HAL_UART_Receive_IT中断接收函数,否则函数只执行一次。
DMA模式下Mode 有循环模式和普通模式,循环模式只需调用一次,然后就一直装数据,而普通模式需要在在使用时调用。
代码示例
中断接收,普通发送回显接收内容
首先在main.c 中加入
/* USER CODE BEGIN 2 */
HAL_UART_Receive_IT(&huart1, (uint8_t *)&RxTemp, 1);
/* USER CODE END 2 */
新建 bsp_uart.c 代码如下
1
#include "bsp_uart.h"
#include "string.h"
#include "main.h"
#include "usart.h"
uint8_t RxBuf[256]; //作为接收后发送数据的Buffer
uint16_t RxCount = 0;
uint8_t RxTemp; //中断接收缓冲
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
UNUSED(huart);
if(huart->Instance == USART1)
{
if(RxCount >= 255)
{
RxCount = 0;
memset(RxBuf,0x00,sizeof(RxBuf));
}
else
{
RxBuf[RxCount++] = RxTemp; //接收数据转存
if(RxTemp == 0x0A) /* 自定义通信协议,遇到回车换行符认为1个命令帧,
可自行加其它判断实现自定义命令 */
{
HAL_UART_Transmit(&huart1, (uint8_t *)&RxBuf, RxCount,0xFFFF); //将收到的信息发送回显
while(HAL_UART_GetState(&huart1) == HAL_UART_STATE_BUSY_TX);//检测UART发送结束
RxCount = 0;
memset(RxBuf,0x00,sizeof(RxBuf)); //清空数组
}
}
}
HAL_UART_Receive_IT(&huart1, (uint8_t *)&RxTemp, 1);
}
本文首先讲解STM32CubeMX配置串口的操作,以及HAL库串口函数接口,详细的讲解各种收发方式(普通收发、中断收发、DMA收发),本文将HAL库与STM32CubeMX结合在一起讲解,可以更快速的学会各种收发方式的使用。
UART 是指数据一位一位地顺序传送,其特点是通信线路简单,只要一对传输线就可以实现双向通信,特别适用于远距离通信,但传送速度较慢。可实现全双工。
本文提供在中断接收后普通发送回显的示例代码;
后续还有DMA实现不定长收发示例代码; 【STM32】串口DMA空闲中断不定长收发配自定义装包与解包
DMA双缓冲收发。 【STM32】串口DMA之双缓冲
基本所有常用方式全部涵盖,一次通透。
所用工具:
- 开发板:野火挑战者STM32H743IIT6
- STM32CubeMX
- IDE: Keil-MDK
STM32CubeMX UART配置
- 时钟配置 (如不了解点击下面链接)
【STM32】CubeMX+HAL库之时钟.


- UART配置
1.选择所需UART
2.选择Mode为异步通讯方式(常用)
3.设置基础参数:波特率为115200 Bits/s;传输数据长度为8 Bit;奇偶检验无;停止位1;接收和发送都使能 。
注意 CubeMX默认打开的引脚确实为最常用的引脚,但有时与电路板并不相符。

- UART中断方式设置/DMA设置
1.如使用普通收发模式可以什么都不用配置
2.使用中断接收就需要开启中断使能

3.使用DMA就需要开启DMA 相关通道并选择模式(常规、循环)
注意 需要TX还是RX就打开相应的通道

- 生成代码 点击右上角 GENERATE CODE
HAL库函数介绍
HAL_UART_Transmit(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size, uint32_t Timeout);
HAL_UART_Receive(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size, uint32_t Timeout);
HAL_UART_Transmit_IT(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size);
HAL_UART_Receive_IT(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size);
HAL_UART_Transmit_DMA(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size);
HAL_UART_Receive_DMA(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size);
函数分别是普通模式超时管理的发收、中断模式的发收、DMA模式下的发收。按需求直接使用就可以了。
普通发送接收在需要处调用就可以了;
中断模式接收一般将处理函数放入 HAL_UART_RxCpltCallback 串口接收中断回调函数中,在处理完后需要重新调用 HAL_UART_Receive_IT中断接收函数,否则函数只执行一次。
DMA模式下Mode 有循环模式和普通模式,循环模式只需调用一次,然后就一直装数据,而普通模式需要在在使用时调用。
代码示例
中断接收,普通发送回显接收内容
首先在main.c 中加入
/* USER CODE BEGIN 2 */
HAL_UART_Receive_IT(&huart1, (uint8_t *)&RxTemp, 1);
/* USER CODE END 2 */
新建 bsp_uart.c 代码如下
1
#include "bsp_uart.h"
#include "string.h"
#include "main.h"
#include "usart.h"
uint8_t RxBuf[256]; //作为接收后发送数据的Buffer
uint16_t RxCount = 0;
uint8_t RxTemp; //中断接收缓冲
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
UNUSED(huart);
if(huart->Instance == USART1)
{
if(RxCount >= 255)
{
RxCount = 0;
memset(RxBuf,0x00,sizeof(RxBuf));
}
else
{
RxBuf[RxCount++] = RxTemp; //接收数据转存
if(RxTemp == 0x0A) /* 自定义通信协议,遇到回车换行符认为1个命令帧,
可自行加其它判断实现自定义命令 */
{
HAL_UART_Transmit(&huart1, (uint8_t *)&RxBuf, RxCount,0xFFFF); //将收到的信息发送回显
while(HAL_UART_GetState(&huart1) == HAL_UART_STATE_BUSY_TX);//检测UART发送结束
RxCount = 0;
memset(RxBuf,0x00,sizeof(RxBuf)); //清空数组
}
}
}
HAL_UART_Receive_IT(&huart1, (uint8_t *)&RxTemp, 1);
}
举报