[STM32L0] 生成并使用 STM32 HAL 库时,无法重写 __io_putchar 函数

[复制链接]
139|38
麻花油条 发表于 2026-4-9 17:10 | 显示全部楼层
不要在库里面保留 syscalls.c,把底层 retarget 函数留给最终的可执行项目去实现。
classroom 发表于 2026-4-9 15:10 | 显示全部楼层
不用 __io_putchar,直接自己写一个 printf_uart 函数,调 HAL 的串口发送,绕过整个重定向机制。
alvpeg 发表于 2026-4-13 08:10 | 显示全部楼层
编译器版本、库的配置与函数名称不匹配造成的。
everyrobin 发表于 2026-4-15 10:43 | 显示全部楼层
重写后如何验证是否生效?              
pmp 发表于 2026-4-15 11:31 | 显示全部楼层
__io_putchar函数发送异常?
robertesth 发表于 2026-4-15 12:22 | 显示全部楼层
在 Keil 中,__io_putchar 只有在勾选了 MicroLIB 的前提下才会生效。
51xlf 发表于 2026-4-15 13:59 | 显示全部楼层
在 GCC 环境下,根本不存在 __io_putchar 这个概念。
hilahope 发表于 2026-4-15 16:01 | 显示全部楼层

如何拆解重写__io_putchar的步骤?
kkzz 发表于 2026-4-15 18:35 | 显示全部楼层
主程序里重写_write函数要注意什么?
uptown 发表于 2026-4-16 15:57 | 显示全部楼层
底层调用的是标准 C 库,你必须重写 fputc 函数,而不是 __io_putchar
jackcat 发表于 2026-4-17 08:09 | 显示全部楼层
不同开发环境如何适配该函数?              
loutin 发表于 2026-4-17 09:13 | 显示全部楼层
#include "stdio.h"
#include "stm32f4xx_hal.h"  // 根据你的型号修改,如 stm32h7xx_hal.h

extern UART_HandleTypeDef huart1; // 声明你使用的串口句柄

/* 重定向 fputc 到串口 */
#if defined(__GNUC__)
/* GCC / AC6 (STM32CubeIDE) 编译器通用的 _write 重写 */
int _write(int file, char *ptr, int len)
{
    HAL_UART_Transmit(&huart1, (uint8_t *)ptr, len, HAL_MAX_DELAY);
    return len;
}
#elif defined(__CC_ARM) || defined(__CLANG_ARM)
/* Keil MDK (ARMCC / AC6) 编译器 */
#ifdef __MICROLIB
/* 如果开启了 MicroLIB,重写 __io_putchar */
int __io_putchar(int ch)
{
    HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, HAL_MAX_DELAY);
    return ch;
}
#else
/* 如果没有开启 MicroLIB(使用标准库),必须重写 fputc */
int fputc(int ch, FILE *f)
{
    HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, HAL_MAX_DELAY);
    return ch;
}
#endif /* __MICROLIB */
#endif /* __GNUC__ */
wilhelmina2 发表于 2026-4-18 11:31 | 显示全部楼层
__io_putchar与printf格式化字符串冲突怎么办?
bestwell 发表于 2026-4-18 13:48 | 显示全部楼层
如果不重写_write函数直接用fputc呢?
AutoMotor 发表于 2026-4-22 21:10 | 显示全部楼层
重写后,通过实际运行和观察系统响应来检查是否按预期工作。
lzbf 发表于 2026-4-18 16:51 | 显示全部楼层
__io_putchar 并不是 C 语言标准库的函数
olivem55arlowe 发表于 2026-4-18 17:22 | 显示全部楼层
没有开启微库,写这个函数是没有任何作用的。
星闪动力 发表于 2026-4-27 12:40 | 显示全部楼层
可能是你用的编译器版本和库不兼容,或者函数名写错了,得检查一下代码配置和函数拼写。
LLGTR 发表于 2026-4-23 09:57 | 显示全部楼层
重写后,可以通过实际操作和测试来检查效果是否达到预期。
朝生 发表于 2026-4-25 20:44 | 显示全部楼层
在gcc下,没有直接定义的`__io_putchar`,但可以用`putchar`函数替代,它是库函数。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 在线客服 返回列表 返回顶部
0