和往常一样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; }
|