基于stm32cubemx生成的HAL代码配置usart1使用printf打印数据(重定向)

本文详细介绍了如何在STM32CubeMX生成的HAL代码中配置USART1,通过两种方法移植并使用printf进行数据打印:一是直接添加stdio头文件并实现puts回调,二是创建printf1自定义函数。重点在于解决移植过程中的问题和调试技巧。
摘要由CSDN通过智能技术生成

stm32cubemx生成的HAL代码配置usart1使用printf打印数据

MX生成的HAL库代码没有printf,如果需要使用的话需要把标准库里的回调函数移植过去,这里提供了两个方法。

方法一

1、在生成的usart.c中的/* Includes ------------------------------------------------------------------*/下添加
#include “stdio.h”

不添加stdio.h会报FILE错误
————————————————————————————————————————

在测试过程中MX重新生成代码会删除usart.c中的#include “stdio.h”

把#include "stdio.h"添加到/* USER CODE BEGIN 0 */保护区就行了

————————————————————————————————————————
然后在usart.c代码保护区/* 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、处理完usart.c以后我们回到mian.c中也在
————————————————————————————————————————

/* USER CODE BEGIN Includes */

/* USER CODE END Includes */保护区中添加#include “stdio.h”
————————————————————————————————————————

不能添加在/* Includes ------------*/下,MX重新生成工程时会被删除

这里不添加会报printf错误

然后我们就可以在main中使用printf了
在main中定义一个参数

int count = 0;

在while中写个代码测试一下

   /* USER CODE BEGIN WHILE */
    while (1)
    {
      /* USER CODE END WHILE */
  
      /* USER CODE BEGIN 3 */
          HAL_Delay(1000);
          printf("count = %d\r\n",count++);
    }
   /* USER CODE END 3 */

在这里插入图片描述

将上代码复制进工程里面,打开串口调试助手,如果调试代码没有出现错误,烧录完成之后,串口却没有显示,这个时候可能就需要调试硬件,尤其是连接电脑的端口,可换用不同的端口进行调试,自己在调试的时候就是因为这个电脑端口连接的问题,导致串口一直不显示。

方法二

这里提供了一种和网上不一样的printf使用方法,咱也是学习来的这里记录一下

生成工程以后在mian.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 */

还要在

/* USER CODE BEGIN PV */

/* USER CODE END PV */

中间定义u_buf才可以使用

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

注意这里定义的和普通的printf多了一个1,是printf1
我们在下面的main函数的循环中调试一下printf1

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

在调试串口处就可以显示数据了

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值