STM32使用CUBEMX+Keil串口输出重定向方法
环境配置说明:
PC:win10专业版 版本号2009
Keil:uversiobV5.21a
STM32CUBEMX:V6.5.0
测试用开发板:STM32F407VET6核心板
F4固件库:STM32Cube FW_F4 V1.27.0
重要说明
如果要使用printf函数来打印串口数据,1、串口配置好;2、keil需要设置使用MicroLIB;3、在“usart.h”中需要包含“#include “stdio.h””(注:有的串口函数可能是“uart.h”,同理)如下图所示。这个是大前提,如果这没设置,后面的配置就没用了。
然后需要在“USART.h”包含stdio.h头文件如下图
方式一:在“USART.C”添加下列这段代码即可
#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
{
/* Place your implementation of fputc here */
/* e.g. write a character to the EVAL_COM1 and Loop until the end of transmission */
HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, 0xFFFF);
return ch;
}
方式二:在“USART.C”添加下列这段代码即可
int fputc(int ch, FILE *fp);
int fgetc(FILE *fp);
int fputc(int ch, FILE *fp)
{
HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, 0xffff);
return ch;
}
int fgetc(FILE *fp)
{
uint8_t ch = 0;
HAL_UART_Receive(&huart1, &ch, 1, 0xffff);
return ch;
}
其他方式:这个遇到了再补上来
如何修改串口
上面两段代码,都只要修改这句和就可以了
*HAL_UART_Transmit(&huart1, (uint8_t )&ch, 1, 0xffff);
将huart1换成你设置的串口就可以了。
另外需要说明的是stdio.h头文件要放在“USART.H”头文件中,不然其他地方使用会报警告甚至出错。
2023年7月29日更新
如果上面的代码添加到程序中去之后要报错,如下图所示,应该检查确认当前串口是UART还是USART;
红框圈出来的报错就是因为我当前的串口使用的是USART,所以改为红框下面的那句就行了,修改后如下所示:
确认是UART还是USART的方法很多,这里最简单的可以看这里红框圈出来这句话: