STM32 使用 CMake 打印浮点数的解决方案与注意事项

CLion开发STM32:printf浮点打印与串口重定向的CMake实战 本文详细介绍了在CLion中使用CMake开发STM32项目时,如何解决printf浮点打印问题并实现串口重定向。通过配置CMake启用硬件浮点支持,重定向输出到串口,并结合STM32CubeMX工具,提升嵌入式开发效率与调试体验。 阅读详情

在嵌入式开发中,我们经常会用 printf 来调试程序,打印整数或者字符串通常很方便,但是在 STM32 等小型 MCU 上,打印浮点数 %f 时却常常遇到问题:在某些环境下可以打印,而在另一些环境下却完全不显示小数点。

本文就结合我最近的实践经验,总结为什么会出现这个问题,以及如何在 CMake 工程中解决它。

问题现象

在家里开发环境下:

float value = 3.14;
printf("Value = %f\n", value);

可以正常打印输出:

Value = 3.140000

但是同一段代码,在公司电脑上使用相同 MCU 和工程时,却打印不出浮点数并且不显示数值

问题分析

这并不是代码逻辑的问题,而是编译器和链接器为了节省 ROM/RAM 资源对 printf 函数的浮点支持进行了优化。

默认情况下,小型 MCU 的 newlib-nano C 库 会省略浮点格式化功能,原因如下:

  1. printf 浮点支持会引入大量的库函数,占用 Flash。

  2. 小型 MCU 通常资源有限,编译器默认禁用浮点打印,以减少内存占用。

因此,虽然你的代码是正确的,但没有链接浮点格式化相关函数,导致 %f 无法工作。

解决方案

在 CMake 工程中,需要显式地启用浮点支持。可以在你的 CMakeLists.txt 文件的最后一行添加如下命令:

target_link_options(${CMAKE_PROJECT_NAME} PRIVATE -u _printf_float)

解释

  • -u _printf_float:告诉链接器强制引用浮点支持的 printf 函数。

  • target_link_options:CMake 3.13 及以上版本可以用来传递链接器选项。

  • ${CMAKE_PROJECT_NAME}:你的工程 target 名称。

添加之后,重新编译并烧录 MCU,即可正常打印浮点数:

Value = 3.140000

注意事项

  • Flash 占用增加
    启用浮点打印会增加约 3~5 KB 的 Flash(取决于 MCU 和库),在资源紧张的 MCU 上需要权衡。

  • 调试与发布
    建议在调试阶段开启浮点打印方便验证计算结果,而在发布版本可禁用,减少 Flash 占用。

  • 替代方案
    如果 Flash 非常有限,可以考虑:

    • 将浮点数乘以 1000 或 10000 转为整数打印。

    • 使用自定义简单的浮点格式化函数,仅打印固定小数位。

总结

在 STM32 等 MCU 上,浮点数打印不是 printf 的 bug,而是编译器为了节省资源的默认行为。

通过在 CMake 中添加 target_link_options(${CMAKE_PROJECT_NAME} PRIVATE -u _printf_float),可以强制启用浮点打印功能,但需注意 Flash 占用增加。

在实际开发中,建议根据项目需求权衡调试方便性和资源占用。

树莓派Pico USB-CDC通信与select多路复用详解:从原理到舵机控制实战 串口通信是嵌入式开发中最基础也最常用的数据交换方式。传统UART需要额外转换芯片和接线,而USB-CDC虚拟串口则通过USB协议直接实现设备与电脑的双向通信,即插即用,显著简化了硬件连接。在MicroPython环境中,树莓派Pico将USB口默认配置为CDC设备,配合Python的select多路复用机制,可以同时监听虚拟串口、UART等多种数据源,避免阻塞式读取导致的任务卡死。这种组合不仅让命令交互和舵机控制变得灵活高效,还广泛应用于传感器数据采集、多设备协议转发等场景。本文从串口通信的基本概念出发,深 阅读详情

相关推荐

stm32硬件浮点使用方法

