STM32printf重定向到串口含armcc和gcc两种方案

常见开发环境下printf重定向方法 MCU,常用开发环境,printf重定向 阅读详情
AI摘要

本文介绍在STM32上实现函数的串口重定向,包括MDK(Keil)和GCC两种编译器环境。针对不同编译器采取不同实现方式,还可通过预处理器宏定义进行兼容性处理。此外,若需支持浮点数打印,要在Makefile中添加特定链接选项。

在STM32上实现printf函数的串口重定向

无论是在MDK(Keil)还是GCC编译器环境中,通过重写底层字符输出函数,使得标准库中的printf系列函数可以通过UART串口发送数据到PC端进行查看和分析。

核心思想
  • 重写或实现底层字符输出函数,使printf函数能够通过UART发送数据。
  • 针对不同的编译器环境,采取不同的实现方式。
MDK(Keil)环境下
  • 实现fputc()或__io_putchar()函数:
    int fputc(int ch, FILE *f) {
        HAL_UART_Transmit(&huart1, (uint8_t*)&ch, 1, HAL_MAX_DELAY);
        return ch;
    }
    
  • 如果使用ARM Compiler 6(基于LLVM),建议优先使用__io_putchar()。
GCC环境下
  • 实现_write()函数来捕捉write()调用:
    int _write(int fd, char *ptr, int len) {
        HAL_UART_Transmit(&huart1, (uint8_t*)ptr, len, HAL_MAX_DELAY);
        return len;
    }
    
兼容性处理

为提高代码复用性和可维护性,可以使用预处理器宏定义来统一代码风格,避免重复编写两个版本的重定向函数:

#ifdef __GNUC__
#define PUTCHAR_PROTOTYPE int __io_putchar(int ch)
#else
#define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)
#endif

PUTCHAR_PROTOTYPE {
    HAL_UART_Transmit(&huart1, (uint8_t*)&ch, 1, HAL_MAX_DELAY);
    return ch;
}

#ifdef __GNUC__
int _write(int fd, char *ptr, int len) {
    HAL_UART_Transmit(&huart1, (uint8_t*)ptr, len, HAL_MAX_DELAY);
    return len;
}
#endif

切换编译器即可自动适配对应函数。

支持浮点数打印

  • 如果需要支持浮点数格式化:你需要在Makefile中添加特定的链接选项来确保浮点数的支持。这是因为默认情况下,为了节省空间,某些嵌入式C库可能会禁用浮点数支持。要启用它,你需要在Makefile中添加以下内容:
    LDFLAGS += -lc -lrdimon -u _printf_float
    
    这些选项的作用是:
    • -lc:链接标准C库。
    • -lrdimon:链接一个提供I/O支持的库,这对于一些运行时环境是必要的。
    • -u _printf_float:强制链接器包含浮点数处理相关的符号,使得printf能够处理浮点数格式化字符串。
【基于GCC】STM32的printf函数重定向 引言 在Linux上学习STM32有一段时间了,其中困扰我的就是在Linux系统上的串口调试助手和USART这节的重定向c库函数printf到串口了。(因为我用的是gcc) 串口方面曾用过minicom,但感觉不是太方便,又因为运行minicom后,使用openocd下载程序失败,内心就开始厌烦minicom了,于是开始在各大论坛查询其他的串口调试助手,终于让我给找到了,继而内心也舒畅了。 在一次偶然下重定义printf函数也找到了解决办法。 一、安装 Comtool 这款软件是Python开发的,需要下载 阅读详情

相关推荐

CLion调试STM32:串口重定向printf的常见问题与解决方案

本文详细解析了在CLion中调试STM32时串口重定向printf的常见问题与解决方案,包括无输出、乱码、浮点数无法输出等典型问题。通过分析重定向原理、基础配置和编译器差异,提供了实用的调试技巧和性能优化建议,帮助开发者高效解决STM32开发中的调试难题。

k6l7m8n9的博客 1006

STM32使用printf重定向

STM32 printf重定向

weixin_48120109的博客 6947

AT32(二):USART串口打印——GCC 编译器下printf重定向

开发USART外设。代码由 AT官方的BSP(此处是AT32F421固件库BSP&Pack)项目文件修改而来。主要测试AT32F4单片机的串口输出功能。

m0_46882426的博客 3802

STM32开发踩坑——基于GCC环境下的printf输出重定向

GCC环境下printf函数实现机制

weixin_66861497的博客 1514

STM32串口重定向printf踩坑记:FILE未定义问题的3种解决方法

本文详细解析了STM32开发中串口重定向printf时遇到的‘FILE未定义’错误根源,并提供了三种核心解决方法:显式包含标准头文件、启用Keil的MicroLIB以及实现GCC的_write系统调用。文章深入对比了各方案的优缺点与适用场景,帮助开发者根据项目需求选择最佳方案,确保调试信息可靠输出。

ol789012345的博客 789

STM32中printf函数重定向原理与实现方法详解

在嵌入式系统开发中,标准输入输出函数如printf是调试和信息输出的重要工具。其工作原理是通过调用底层系统函数将格式化数据输出到标准设备。在桌面环境中,操作系统已默认将标准输出绑定到控制台,但在STM32等裸机系统中,缺乏默认的输出设备映射,导致printf无法直接工作。这一问题的技术价值在于实现调试信息的灵活输出,提升开发效率。应用场景包括嵌入式设备调试、数据监控和系统状态反馈。本文聚焦于STM32平台,详细解析printf函数的重定向机制,涵盖基于GCC/Newlib的_write函数重写和Keil M

weixin_33868027的博客 408

stm32中printf重定向

stm32中printf重定向

qq_54215896的博客 3351

STM32H743+CubeMX-三平台串口调试printf实战

本文详细介绍了在STM32H743平台上使用CubeMX进行三平台(Keil、IAR、CubeIDE)串口调试printf的实战经验。重点讲解了printf重定向的必要性、CubeMX配置技巧以及不同编译器的代码实现差异,帮助开发者快速解决跨平台调试中的常见问题,提升嵌入式开发效率。

weixin_29172201的博客 382

STM32中printf的重定向详解

在STM32开发中如何重定向printf函数到串口输出。在Keil MDK环境下,若使用MicroLib库只需重写fputc函数;否则需禁用半主机模式并实现相关桩函数。对于GCC工具链,核心是重写_write函数,并可选添加浮点打印支持。两种方法本质都是将标准库输出函数映射到硬件串口驱动,实现调试信息的串口打印。

R6bandito的博客 2853

GCC环境下STM32的printf重定向全攻略(含_write函数详解)

本文详细解析了在GCC编译环境下为STM32实现printf函数重定向至串口输出的完整方案。核心在于实现_write系统调用函数,并正确配置链接器选项(如--specs=nano.specs)。文章深入探讨了重定向机制、提供了健壮的代码实现,并解决了浮点数打印等常见问题,是开发者从Keil/IAR迁移至GCC工具链的实用指南。

weixin_29172201的博客 359

stm32串口——printf重定向两种方法

摘要:本文介绍了两种在STM32中重定向printf输出到串口的方法。方法一不依赖微库,通过添加特定代码和重写fputc()、fgetc()函数实现;方法二需要勾选Use MicroLIB选项,同样通过重写这两个函数,调用HAL库的UART发送接收函数完成数据收发。两种方式都能将printf输出重定向到串口调试助手显示,开发者可根据项目需求选择适合的方案。关键代码展示了如何利用HAL_UART_Transmit和HAL_UART_Receive函数实现字符的发送和接收。

zqx的博客 5726

彻底搞清printf在STM32上的使用

彻底搞清printf在STM32上的使用 文章目录彻底搞清`printf`在`STM32`上的使用重定向`printf`ARMCC版本(keil MDK)ARMGCC版本(GCC)重写`printf` 重定向printf ARMCC版本(keil MDK) 下面这段代码,在实现串口发送一个字节的函数后,可以在勾不勾选”微库“的情况下都可以正常使用printf函数。__MICROLIB是勾选微库后会...

ApexYuan 7450

避坑指南:ESP32S3驱动INMP441麦克风时的常见硬件冲突与解决方案

本文详细解析了ESP32S3驱动INMP441麦克风时常见的硬件冲突问题,包括GPIO资源冲突、电源噪声、I2S时钟同步等,并提供了实用的解决方案和优化策略。通过实测数据和代码示例,帮助开发者快速排查和解决音频设备开发中的疑难问题,提升系统稳定性和音频质量。

embedding5hiker的博客 942

STM32 重定向 printf 到串口的 GCC 方法与 Keil 方法对比

