stm32 printf 重定向问题
最终解决方案
方案一:
来自 https://blog.csdn.net/m0_73745340/article/details/132548167
相关解释
printf重定向到串口就必须关闭半主机模式。半主机模式简而言之就是将电脑的键盘和显示屏作为(scanf,printf)输入输出外设。第一种方法使用微库将默认关闭半主机模式,但微库会使代码量优化减少,可能造成代码的稳定性降低,微库是面向深层嵌入式开发的(这句话可能是说微库是面向最终产品的,做实验与练习没必要用)。而这方法直接手动取消半主机模式,更加方便。
#if 1
#pragma import(__use_no_semihosting)
struct __FILE
{
int handle;
};
FILE __stdout;
//定义_sys_exit()以避免使用半主机模式
void _sys_exit(int x)
{
x = x;
}
//重定义fputc函数
int fputc(int ch, FILE *f)
{
while((USART1->SR&0X40)==0);//循环发送,直到发送完毕
USART1->DR = (uint8_t) ch;
return ch;
}
#endif
方案二:
新建一个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
也尝试过其他方案,之前各种搞都不行
比如
- https://www.cnblogs.com/xingboy/p/9522940.html中所提的
- 选上”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