【无标题】STM32 串口 Printf 重定向|标准库 + HAL库 两套极简通用代码(无需MicroLIB)

一、前言:为什么你的 printf 经常报错?

新手最常见问题:

  • 重定向代码不全,必须勾选 MicroLIB 才能编译
  • 打印偶尔卡死、串口乱码、重启
  • 标准库代码放到 HAL 工程报错、函数不兼容
  • 只能打印数字,无法打印字符串、中文
    核心原因:缺少半主机模式关闭代码、底层输出函数不匹配、超时参数错误。
    本文提供 纯原创、最精简、可量产 的两套重定向模板:
    ✅ 标准库版(STM32F1/F4 标准库工程通用)
    ✅ HAL库版(CubeMX 生成工程通用)
    无需任何库配置、无需勾选 MicroLIB、零冗余、直接复制即用。

二、原理一句话看懂

C 库的 printf 底层依赖 fputc 输出单个字符。

我们重写 fputc 函数,把原本输出到电脑屏幕的数据,转发到串口 USART。

同时关闭 ARM 半主机调试模式,避免工程必须依赖 MicroLIB。


三、STM32 标准库|极简 printf 重定向(推荐量产)

适用:所有标准库工程、Keil 环境、无需 MicroLIB

使用串口:USART1,可自行修改

#include "stdio.h"

#include "stm32f10x_usart.h"

//关闭半主机模式,彻底摆脱MicroLIB

#pragma import(__use_no_semihosting)

//兼容库函数,防止编译报错

void _sys_exit(int x)

{

x = x;

}

//printf底层重定向函数

int fputc(int ch, FILE *f)

{

USART_SendData(USART1, (uint8_t)ch);

while(USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET);

return ch;

}

优势:

  • 代码最短、执行最快、无阻塞延时
  • 支持字符串、数字、小数、中文打印
  • 工程稳定,量产项目首选

四、STM32 HAL库|极简 printf 重定向(CubeMX 专用)

适用:CubeMX 生成的所有 HAL 工程、F1/F4/H7 全系列

无需修改任何配置,直接放在 usart.c 文件末尾

#include "stdio.h"

extern UART_HandleTypeDef huart1;

#pragma import(__use_no_semihosting)

void _sys_exit(int x)

{

x = x;

}

//HAL库 printf 重定向

int fputc(int ch, FILE *f)

{

HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, HAL_MAX_DELAY);

return ch;

}

如果你的串口是 USART2,只需修改 &huart2 即可。


五、最简测试代码(直接验证)

int main(void)

{

USART_Init(); //标准库初始化

//MX_USART1_UART_Init(); //HAL库初始化

复制代码
while(1)
{
    printf("Volt:%.2f\r\n",3.14f);
    printf("Status:OK\r\n");
    HAL_Delay(500);
}

}

六、工程必须注意的 5 个关键点(避坑)

1、彻底不用 MicroLIB

很多旧教程必须勾选 MicroLIB,本文代码完全不需要,避免库冲突、内存占用变大。

2、中文乱码解决

工程编码改为 UTF-8,串口助手编码同样选择 UTF-8,中文完美打印。

3、不要在中断里疯狂 printf

串口发送是轮询阻塞模式,中断高频打印会导致系统卡死、堆栈溢出。

4、必须先初始化串口,再调用 printf

顺序错误会直接串口失效、程序卡死。

5、多串口打印修改句柄即可

需要 USART2 打印,仅需把 huart1 改为 huart2,无需改其他逻辑。


七、常见报错快速解决

报错1:undefined reference to `_sys_exit'

缺少 _sys_exit 函数,复制本文完整代码即可解决。

报错2:printf 无输出、黑屏

串口未初始化、波特率不匹配、重定向句柄和实际串口不一致。

报错3:偶尔卡死

中断内调用 printf、高频率打印阻塞主线程。


八、总结(工程规范)

  1. printf 重定向核心就是重写 fputc + 关闭半主机模式;
  2. 标准库、HAL库两套代码完全独立,按需复制,零修改即可用;
  3. 不开启 MicroLIB 是现代嵌入式工程最佳规范;
  4. 串口打印仅用于调试,禁止业务逻辑高频依赖 printf。
相关推荐
碧海银沙音频科技研究院19 分钟前
炬芯ATS3089X手表的HFP通话不自动路由到设备BT的问题解决
网络·人工智能·嵌入式硬件·算法
youcans_5 小时前
【STM32C5教程】(3)GPIO 按键输入实验
stm32·单片机·嵌入式硬件
俊基科技6 小时前
回音消不掉、底噪压不住、主板还对不上口?——A-59P 多功能语音处理模组技术解析
嵌入式硬件·回音消除·ai降噪模块
北京盛世宏博7 小时前
通信异常深度排查:以太网温湿度设备 TCP 粘包、UDP 丢包根治方案
单片机·网络协议·tcp/ip·udp·以太网·传感器·温湿度
蓝天居士8 小时前
PY32F系列MCU在串口接收时跑飞的根因分析(2)
单片机·嵌入式硬件
wuyk55511 小时前
嵌入式驱动开发:量产级工程化实战(第9篇)——低功耗下的通信可靠性
c语言·驱动开发·stm32·单片机·嵌入式硬件
创界工坊工作室11 小时前
24-基于单片机的仓鼠养殖环境监控系统设计
stm32·单片机·嵌入式硬件·proteus
碧海银沙音频科技研究院11 小时前
基于炬芯ATS录音卡BLE控制协议
人工智能·嵌入式硬件·算法·语音识别
comyccccc13 小时前
PCB走线设计秘籍:从载流到3D预览全解析学习笔记
单片机·嵌入式硬件
俊基科技13 小时前
A-59 工业级 AI 语音处理模组:100 dB 消回音 + 神经网络降噪的工程实践
嵌入式硬件·神经网络·硬件开发·语音模块·回音消除·拾音降噪