在嵌入式开发中,MCU通过UART与外设或上位机进行通信是一项重要且常见的任务。本文将以STM32F103C8T6为例,介绍如何通过UART实现基本通信功能。通过这篇文章,你将了解如何配置UART外设、实现数据发送与接收,并掌握调试中需要注意的关键点。
一、STM32F103C8T6简介STM32F103C8T6是ST公司推出的一款基于ARM Cortex-M3内核的MCU,具有64KB Flash和20KB SRAM,主频可达72MHz。它支持多种外设接口,包括USART、SPI、I2C等,非常适合用于中小型嵌入式项目。
二、硬件连接在进行UART通信前,需要将STM32的相关引脚与外部设备连接:
- STM32 TX (PA9) 接至外设 RX
- STM32 RX (PA10) 接至外设 TX
- 共用地线
硬件准备完成后,就可以进入代码实现部分。
三、代码实现以下代码使用STM32 HAL库实现UART通信。开发环境为STM32CubeIDE,主要功能包括UART初始化、数据发送与接收。
#include "main.h"
#include <string.h>
// UART句柄定义
UART_HandleTypeDef huart1;
// UART初始化函数
void MX_USART1_UART_Init(void) {
huart1.Instance = USART1;
huart1.Init.BaudRate = 9600;
huart1.Init.WordLength = UART_WORDLENGTH_8B;
huart1.Init.StopBits = UART_STOPBITS_1;
huart1.Init.Parity = UART_PARITY_NONE;
huart1.Init.Mode = UART_MODE_TX_RX;
huart1.Init.HwFlowCtl = UART_HWCONTROL_NONE;
huart1.Init.OverSampling = UART_OVERSAMPLING_16;
if (HAL_UART_Init(&huart1) != HAL_OK) {
Error_Handler();
}
}
// 数据发送函数
void UART_SendData(char *data) {
HAL_UART_Transmit(&huart1, (uint8_t *)data, strlen(data), HAL_MAX_DELAY);
}
// 数据接收函数
void UART_ReceiveData(char *buffer, uint16_t size) {
HAL_UART_Receive(&huart1, (uint8_t *)buffer, size, HAL_MAX_DELAY);
}
// 主函数
int main(void) {
HAL_Init(); // 初始化HAL库
SystemClock_Config(); // 配置系统时钟
MX_USART1_UART_Init(); // 初始化UART1
char tx_data[] = "Hello, UART!";
char rx_data[20];
while (1) {
// 发送数据
UART_SendData(tx_data);
HAL_Delay(1000);
// 接收数据(示例)
UART_ReceiveData(rx_data, sizeof(rx_data));
// 假设收到数据后处理
}
}
四、关键步骤解析- UART初始化
通过MX_USART1_UART_Init函数配置波特率、数据位长度、停止位等参数。这些配置需要根据外设通信协议的要求进行调整。
- 数据发送
使用HAL_UART_Transmit函数完成数据的发送,传入数据指针、长度和超时时间。
- 数据接收
通过HAL_UART_Receive实现接收功能,需要提前准备好接收缓冲区。
- 调试要点
- 检查硬件连接是否正确,尤其是交叉连接的TX与RX。
- 配置的波特率和外设端是否一致。
- 使用示波器或逻辑分析仪检查信号。
五、扩展功能- DMA支持
为了提高通信效率,可以启用DMA模式,避免占用CPU资源。 - 中断处理
使用UART中断方式可以实现非阻塞通信,特别适合实时性要求高的场景。
六、总结本文通过实例讲解了STM32F103C8T6的UART通信实现,涵盖了从硬件连接到代码实现的全过程。UART作为一种经典的通信协议,其在嵌入式开发中的应用极其广泛,熟练掌握UART能为更复杂的项目开发打下坚实基础。
|