欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

stm32cubemx中生成工程的usart1使用printf的两种方法

程序员文章站 2022-06-08 20:57:05
...

stm32cubemx中生成工程的usart1使用printf的两种方法

最近在从标准库转型为stm32cubemx开发记录一下遇到的小问题
网上已经有很多相同的printf解决方法了,这里整理两种简单的方法

方法一
1、在生成的usart.c中的/* Includes ------------------------------------------------------------------*/下添加

#include "stdio.h"

不添加会报FILE错误

然后在代码保护区/* USER CODE BEGIN 0 */添加,不在保护区添加MX生成代码时会被删除,也不能自己手动添加保护区

/* USER CODE BEGIN 0 */
#ifdef __GNUC__
/* With GCC, 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__ */
 
 
PUTCHAR_PROTOTYPE
{
  /* Place your implementation of fputc here */
  /* e.g. write a character to the USART2 and Loop until the end of transmission */
  HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, 0xFFFF);
 
  return ch;
}
/* USER CODE END 0 */

2、然后在main.c中的/* Includes ------------------------------------------------------------------*/下也同样添加

#include "stdio.h"

如果不在main.c下添加的话会报printf错误

3、在主函数中循环写段代码测试一下

  /* USER CODE BEGIN WHILE */
  while (1)
  {
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
		HAL_Delay(1000);
		printf("123!\r\n");
  }
  /* USER CODE END 3 */

这里就不截图了,实际已经在串口助手成功打印了

还有第二种printf的方法比较方便简单
方法二
这里提供了一种和网上不一样的printf使用方法,咱也是学习来的这里记录一下
生成工程以后不用处理usart.c,直接在main.c中的保护区添加代码
/* USER CODE BEGIN PD */

/* USER CODE END PD */

/* USER CODE BEGIN PD */

  #define printf1(...) HAL_UART_Transmit(&huart1,\

 										(uint8_t *)u_buf,\

										sprintf((char*)u_buf,__VA_ARGS__),\

										0xffff)

/* USER CODE END PD */

然后还是在main.c的保护区要定义一下u_buf的数组

 /* USER CODE BEGIN PV */
 uint8_t u_buf[256];
 /* USER CODE END PV */

之后我们就可以在主函数中使用了,来测试一下
这里主要调用的时候用的是printf1,而不是printf

/* USER CODE BEGIN WHILE */
  while (1)
  {
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
        HAL_Delay(2000);
        printf1("123456789");
  }
  /* USER CODE END 3 */

结果串口助手成功打印,完结。
stm32cubemx中生成工程的usart1使用printf的两种方法

相关标签: stm32cubemx