当前位置: 首页 > news >正文

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

网上绝大部分都在说在重定向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的也是我本人,所以带了水印

http://www.jsqmd.com/news/53839/

相关文章:

  • 2025年知名的薄壁不锈钢管/316不锈钢管厂家最新TOP实力排行
  • 2025年广州存储服务器托管代理商TOP8推荐榜
  • 2025年微型简易斜楔滑块定做厂家权威推荐榜单:微型斜楔升降机构/微型斜楔技术/微型斜楔式夹具源头厂家精选
  • 雅思高效出分选对机构!2025年高性价比机构推荐及选课技巧
  • 2025年企业出海一站式智能外贸服务平台有哪些?
  • 2025年如何选择合适的PT型锚具厂家
  • OBDPROG Doctor M500 Basic 1-Year Renew Service: Diagnose European/American Vehicles
  • 2025年质量好的净化材料净化板厂家最新权威推荐排行榜
  • 北京雅思培训避坑指南!2025年11月5大品牌深度测评
  • 2025年耐用的高低压配电柜行业内知名厂家排行榜
  • 2025年可靠的电子平台秤传感器厂家推荐及选购参考榜
  • 2025年口碑好的正极电动搬运车用户好评厂家排行
  • 2025土工新材料企业TOP5权威推荐:解析中水土工的管理水
  • 2025年屏蔽电缆生产厂家权威推荐榜单:家装电缆‌/耐火电缆‌/软电缆源头厂家精选
  • 12.基础语法-变量
  • 必收藏!2025 人工智能/优质大模型培训机构权威排名,企业培训专用!
  • css-滚动条挤压布局问题
  • 什么产品美白效果比较好?2025权威机构认证榜单,让你告别暗黄沉着
  • 2025年耐用的双辊径矫平机实力厂家TOP推荐榜
  • 闭眼入不踩坑!人工智能/python/ansys/fluent/abaqus/devops培训机构 TOP10,实战教学不划水!
  • 2025年济南专升本考试培训机构权威推荐榜单:专升本机构‌/统招专升本‌/专升本机构报名源头机构精选
  • 2025 年电线电缆实力厂家最新推荐排行榜:聚焦架空绝缘 / KV 级 / 塑料绝缘等多类电缆,精选优质企业供工程与家装选购参考
  • 量化评估下的行业真相:网络公关公司综合实力榜单解读
  • 2025 年四川衣柜橱柜全屋定制供应商口碑推荐排行榜
  • 10.基础语法-课程安排
  • 最近在备考公务员, 已经在幻想考公上岸后的生活了
  • 2025年耐用的冷弯机厂家推荐及采购指南
  • 2025 年 11 月 NMP 溶剂厂家权威推荐榜:高纯度电子级/医药级 N-甲基吡咯烷酮、N-甲基-2-吡咯烷酮、1-甲基-2-吡咯烷酮优质供应商精选
  • 2025年真空袋厂家联系方式完整汇总:全国重点企业官方联系渠道与高效采购指南
  • 2025年知名的球磨机参数/球磨机设计厂家实力及用户口碑排行榜