这是在stm32中实现fft计算等浮点运算必须要先做的设置。我之前给的浮点运算例程,在此设置下,自己亲测是可用的,有问题的同学可以留言

【开发技巧】CMake + STM32:优化printf浮点输出与内存占用的平衡策略

本文针对STM32开发中printf浮点输出难题,分析其根源在于newlib-nano库默认禁用浮点支持。提供了CMake项目级与全局工具链两种配置方案,详细对比了启用浮点功能后的Flash与RAM内存占用开销,并给出了不同优化等级下的影响分析及实际项目中的优化策略建议。

github5actions的博客 1033

Deepseek+Word插件:一键搞定论文翻译与润色的学术写作新革命

本文介绍了Deepseek Word插件如何革新学术写作流程,实现论文翻译与润色的一键操作。该插件深度集成于Word环境,能智能完成中英互译、语法修正、术语统一及逻辑优化,显著提升写作效率与文本质量,是研究者的高效AI助手。

weixin_29252171的博客 512

CLion中STM32使用printf函数

在CLion中STM32使用printf函数的配置方法。

李同学 2504

UVM环境复位--stop_sequences()

在UVM验证环境中, stop_sequences是一个用于强制终止所有正在运行的 Sequence 的方法,通常用于动态控制激励生成流程。1.通过uvm_config_db传递事件和严格的同步机制,此方案符适用于复杂复位场景和动态测试控制。组件耦合:Driver 和 Sequence 不再直接依赖env,通过标准接口通信。竞争条件:确保 Driver 完成清理后再终止 Sequence。代码健壮性:使用非阻塞操作和事件监听,避免死锁。

qq_42779035的博客 3014

Silvaco TCAD | 从PIN到APD:高性能光电探测器的仿真设计与优化

本文详细介绍了使用Silvaco TCAD进行光电探测器仿真设计与优化的全过程,从基础的PIN结构到高性能APD的实现。通过实战案例和代码示例,展示了如何优化器件参数、实现雪崩效应以及进行高级仿真分析,帮助工程师提升光电探测器的量子效率和响应速度。

weixin_29218509的博客 426

为STM32F1和F4系列的单片机CMAKE工程打开软硬件浮点加速,解决无法sprintf浮点数的问题

摘要:本文介绍了在STM32F411CEU6(Cortex-M4F)和STM32F103C8T6(Cortex-M3)上配置CMake支持浮点运算的方法。对于F411需添加硬件FPU编译选项(-mfpu=fpv4-sp-d16 -mfloat-abi=hard)和printf浮点支持(-u_printf_float);F103仅需添加-u_printf_float实现软件浮点打印。两者都需要正确实现串口重定向函数。文章对比了两款芯片的浮点性能差异,并提醒注意硬件特性区别及资源消耗问题。

xiaoxu_bjtu的博客 1142

如何使用AKShare作为OpenBB的数据源

`openbb_akshare`项目是 OpenBB 的数据源扩展。可以用于查询A股和港股数据

FinAnalyzer金融分析工具 3195

【问题解决】VS Code + CMake + STM32:`printf` 无法输出浮点数的终极解决方案

摘要:在STM32开发中,使用VS Code+CMake+ARM-GCC时,printf无法输出浮点数。这是由于默认链接的newlib-nano库精简了浮点支持。提供两种解决方案:1)在项目CMakeLists.txt中添加target_link_options(${CMAKE_PROJECT_NAME} PRIVATE "-u _printf_float");2)修改工具链文件,在CMAKE_EXE_LINKER_FLAGS中加入-Wl,-u,_printf_float实现全局生效。同

2301_80635989的博客 2240

芯片标称具备8kVESD能力却在8kV测试中失效?

芯片级ESD(HBM模型)与系统级ESD(IEC 61000-4-2)存在本质差异:

硬核科技 644

2026.1.11:WSL2中Ubuntu发行版的完全卸载干净指南

