UART(通用异步收发传输器)是 STM32 与外部设备进行串行通信的重要接口。
串口通信基础
- 波特率:通信速度,如 9600、115200
- 数据位:5-9 位,通常使用 8 位
- 停止位:1、1.5、2 位
- 校验位:无校验、奇校验、偶校验
串口初始化
UART_HandleTypeDef huart1;
// 配置串口1参数
huart1.Instance = USART1;
huart1.Init.BaudRate = 115200; // 波特率
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();
}
串口发送数据
// 发送字符串
char message[] = "Hello STM32!\r\n";
HAL_UART_Transmit(&huart1, (uint8_t*)message, strlen(message), HAL_MAX_DELAY);
// 发送格式化数据
char buffer[50];
int value = 123;
sprintf(buffer, "Value: %d\r\n", value);
HAL_UART_Transmit(&huart1, (uint8_t*)buffer, strlen(buffer), HAL_MAX_DELAY);
// 发送单个字符
HAL_UART_Transmit(&huart1, (uint8_t*)"A", 1, HAL_MAX_DELAY);
串口接收数据
// 轮询方式接收
uint8_t rx_data;
if (HAL_UART_Receive(&huart1, &rx_data, 1, 100) == HAL_OK)
{
// 处理接收到的数据
if (rx_data == 'A')
{
HAL_GPIO_TogglePin(GPIOA, GPIO_PIN_5);
}
}
// 中断方式接收
uint8_t rx_buffer[10];
HAL_UART_Receive_IT(&huart1, rx_buffer, 10);
// 接收完成回调函数
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
if (huart->Instance == USART1)
{
// 处理接收完成的数据
// 重新启动接收
HAL_UART_Receive_IT(&huart1, rx_buffer, 10);
}
}
串口重定向 printf
#include
// 重写 _write 函数
int _write(int file, char *ptr, int len)
{
HAL_UART_Transmit(&huart1, (uint8_t*)ptr, len, HAL_MAX_DELAY);
return len;
}
// 使用示例
printf("System started!\r\n");
printf("Temperature: %.2f°C\r\n", 25.5);
printf("ADC Value: %d\r\n", adc_value);
常用串口函数
HAL_UART_Transmit() - 阻塞式发送
HAL_UART_Receive() - 阻塞式接收
HAL_UART_Transmit_IT() - 中断发送
HAL_UART_Receive_IT() - 中断接收
HAL_UART_Transmit_DMA() - DMA 发送
HAL_UART_Receive_DMA() - DMA 接收
提示: 这是一个重要的概念,需要特别注意理解和掌握。
注意: 这是一个常见的错误点,请避免犯同样的错误。