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

也尝试过其他方案,之前各种搞都不行
比如

  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

posted @ 2024-08-17 21:35  Nichoooolas  阅读(136)  评论(0编辑  收藏  举报