摘要:本文详细介绍在WSL2中彻底卸载Ubuntu发行版的步骤。首先通过wsl -l -v确认安装的发行版,使用wsl --terminate终止运行后,推荐使用wsl --unregister命令完全删除发行版(包括所有数据)。还可手动检查残留文件位置(如%LOCALAPPDATA%目录),并提供了备份建议(使用wsl --export)。最后说明验证卸载的方法和可选的高级重置操作。整个过程确保彻底清理相关数据并释放磁盘空间。(

拥抱具身智能,昇腾Ascend C 2389

CLion开发STM32:串口重定向printf输出指南

本文介绍了在CLion环境下实现STM32串口重定向的方法,使开发者能方便地使用printf进行调试。关键步骤包括:1)添加标准输入输出头文件;2)实现__io_putchar函数重定向串口输出;3)在CMakeLists中配置浮点数支持选项。文章特别强调输出时需使用"\r\n"换行符以确保正确刷新缓冲区,并提供了常见问题排查方法。该方案可显著提升STM32开发调试效率,支持包括浮点数在内的多种格式输出。

L_Throne的博客 2249

基于YOLOv8的智能肿瘤检测系统:从图像到诊断的深度学习应用——含代码和论文

本文提出了一种基于YOLOv8深度学习的智能肿瘤检测系统,用于医学影像(CT/MRI/X光)的自动分析与诊断。针对传统人工阅片效率低、主观性强的问题,系统采用最新的YOLOv8目标检测算法,通过改进的C2F骨干网络、Anchor-Free检测头和解耦头等创新设计,实现高效精准的肿瘤定位。文章详细阐述了模型架构、数据处理流程、训练优化方法及PyQt5用户界面开发,为临床提供可靠的AI辅助诊断工具。实验结果表明,该系统在速度和准确率上达到良好平衡,有望提升肿瘤早期筛查效率。

FJN110的博客 199

CLion + STM32CubeMX + JLink GDB Server 高效开发调试实践

嵌入式开发中,开发工具链的选择直接决定工程效率。CLion作为JetBrains家族的高效IDE,凭借强大的代码分析、重构和CMake原生支持,逐渐成为替代传统Keil、IAR的新选择。其核心原理是通过CMake构建系统,结合STM32CubeMX生成硬件初始化代码,再利用JLink GDB Server作为调试桥接层,打通从源码编辑、编译到硬件调试的完整链路。这种方案带来的技术价值是:代码跳转更智能、调试过程更透明、支持包括FreeRTOS在内的复杂工程,同时保留标准GDB的灵活性。适用场景涵盖多文件工程

weixin_34199335的博客 458

SmartFusion从FPGA到ARM(九)——串口命令解析器的实现

系列教程:SmartFusion从FPGA到ARM系列教程 前面两节介绍了MSS_UART和CoreUARTapb的使用: MSS_UART的使用 CoreUARTapb的使用 MSS_UART和CoreUARTapb都支持中断和轮询方式获取串口接收的数据,对于串口中断服务函数,有时我们需要通过不同的串口指令去执行不同的动作,下面以CoreUARTapb为例,来实现一个简单的串口命令解析器。固定串口数据帧格式,帧长度不定。 串口数据帧格式:* + 数据 + #,对于数据中为参数的,可以自定义处理函数。例

whik1194的博客 1535

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

STM32开发进阶:C++封装HAL库,让GPIO与UART重获Arduino手感

嵌入式开发中,单片机编程往往在寄存器操作与高级抽象之间摇摆。Arduino凭借简洁API降低了入门门槛,而STM32的HAL库虽然功能全面,却因其繁琐的初始化与调用方式劝退了不少迁移者。C++作为零开销抽象的语言,能在不牺牲性能的前提下将外设封装为对象,重构GPIO、UART、定时器等常用模块的调用逻辑。工程实践中,结合Clion与OpenOCD搭建现代构建调试环境,能有效提升开发效率。本文从GPIO点灯到UART收发,系统讲解如何用C++封装HAL库,让开发者在保持底层控制力的同时,重获类似Arduino

