stm32 printf 重定向問題

Nichoooolas發表於2024-08-17

最終解決方案
新建一個stm32_printf.h 標頭檔案,在main.c 中include

#ifndef STM32_SPIDMA_MODE_STM32_PRINT_H
#define STM32_SPIDMA_MODE_STM32_PRINT_H
#include "stm32f1xx_hal.h"
#include "string.h"
extern UART_HandleTypeDef huart1;
void print_f(char* str){
    HAL_UART_Transmit(&huart1, (uint8_t*)str, strlen(str), 1000);
}
#endif //STM32_SPIDMA_MODE_STM32_PRINT_H

使用自己定義的 print_f 注意!!!!不是 printf
無所謂,功能達到就行了,很穩定,比重定向什麼好太多,不需要折騰,這個標頭檔案還能方便共用,批次該函式名很容易,現在的IDE

之前各種搞都不行
比如

  1. https://www.cnblogs.com/xingboy/p/9522940.html中所提的
  2. 選上”Use MicroLIB”這是KEIL自帶的一個簡易的庫

之前可以的

#ifdef __GNUC__
/* With GCC/RAISONANCE, small printf (option LD Linker->Libraries->Small printf
set to 'Yes') calls __io_putchar() */
#define PUTCHAR_PROTOTYPE int __io_putchar(int ch)
#else
#define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)
#endif /* __GNUC__ */

/**
* @brief Retargets the C library printf function to the USART.
* @param None
* @retval None
*/
PUTCHAR_PROTOTYPE
{
HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, HAL_MAX_DELAY);
return ch;
}

這個之前我試過是可以的,這次不知道為什麼不行,好像之前為了使用clion 除錯,用什麼程式修改了 microlib的模式。

最後說一句,STM32 最好還是在keil中編譯,但是代母可以在clion中修改
其他參考
https://www.jianshu.com/p/0bd6ee925e1c

相關文章