STM32IDE pintf不支持打印小数格式

Problem description: The float formatting support is not enabled, check your  MCU Settings from "Project Properties > C/C++ Build > Settings > Tool  Settings", or add manually "-u _printf_float" in linker flags.

解决:

  全篇完。

本人是一个嵌入式未入门小白,博客仅仅代表我个人主观见解,记录成长笔记。
笔记是以最简单的方式,只展示最核心的原理。
若有与 大神大大 见解有歧义,我绝对坚信 大神大大 见解是对的,我的是错的。
若无积分等无法下载源码,可加入QQ群657407920下载交流经验。感谢~!

 

 

在单片机(如 STM32、AVR、51 单片机等)开发中,**不能直接使用 `printf`**(你提到的 `pintf` 应该是笔误),主要原因在于单片机的运行环境与标准 PC 环境不同,缺乏标准输入输出设备(如显示器、键盘)以及完整的运行时库支持。 --- ## 一、`printf` 的本质 `printf` 是 C 标准库函数,其定义在 `<stdio.h>` 中。它默认将输出发送到标准输出设备(通常是终端或控制台)。 在 PC 上,`printf` 之所以能正常工作,是因为: - 有完整的操作系统(如 Linux、Windows)管理标准输入输出; - 有完整的 C 标准库(glibc、MSVC CRT)实现; - 有底层的系统调用(如 `write()`)将数据写入终端。 --- ## 二、单片机环境中 `printf` 失效的原因 ### 1. 缺乏标准输出设备 单片机没有显示器或终端设备,`printf` 不知道将数据输出到哪里。 ### 2. 缺少底层 I/O 支持(`_write` 函数) C 标准库中的 `printf` 最终会调用一个底层函数 `_write()`,它负责将数据写入输出设备。但在单片机工程中,这个函数默认没有实现,导致链接失败或运行时无输出。 ### 3. 占用资源较大 `printf` 函数本身体积较大,尤其是支持浮点数格式化输出时,会占用大量 Flash 和 RAM,这对资源有限的单片机来说是不现实的。 --- ## 三、如何让 `printf` 在单片机中工作? 虽然不能直接使用,但可以通过重定向 `printf` 输出到串口(UART)来实现类似功能。 ### ✅ 实现步骤如下: #### 1. 重写 `_write` 函数(适用于使用 newlib 的嵌入式工具链) ```c #include <sys/stat.h> #include <stdio.h> #include <unistd.h> #include "stm32f1xx_hal.h" // 根据你的单片机型号修改 extern UART_HandleTypeDef huart1; // 假设使用 UART1 int __io_putchar(int ch) { HAL_UART_Transmit(&huart1, (uint8_t*)&ch, 1, HAL_MAX_DELAY); return ch; } // 重写 _write 函数 int _write(int file, char *ptr, int len) { HAL_UART_Transmit(&huart1, (uint8_t*)ptr, len, HAL_MAX_DELAY); return len; } ``` #### 2. 初始化串口 确保你已经正确配置并初始化了串口(如使用 STM32CubeMX + HAL 库)。 #### 3. 使用 `printf` ```c printf("Hello from STM32!\r\n"); ``` --- ## 四、替代方案(推荐) 如果你不需要完整的格式化输出,可以使用更轻量的方法: ### 方法 1:直接使用串口发送函数 ```c char msg[] = "Hello, world!\r\n"; HAL_UART_Transmit(&huart1, (uint8_t*)msg, strlen(msg), HAL_MAX_DELAY); ``` ### 方法 2:封装自己的 `my_printf` 你可以封装一个轻量级的 `my_printf`,只支持整数和字符串,不支持浮点数,从而节省资源。 --- ## 五、注意事项 - **不要在中断中使用 `printf`**:会引发不可预测的阻塞行为。 - **避免频繁调用 `printf`**:占用大量 CPU 和串口资源。 - **使用 DMA + 缓冲区**:提高串口输出效率(适合高级用户)。 --- ##
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值