如果有什么不懂的地方欢迎私聊博主,欢迎小白,博主必一一解答
在 STM32 中,UART(通用异步收发传输)是一种常用的串行通信接口,用于与其他设备(如传感器、计算机、其他微控制器等)进行数据交换。STM32 提供了丰富的 HAL 庂来配置和使用 UART 接口,本文将详细介绍如何使用 STM32 HAL 库进行 UART 编程。
1. 环境准备
确保您已经按照以下步骤准备好开发环境:
- STM32CubeIDE 已安装。
- 创建了 STM32 项目,并配置了目标 STM32 微控制器或开发板。
2. 配置 UART 外设
通过 STM32CubeMX 或 STM32CubeIDE 配置 UART 外设,STM32CubeMX 会自动生成初始化代码,简化配置流程。
步骤:
- 打开 STM32CubeIDE,创建一个新项目,选择目标 MCU 或开发板(如 STM32F103C8)。
- 打开 Pinout & Configuration 选项卡,选择 UART 引脚,通常是 TX(发送)和 RX(接收)。例如,选择
PA9
为USART1_TX
,选择PA10
为USART1_RX
。 - 进入 Configuration 选项卡,配置 UART 参数:
- 波特率:常见的波特率有 9600、115200 等。
- 数据位:通常为 8 位。
- 停止位:常用的是 1 位或 2 位。
- 校验位:可以选择无校验、奇校验或偶校验。
- 点击 Project,设置项目名称和存储路径,选择 STM32CubeIDE 作为 IDE,选择 HAL 库作为代码生成选项。
- 点击 Generate Code,STM32CubeMX 会生成代码。
3. 编写 UART 程序
生成代码后,您可以在 STM32CubeIDE 中开始编写应用程序。UART 的基本操作包括初始化、发送数据、接收数据。
3.1 UART 初始化
在 STM32CubeMX 中配置好 UART 外设后,STM32CubeMX 会生成初始化代码,在 usart.c
中,您可以看到类似以下的代码:
步骤:
- 打开 STM32CubeIDE,创建一个新项目,选择目标 MCU 或开发板(如 STM32F103C8)。
- 打开 Pinout & Configuration 选项卡,选择 UART 引脚,通常是 TX(发送)和 RX(接收)。例如,选择
PA9
为USART1_TX
,选择PA10
为USART1_RX
。 - 进入 Configuration 选项卡,配置 UART 参数:
- 波特率:常见的波特率有 9600、115200 等。
- 数据位:通常为 8 位。
- 停止位:常用的是 1 位或 2 位。
- 校验位:可以选择无校验、奇校验或偶校验。
- 点击 Project,设置项目名称和存储路径,选择 STM32CubeIDE 作为 IDE,选择 HAL 库作为代码生成选项。
- 点击 Generate Code,STM32CubeMX 会生成代码。
3. 编写 UART 程序
生成代码后,您可以在 STM32CubeIDE 中开始编写应用程序。UART 的基本操作包括初始化、发送数据、接收数据。
3.1 UART 初始化
在 STM32CubeMX 中配置好 UART 外设后,STM32CubeMX 会生成初始化代码,在 usart.c
中,您可以看到类似以下的代码:
/* USART1 init function */
void MX_USART1_UART_Init(void)
{
huart1.Instance = USART1; //串口句柄
huart1.Init.BaudRate = 9600; //设置波特率
huart1.Init.WordLength = UART_WORDLENGTH_8B; //设置8位数据位
huart1.Init.StopBits = UART_STOPBITS_1; //设置1位停止位
huart1.Init.Parity = UART_PARITY_NONE; //设置无奇偶校验
huart1.Init.Mode = UART_MODE_TX_RX; //模式为收发模式
huart1.Init.HwFlowCtl = UART_HWCONTROL_NONE; //设置无硬件流控
if (HAL_UART_Init(&huart1) != HAL_OK) //调用串口初始化函数
{
Error_Handler();
}
}
3.2 UART 发送数据
通过 UART 发送数据,使用 HAL_UART_Transmit
函数
uint8_t data[] = "Hello, STM32!";
if (HAL_UART_Transmit(&huart1, data, sizeof(data)-1, HAL_MAX_DELAY) != HAL_OK)
{
// 发送失败
}
参数说明:
huart1
: UART 外设句柄。data
: 发送的数据数组。sizeof(data)-1
: 数据长度(去掉最后的\0
)。HAL_MAX_DELAY
: 超时设置。
3.3 UART 接收数据
通过 UART 接收数据,使用 HAL_UART_Receive
函数。
uint8_t received_data[10]; // 用于接收数据的缓冲区
if (HAL_UART_Receive(&huart1, received_data, sizeof(received_data), HAL_MAX_DELAY) != HAL_OK)
{
// 接收失败
}
参数说明:
huart1
: UART 外设句柄。received_data
: 接收的数据缓冲区。sizeof(received_data)
: 缓冲区大小。HAL_MAX_DELAY
: 超时设置,最大等待时间。
3.4 异常处理与超时
通过设置超时时间。如果操作超时,HAL_UART_Transmit
和 HAL_UART_Receive
会返回 HAL_ERROR
或 HAL_TIMEOUT
错误。可以使用 HAL_UART_ErrorCallback
来捕获错误:
void HAL_UART_ErrorCallback(UART_HandleTypeDef *huart)
{
if (huart->Instance == USART1)
{
// 处理错误(如溢出、帧错误、校验错误等)
}
}
4. 配置中断模式(可选)
UART 接收还可以通过中断或 DMA 进行处理,从而实现异步接收。以下是通过中断模式接收数据的配置和代码示例。
4.1 配置中断
在 STM32CubeMX 中启用 UART 的接收中断。选择 NVIC Settings,启用 USART1_IRQn
中断。
4.2 编写中断服务程序
当数据接收完成时,微控制器会触发中断,跳转到中断服务程序。示例如下:
void USART1_IRQHandler(void)
{
HAL_UART_IRQHandler(&huart1); // 调用 HAL 库的中断处理函数
}
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
if (huart->Instance == USART1)
{
// 接收到数据后,执行回调函数
// 处理接收到的数据
}
}
4.3 启动接收中断
在主程序中启动 UART 的接收中断:
HAL_UART_Receive_IT(&huart1, received_data, sizeof(received_data));
5. 完整的示例代码
以下是一个完整的示例,演示如何使用 UART 发送和接收数据:
#include "main.h"
#include "usart.h"
#include "gpio.h"
// 发送数据
void UART_Transmit(uint8_t* data, uint16_t size)
{
if (HAL_UART_Transmit(&huart1, data, size, HAL_MAX_DELAY) != HAL_OK)
{
// 错误处理
}
}
// 接收数据
void UART_Receive(uint8_t* buffer, uint16_t size)
{
if (HAL_UART_Receive(&huart1, buffer, size, HAL_MAX_DELAY) != HAL_OK)
{
// 错误处理
}
}
int main(void)
{
// 初始化 HAL 库
HAL_Init();
// 配置系统时钟
SystemClock_Config();
// 初始化 GPIO 和 UART 外设
MX_GPIO_Init();
MX_USART1_UART_Init();
uint8_t send_data[] = "Hello from STM32!";
uint8_t recv_data[50];
// 发送数据
UART_Transmit(send_data, sizeof(send_data)-1);
// 接收数据
UART_Receive(recv_data, sizeof(recv_data));
// 在这里可以处理接收到的数据
// 例如,将接收到的数据通过 UART 再次发送
UART_Transmit(recv_data, sizeof(recv_data));
while (1)
{
// 主循环
}
}
6. 小结
- UART 初始化:通过 STM32CubeMX 配置 UART 外设,并在
usart.c
中生成初始化代码。 - 数据发送与接收:使用
HAL_UART_Transmit
和HAL_UART_Receive
进行同步数据传输。 - 中断模式:启用 UART 接收中断,实现异步数据接收。
- DMA模式:可进一步通过 DMA 进行大数据量的高效传输。
通过上述步骤,您可以实现 UART 的基本使用。可以根据需求进一步优化,例如通过 DMA 实现更高效的通信,或通过 RTOS 中的任务管理 UART 通信。