# STM32F103 串口打印配置(HAL库)
下面是在STM32F103上配置串口打印的完整步骤(使用HAL库):
1. 硬件准备
- STM32F103系列开发板
- USB转TTL模块(如CH340、CP2102等)
- 连接线(TX、RX、GND)
2. CubeMX配置
-
打开STM32CubeMX,新建工程选择对应型号
-
在"Pinout & Configuration"标签页中:
- 启用USART1(或其他USART)
- 模式选择"Asynchronous"
- 配置引脚(通常PA9-TX, PA10-RX)
-
参数配置:
- Baud Rate: 115200
- Word Length: 8 bits
- Parity: None
- Stop Bits: 1
- Flow Control: None
-
NVIC设置:
- 启用USART全局中断(如果需要中断接收)
-
生成代码(选择工具链为MDK-ARM/IAR/其他)
3. 代码实现
方法一:使用HAL库直接打印
#include "main.h"
#include <stdio.h>UART_HandleTypeDef huart1; // 假设使用USART1// 重定向printf到串口
int __io_putchar(int ch)
{HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, HAL_MAX_DELAY);return ch;
}// 或者使用更完整的实现
int _write(int file, char *ptr, int len)
{HAL_UART_Transmit(&huart1, (uint8_t *)ptr, len, HAL_MAX_DELAY);return len;
}// 在主函数初始化后使用
int main(void)
{HAL_Init();SystemClock_Config();MX_GPIO_Init();MX_USART1_UART_Init();printf("System initialized!\r\n");while (1){printf("Hello World!\r\n");HAL_Delay(1000);}
}
方法二:直接使用HAL_UART_Transmit函数
void send_string(UART_HandleTypeDef *huart, char *str)
{HAL_UART_Transmit(huart, (uint8_t *)str, strlen(str), HAL_MAX_DELAY);
}// 使用示例
send_string(&huart1, "Hello via UART\r\n");
4. 项目设置(针对Keil MDK)
- 确保在"Options for Target" -> “Target"中勾选了"Use MicroLIB”
- 如果使用标准库,需要实现_write或__io_putchar
5. 常见问题解决
-
没有输出:
- 检查TX/RX接线是否正确(开发板TX接模块RX,开发板RX接模块TX)
- 检查波特率是否匹配
- 检查时钟配置是否正确
-
乱码:
- 通常是波特率不匹配或时钟配置错误
- 检查系统时钟和USART时钟配置
-
只能发送一次:
- 确保没有在中断服务程序中阻塞
- 检查硬件流控制设置
6. 高级功能
接收数据(中断方式)
// 在main.c中添加缓冲区
uint8_t rx_buffer[1];// 在初始化后启动接收
HAL_UART_Receive_IT(&huart1, rx_buffer, 1);// 实现接收回调函数
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{if(huart->Instance == USART1){// 处理接收到的数据(rx_buffer[0])// 重新启动接收HAL_UART_Receive_IT(&huart1, rx_buffer, 1);}
}
DMA传输(高效方式)
// 在CubeMX中启用USART DMA
// 发送通道选择Memory to Peripheral
// 接收通道选择Peripheral to Memory// 发送数据示例
uint8_t data[] = "DMA Transfer\r\n";
HAL_UART_Transmit_DMA(&huart1, data, sizeof(data));
以上配置适用于STM32F103系列大多数型号,根据具体硬件可能需要进行微调。