尧图网站建设 尧图网络
  • 首页
  • 关于我们
  • 服务项目
  • 案例展示
  • 建站流程
  • 资讯中心
  • 联系我们
首页/资讯中心/详情

HAL+clion+armgcc编译器的printf问题

HAL+clion+armgcc编译器的printf问题
📅 发布时间:2026/6/20 15:38:26

网上绝大部分都在说在重定向printf时候只要重写fputc函数并勾选微库来实现

但是那是keil才有的微库,如果不勾选微库,就得先停用标准库的半主机模式,再重写。。。

但是对于stm32cubeide和clion这种目前不是主流但是体验很好的armgcc编译器来说,上述方法完全不管用,题主在很长一段时间内只能用自带的haltransmit发送。字符串倒无所谓,变量真的是麻烦。

于是,看见知乎某篇帖子(应该是知乎)写的很详细,也是关于这个问题的解决方法

在其基础上优化一下,用于契合clion的用户

首先创建一个c和h文件,名字随便取名,我的直接复制的帖子中原帖的

retarget.h和retarget.c

image

retarget.h如下
`// All credit to Carmine Noviello for this code
// https://github.com/cnoviello/mastering-stm32/blob/master/nucleo-f030R8/system/include/retarget/retarget.h

ifndef RETARGET_H_

define RETARGET_H_

include "stm32f4xx_hal.h"

include <sys/stat.h>

void RetargetInit(UART_HandleTypeDef huart);
int _isatty(int fd);
int _write(int fd, char
ptr, int len);
int _close(int fd);
int _lseek(int fd, int ptr, int dir);
int _read(int fd, char* ptr, int len);
int _fstat(int fd, struct stat* st);

endif //#ifndef RETARGET_H_`

retarget.c如下
`// All credit to Carmine Noviello for this code
// https://github.com/cnoviello/mastering-stm32/blob/master/nucleo-f030R8/system/src/retarget/retarget.c

include <_ansi.h>

include <_syslist.h>

include <errno.h>

include <sys/time.h>

include <sys/times.h>

include <limits.h>

include <signal.h>

include "retarget.h"

include <stdint.h>

include <stdio.h>

if !defined(OS_USE_SEMIHOSTING)

define STDIN_FILENO 0

define STDOUT_FILENO 1

define STDERR_FILENO 2

UART_HandleTypeDef *gHuart;

void RetargetInit(UART_HandleTypeDef *huart) {
gHuart = huart;

/* Disable I/O buffering for STDOUT stream, so that* chars are sent out as soon as they are printed. */
setvbuf(stdout, NULL, _IONBF, 0);

}

int _isatty(int fd) {
if (fd >= STDIN_FILENO && fd <= STDERR_FILENO)
return 1;

errno = EBADF;
return 0;

}

int _write(int fd, char* ptr, int len) {
HAL_StatusTypeDef hstatus;

if (fd == STDOUT_FILENO || fd == STDERR_FILENO) {

// hstatus = HAL_UART_Transmit_DMA(gHuart, (uint8_t *) ptr, len);
hstatus = HAL_UART_Transmit(gHuart, (uint8_t *) ptr, len, HAL_MAX_DELAY);
if (hstatus == HAL_OK)
return len;
else
return EIO;
}
errno = EBADF;
return -1;
}

int _close(int fd) {
if (fd >= STDIN_FILENO && fd <= STDERR_FILENO)
return 0;

errno = EBADF;
return -1;

}

int _lseek(int fd, int ptr, int dir) {
(void) fd;
(void) ptr;
(void) dir;

errno = EBADF;
return -1;

}

int _read(int fd, char* ptr, int len) {
HAL_StatusTypeDef hstatus;

if (fd == STDIN_FILENO) {hstatus = HAL_UART_Receive(gHuart, (uint8_t *) ptr, 1, HAL_MAX_DELAY);if (hstatus == HAL_OK)return 1;elsereturn EIO;
}
errno = EBADF;
return -1;

}

int _fstat(int fd, struct stat* st) {
if (fd >= STDIN_FILENO && fd <= STDERR_FILENO) {
st->st_mode = S_IFCHR;
return 0;
}

errno = EBADF;
return 0;

}

endif //#if !defined(OS_USE_SEMIHOSTING)`

这时候,主函数加上

RetargetInit(&huart1);

image

编译的时候会报错,说函数重定义,进去syscalls.c文件,把报错的函数直接注释掉即可
image

csdn的也是我本人,所以带了水印

相关新闻

  • 2025年微型简易斜楔滑块定做厂家权威推荐榜单:微型斜楔升降机构/微型斜楔技术/微型斜楔式夹具源头厂家精选
  • 北京雅思培训避坑指南!2025年11月5大品牌深度测评
  • 2025年耐用的高低压配电柜行业内知名厂家排行榜

最新新闻

  • 2026香港装修公司哪家好?设计情报中心值得推荐 - 资讯速览
  • Unity Mod Manager:游戏模组管理的终极技术架构解决方案
  • LVGL布局进阶:从Flex到Grid构建复杂界面
  • 2026年AI生产力实操地图:四类高鲁棒性工具落地指南
  • 《循序渐进Python案例教程》全套PPT课件
  • uniapp全屏弹窗实战:穿透原生导航与TabBar的全局模态层方案

日新闻

  • 信任的进化:技术实现详解——如何用JavaScript构建博弈论模拟器
  • Terrakube自定义工作流:如何集成OPA、Infracost等工具扩展IaC能力
  • grunt-concurrent快速入门:5分钟学会并行运行Grunt任务

周新闻

  • 3步解锁iOS设备:applera1n激活锁绕过完全指南
  • 39 2026 人工智能证书终极盘点,普通人选 AI 证书可以从这些方向入手
  • Redis 暴露公网有多危险?从端口检查到补救步骤

月新闻

  • 【总结】入门篇:50句话让你记住架构核心概念
  • WeChatMsg技术方案解析:实现Mac微信数据自主管理的完整解决方案
  • WeChatMsg:革新性微信数据备份方案,打造你的专属数字记忆库

关于尧图

  • 公司简介
  • 团队介绍
  • 企业文化
  • 荣誉资质

服务项目

  • 定制开发
  • 电商建站
  • UI 设计
  • 运维服务

快速链接

  • 案例展示
  • 建站流程
  • 常见问题
  • 资讯中心

联系方式

  • 📍北京市朝阳区互联网产业园 A 座 10 层
  • 📞400-888-8888
  • ✉️contact@rkmt.cn
  • 🕐周一至周日 9:00-21:00

© 2024 北京尧图网络科技有限公司 版权所有 | 京 ICP 备 XXXXXXXX 号