weixin_34185512的博客 320

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

VS Code 调试 STM32 实战:从 Keil 迁移到现代嵌入式开发环境

嵌入式开发中,调试器与代码编辑器的割裂长期影响效率。GDB、OpenOCD 与 CMake 构成的开源工具链,通过分层解耦实现了编译、下载与调试的标准化。在 VS Code 中集成 Cortex-Debug 插件与 SVD 文件,可实时查看外设寄存器,结合 AI 编程插件辅助排错,显著提升开发体验。该方案适用于 STM32 全系列芯片,尤其适合从 Keil 迁移的开发者,能有效解决断点失效、变量优化、HardFault 定位等常见问题,实现一键编译调试的现代工作流。

weixin_34378969的博客 176

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

Visual Studio 2022 + VisualGDB 搭建 STM32 开发环境全攻略

嵌入式开发中,STM32 项目常面临代码补全卡顿、调试效率低等问题。通过集成 ARM GCC 工具链与 GDB 调试器,可在 Visual Studio 2022 中实现智能感知、断点调试和外设寄存器查看。VisualGDB 作为桥梁,将 ST-Link 调试探针与 VS2022 无缝对接,显著提升代码导航与重构效率。该方案适用于需要维护多个 STM32 项目的工程师,以及追求现代化开发体验的学生和爱好者。本文详细记录了从环境配置到调试运行的全流程,并分享常见问题排查技巧。

weixin_34161064的博客 379

嵌入式开发环境升级:VS Code + STM32 替代 Keil 实战指南

嵌入式开发中,集成开发环境(IDE)的选择直接影响编码效率与调试体验。传统 Keil MDK 虽稳定,但编辑器功能陈旧、版本管理困难,难以适应现代开发流程。VS Code 凭借强大的扩展生态与智能提示能力,结合 STM32 官方扩展及 CubeCLT 工具链,可实现从芯片配置、编译到烧录调试的完整闭环。该方案不仅保留了 ARM GCC 的底层编译能力,还支持 Git 协作与 AI 辅助编程,显著提升代码可维护性。适用于 STM32 入门学习、毕业设计及工业项目迁移等场景,尤其适合追求高效工作流的嵌入式开发者

weixin_34246551的博客 435

Soberup开源视觉路线:工程结构与模块化设计解析

机器人视觉系统的工程化开发,已从单纯追求算法精度转向关注整体架构的可维护性与可扩展性。一套清晰的工程结构,决定视觉任务从图像采集、目标检测到决策输出的整条链路能否稳定运行。通过分层设计,将感知、决策、通信解耦,配合配置文件与依赖管理,能显著降低团队协作和迭代成本。借助CMake构建、模块划分和规范化目录组织,开源的视觉项目可以让新成员快速上手,也能让算法替换与调试更加高效。本文基于Soberup战队公开的视觉路线,剖析其工程结构与模块化设计思路,梳理从依赖选型到构建避坑的完整实践,为机器人竞赛及视觉开发团队

weixin_34248487的博客 395

7个技巧加速嵌入式固件开发:从CI/CD到模块化设计

在嵌入式系统开发中,固件开发是连接硬件与软件的关键环节,其效率直接影响产品迭代速度。其核心原理在于通过自动化工具链和标准化流程,将开发、测试与集成环节系统化,从而缩短开发周期并提升代码质量。从技术价值看,这不仅减少了手动操作引入的错误,更通过持续集成确保每次提交的可靠性,为团队协作和代码复用奠定基础。典型的应用场景包括需要快速验证想法的原型开发、多版本固件维护以及实时性要求高的控制系统。本文聚焦于固件开发中的**持续集成**与**模块化设计**,通过引入自动化构建、高效调试系统及硬件抽象层等方法,帮助开发者

weixin_30765505的博客 416

CMSIS-FreeRTOS源码审计与架构拆解:从调度器到内存管理

