STM32CubeIDE升级大坑,习贯使用printf的注意了!
[复制链接]
本帖最后由 Gen_X 于 2024-3-15 11:00 编辑
和往常一样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;
}
|