打印
[STM32F1]

STM32CubeIDE升级后 printf 大坑

[复制链接]
442|7
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
GlenX|  楼主 | 2024-3-15 11:41 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

和往常一样STM32CubeIDE有的更新提示,V1.14.*  点击确定升级:

升级后发现,原来的串口USB-TTL全部失效,升级前一直正常,正在做的试验耽误了1天。

一紧张,换了个mini板,从来没有过的事故发生了:CPU竟然发热、有味+冒烟,

紧急断开检查发现,在前边测试TTL时把电源正负极颠倒了,几十年没犯过的错误!

一切恢复后,发现其它原来好的板子只要下载了新程序,就通信异常(一直用printf)!偶尔收到"3F"或"FF"。

后来反复检查USB-TTL功能,经反复验证串口没有问题、WIN平台及底层都没有问题。

后来重装STM32CubeIDE1.14**,故障依旧!最后用HAL_USART本身的函数发送字符,结果正常

最后网上一查,发现有高手指点“printf”重定向出问题了:然后就一通补些函数,加的有点多,最后不得已自己建了个MY_printf.h,

惊险告一段落,总结:由于升级的新版本不直接支持printf重定向,需要补写很多函数定义,下面贴给大家(网上也有):

/*

* MY_printf.h

*

* Created on: Mar 12, 2024

* Author: glenx

*/

#ifndef _MY_PRINTF_H_

#define _MY_PRINTF_H_

#endif /* INC_MY_PRINTF_H_ */

#include "sys/stat.h"

#include "unistd.h"

#include "errno.h"


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);


extern int __io_putchar(int ch) __attribute__((weak));

extern int __io_getchar(void) __attribute__((weak));

/*------------------------------------------------------------------*/


__attribute__((weak)) int _isatty(int fd)

{

if (fd >= STDIN_FILENO && fd <= STDERR_FILENO)

return 1;


errno = EBADF;

return 0;

}


__attribute__((weak)) int _close(int fd)

{

if (fd >= STDIN_FILENO && fd <= STDERR_FILENO)

return 0;


errno = EBADF;

return -1;

}


__attribute__((weak)) int _lseek(int fd, int ptr, int dir)

{

(void)fd;

(void)ptr;

(void)dir;


errno = EBADF;

return -1;

}


__attribute__((weak)) 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;

}


__attribute__((weak)) int _read(int file, char *ptr, int len)

{

(void)file;

int DataIdx;

for (DataIdx = 0; DataIdx < len; DataIdx++)

{

*ptr++ = __io_getchar();

}

return len;

}


__attribute__((weak)) int _write(int file, char *ptr, int len)

{

(void)file;

int DataIdx;

for (DataIdx = 0; DataIdx < len; DataIdx++)

{

__io_putchar(*ptr++);

}

return len;

}


/********************* printf() RD & WR Function ***************************/


#ifdef __GNUC__

#define PUTCHAR_PROTOTYPE int __io_putchar(int ch)

#else

#define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)

#endif /* __GNUC__ */


#ifdef __GNUC__

#define GETCHAR_PROTOTYPE int __io_getchar (void)

#else

#define GETCHAR_PROTOTYPE int fgetc(FILE * f)

#endif /* __GNUC__ */


PUTCHAR_PROTOTYPE

{

HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, 0xFFFF);

return ch;

}


使用特权

评论回复
沙发
可怜的小弗朗士| | 2024-3-15 12:12 | 只看该作者
这个问题没发现,不过有借鉴意义

使用特权

评论回复
板凳
数码小叶| | 2024-3-15 16:29 | 只看该作者
一个很常用的printf,几个IDE就是不能通用,而且库更新了,也会偶发不能用

使用特权

评论回复
地板
icecut| | 2024-3-16 15:22 | 只看该作者
printf成本还是比较高啊。 格式化还真麻烦。

使用特权

评论回复
5
GlenX|  楼主 | 2024-3-16 18:22 | 只看该作者
没办法,很多数据处理的调试需要看结果,0X00 实在没法看,去已经离不开了!!!

使用特权

评论回复
6
GlenX|  楼主 | 2024-3-17 20:02 | 只看该作者
另外,请大家试用STM32CubeIDE的时候,

千万别侥幸试用“GBK”,看起来很好看的中文标识和备注,很快就然你怀疑人生!!!

千万别使用“GBK”!

千万别使用“GBK”!

千万别使用“GBK”!

/*----------------------------------------我现在都改用E文注释了--------------------------------------------*/

编译的MX的时候会删除MAIN(1)函数的内容!!!

超级痛快!让你体验一把什么叫从头再来!!!

使用特权

评论回复
7
小夏天的大西瓜| | 2024-3-18 17:58 | 只看该作者
很好的避坑指南

使用特权

评论回复
8
GlenX|  楼主 | 2024-4-14 18:17 | 只看该作者
STM32CubeIDE 又有新的更新,这个坑有被“平了“.
希望以后的升级不是给用户提升台阶——最后下不了台

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

14

主题

480

帖子

2

粉丝