【转载修正】STM32-HAL库-printf函数重定向(USART应用实例)

为了便于调试,我们可以利用printf打印出调试的信息,在STM32应用中,我们就可以利用printf函数通过串口打印信息到串口调试助手上。原文里面有一些设置没有提到,这里重新整理了一下评论区大佬的指正,发布在自己的博客里面以备不时之需。

其中,配置串口的部分直接跳过,一般用cubeMX配置USART1即可,波特率115200然后其他默认就好。

 

然后cubeMX要选择生成单独的文件,这样才会有usart.c。

 

1、引入printf重定向代码块

下面直接贴需要在usart.c中添加的代码:

/* USER CODE BEGIN 0 */
#include <stdio.h>

 #ifdef __GNUC__
     #define PUTCHAR_PROTOTYPE int __io_putchar(int ch) 
     //这里原文的在_io_putchar前面又加了一个_ ,据说可以在IAR下使用
 #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,0xFFFF);
     return ch;
 }
/* USER CODE END 0 */

2、在main.c中 测试打印

上面的步骤已经将stdio.h添加到usart.c中了,如果main.c里面没有包含usart.c的话需要再单独添加一下,将#include<stdio.h>直接加入main.h中,因为Cube生成文件大部分都是包含了main.h的,所以除了自建文件几乎都可以全局包含到stdio.h,而且自建文件也可以直接包含main.h。操作如下:

//main.h

/* Private includes ----------------------------------------------------------*/
/* USER CODE BEGIN Includes */
#include<stdio.h>
/* USER CODE END Includes */
  while (1)
  {
    /* USER CODE END WHILE */
			printf("串口打印测试\n");
			HAL_Delay(1000);
    /* USER CODE BEGIN 3 */
  }

在自建文件使用printf函数时记得#include<stdio.h>

3、在MDK keil中选择 Use MicroLIB

(可选)将printf独立封装成函数配合hal库的usart.c来使用

 还没弄成功,晚点搞一下