嵌入式开发中,深入理解RTOS底层机制是提升系统稳定性的关键。对FreeRTOS及其CMSIS封装实现进行源码级审计,能够帮助开发者掌握任务调度、内存管理、中断处理等核心原理。本文从工程实践出发,介绍基于Cppcheck、Clang-Tidy等静态分析工具的审计流程,并梳理CMSIS-FreeRTOS的工程架构与模块边界。通过对调度器、堆实现、port层的代码拆解,揭示内核设计与潜在风险,为RTOS选型、移植和问题排查提供参考。无论你是嵌入式工程师还是BSP开发者,都能从中获得系统化认知。

253

基于Simulink与Cube飞控的自主系统开发:从模型到嵌入式部署全流程解析

模型化设计(MBD)是一种广泛应用于控制、机器人和嵌入式系统开发的工程方法,它通过图形化建模取代传统手工编码,将算法设计、仿真验证与实现环节紧密结合。其核心原理在于利用可视化框图描述系统行为,并通过自动代码生成技术将模型直接转换为可在目标硬件上运行的高效C/C++代码。这一流程的技术价值在于显著提升复杂系统(如无人机、无人车)的开发效率与可靠性,减少人为错误,实现“设计即实现”。在工程实践中,MBD常与硬件在环测试结合,用于验证算法在贴近真实硬件环境下的性能。本文聚焦于如何将Simulink搭建的自主算法模

weixin_30387423的博客 401

C++模板三大核心:非类型参数、类特化与分离编译

模板是C++泛型编程的基石,其本质是编译期代码生成机制。理解非类型模板参数(如std::array<int, N>中的N)可实现零开销配置固化;掌握类模板特化(全特化与偏特化)能针对特定类型定制高效行为;而模板分离编译问题源于实例化时机与ODR规则冲突,需在头文件定义、显式实例化等方案间权衡。这些能力共同支撑高性能系统开发——从高频交易的时间戳校验器,到嵌入式DMA内存对齐分配器,再到RPC序列化优化。本文聚焦工程落地中的典型陷阱与实证解法,覆盖C++17/C++20主流实践。

weixin_34122810的博客 387

长沙红胖子Qt·西安(长沙创微智科)博文大全:开发技术集合(包含Qt实用技术、树莓派、三维、OpenCV、OpenGL、ffmpeg、OSG、单片机、软硬结合等等)持续更新中...

长沙红胖子 Qt・西安,本人拥有省级科研团队从业背景,研发团队产出所有项目、产品方案和研发无分包、无外包、无AI代笔,长期深耕双一流体系高精尖技术配套研发。博客主动剥离复杂底层工况机理,专注沉淀高端、特种行业领域Qt工程化落地实战经验。所有内容均为个人梳理总结的通用性工程方法论,只输出可公开的普适技术思路。

长沙红胖子 Qt・西安|省级科研团队从业背景,深耕双一流体系高精尖技术配套研发|剥离高精尖机理,沉淀高端特种行业领域 Qt 工程化落地经验|博文仅分享通用技术总结,输出公开普适工程思路。 164万+

机器人系统架构从硬件到ROS2软件框架的完整设计指南

机器人系统架构是构建稳定、可扩展机器人应用的基础,其核心在于通过分层设计实现感知、决策与执行模块的解耦。基于ROS2的节点化架构,开发者可以利用Topic、Service、Action等通信机制,结合DDS去中心化特性,构建高可靠、低延迟的分布式系统。合理的硬件选型与软件框架设计能显著提升系统实时性与可维护性,广泛应用于移动机器人、工业自动化及多机器人协同等场景。本文深入解析从硬件层到ROS2应用层的架构决策与实操经验,帮助开发者避开常见陷阱。

weixin_34007020的博客 398
上一篇: 在 CLion + Qt + QML 项目中,调试输出失效的坑与解决方案
下一篇: CLion 开发 Qt/QML 时复制粘贴突然失效?原因分析 + 终极解决方案
Max_uuc
博客等级 码龄5年 198粉丝 207原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值