摘要 本文分析了不同嵌入式开发环境下printf重定向的实现方法。重点对比了Keil MDK(ARMCC)和GCC(Newlib)两种编译器的实现差异:Keil通过fputc()函数实现,而GCC需要实现_write()或__io_putchar()函数。文章详细介绍了MicroLib启用、标准库重定向以及GCC环境下直接实现_write和使用syscalls.c的方法,并提供了各环境对应的标准库对比表格。这些实现方法的差异源于不同编译器使用的底层C标准库(ARM C Library/MicroLib vs

m0_73366745的博客 1534

DRAM自测试模块

1 背景技术DDR3/4 SDRAM属于高速外设,最高时钟频率可达到1600MHz,最高速率可达3200MT/s。在存储控制器与DDR34 SDRAM设备之间有一层专为高速接口设计的模拟电路,此电路对于前端设计人员来说,不管在模拟验证阶段和回片测试阶段,都是一个黑盒子。而对于后端测试人员来说若此部分为外购IP,则内部结构也是无法清楚了解的。所以在测试阶段,对于DDR34 SDRAM的测试就具有一定的

Hierro的DDR世界 7014

ADS2020实战:村田电感.s2p与.mod文件导入全流程对比(附仿真结果差异分析)

本文详细对比了ADS2020中村田电感的.s2p与.mod文件导入流程及仿真结果差异,重点分析了两种模型在低频段和高频段的精度表现。通过实际案例展示.s2p文件在高频仿真中的优势,以及.mod文件在低频和非线性特性模拟中的准确性,为射频电路设计提供模型选择策略和混合仿真技巧。

weixin_29289821的博客 519

STM32 HAL库串口调试终极指南:5分钟搞定printf重定向(附常见问题排查)

本文详细介绍了如何在STM32 HAL库中快速实现printf重定向到串口,包括硬件配置、核心代码实现及常见问题排查。通过5分钟快速指南,开发者可以轻松掌握HAL库串口调试技巧,提升嵌入式开发效率。特别针对printf重定向中的常见问题提供了实用解决方案。

weixin_28692153的博客 355

Jetson Nano官方镜像下载&烧录

在NVIDIA Jetson Nano开发者套件上安装NVIDIA官方Ubuntu镜像

weixin_44222088的博客 8848

STM32CubeIDE的Printf串口重定向

最近在使用STM32CUBEMX+STM32CUBEIDE调试嵌入式AI项目时,发现将之前keil中使用的printf()重定向代码移植到STM32CUEBIDE中,无法使用。代码无报错、编译无异常、工程可正常烧录运行,但串口始终无任何打印输出。经过排查发现,该问题并非代码BUG,而是Keil MDK(ARMCC编译器)与STM32CubeIDE(GCC编译器)的底层编译机制、标准库适配、重定向接口定义存在本质差异。Keil适配的fputc重定向代码,无法直接兼容CubeIDE的GCC编译环境。

安迪西_嵌入式攻城狮 380

基于CH32X035的USB双K型热电偶温度计:硬件设计、冷端补偿与信号放大详解

本文详细介绍了基于CH32X035单片机设计USB双K型热电偶温度计的完整方案。重点解析了硬件设计中的核心挑战:如何利用精密运放GS8552-SR进行信号放大,以及采用NTC热敏电阻和查表法实现精确的冷端补偿。项目通过USB供电通信,实现了双路高精度温度测量与显示,为电子爱好者和工程师提供了实用的参考设计。

weixin_42153793的博客 160

华为OD机试2025C卷-双十一最大花费金额[100分](Java_Python3_C++_C语言_JsNode_Go)实现100%通过率

双十一最大花费金额 - 动态规划解法 摘要:本文介绍了华为OD机试中"双十一最大花费金额"问题的动态规划解法。该问题要求在给定N件商品价格和优惠券面额X的情况下,选择若干商品使总花费不超过X且尽可能大。核心解法采用布尔型动态规划数组,记录每个金额是否可被拼出。算法时间复杂度为O(N*X),空间复杂度为O(X)。通过倒序遍历避免重复选择同一商品,最后从X向下查找第一个可达金额作为答案。文中提供了C++和Java的实现代码,并解释了与经典0-1背包问题的关系。 关键点: 问题本质是0-1背包/子集和问题的变体

2503_91057718的博客 46

STM32调试利器:printf跨编译器串口重定向实战指南

本文详细介绍了在STM32开发中实现printf函数串口重定向的实战方法。针对MDK(ARMCC)和GCC两大主流编译器环境,分别讲解了通过重写fputc或_write函数的核心原理与步骤,并提供了跨编译器的通用代码方案。掌握这一技巧能极大提升嵌入式调试效率,是STM32开发的必备利器。

ol789012的博客 446

这种绑定设备的文件拷贝出来了,怎么放到一台新的P100上使用

🏆 本文收录于《全栈Bug调优(实战版)》专栏,致力于分享我在项目实战过程中遇到的各类Bug及其原因,并提供切实有效的解决方案。无论你是初学者还是经验丰富的开发者,本文将为你指引出一条更高效的Bug修复之路,助你早日登顶,迈向财富自由的梦想🚀!同时,欢迎大家关注、收藏、订阅本专栏,更多精彩内容正在持续更新中。让我们一起进步,Up!Up!Up!    备注: 部分问题/难题源自互联网,经过精心筛选和整理,结合数位十多年大厂实战经验资深大佬经验总结所得,数条可行方案供所需之人参考。

**My Coding Family** 1134

从C标准库到串口:printf重定向的底层机制与跨平台启示

本文深入探讨了C标准库中printf函数的重定向机制,特别是在STM32等嵌入式系统中通过重映射实现串口输出的技术原理。文章详细解析了从标准I/O架构到UART串口通信的底层实现,提供了跨平台兼容性方案和性能优化策略,为嵌入式开发者提供了实用的调试信息输出解决方案。

k8s6orchestrator的博客 883

《基于FPGA的数字信号处理》专栏的导航与说明

《基于FPGA的数字信号处理》专栏的导航与说明

孤独的单刀 4160

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

上一篇: C语言常用的宏定义
下一篇: 在Ubuntu上使用 dd 工具制作U盘启动盘
DennisReYoonjiho
博客等级 码龄7年 216粉丝 34原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值