STM32学习笔记(5):调试信息输出

调试信息输出

为了方便在开发中将串口信息输出,查看中间环节是否正确,可以将函数printf进行重定向到串口中。

重定向printf输出

1.宏定义

在main.c中进行宏定义如下所示:

/* Private includes ----------------------------------------------------------*/
/* USER CODE BEGIN Includes */
#include <stdio.h>
#ifdef __GNUC__
#define PUTCHAR_PROTOTYPE int __io_putchar(int ch)
#else
#define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)
#endif
PUTCHAR_PROTOTYPE
{
  // 参数1: 使用哪个usart ,参数2: 字符, 参数3:输出数量,参数4:超时等待时间
  HAL_UART_Transmit(&huart1 , (uint8_t *)&ch, 1 , 0xffff);
  return ch;
}
/* USER CODE END Includes */

2.输出调试信息

需要注意到,此时调用printf函数输出时需要加上**\r\n**,否则将卡住无输出。

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  uint8_t cnt=1;
  while (1)
  {
    //  输出
    printf("hello world!%d\r\n", cnt);
    cnt += 1;
    //  延时500ms
    HAL_Delay(500);
  }
    /* USER CODE END WHILE */

在这里插入图片描述

重定向log输出

采用printf重定向输出需要注意添加\r\n,同时在完成调试后必须删除相关输出或进行注释。而使用log输出可以有效解决此类问题。

1.宏定义

同样需要先在main.c中进行宏定义

/* Private includes ----------------------------------------------------------*/
/* USER CODE BEGIN Includes */
#include <stdio.h>
#ifdef __GNUC__
#define PUTCHAR_PROTOTYPE int __io_putchar(int ch)
#else
#define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)
#endif
PUTCHAR_PROTOTYPE
{
  // 参数1: 使用哪个usart ,参数2: 字符, 参数3:输出数量,参数4:超时等待时间
  HAL_UART_Transmit(&huart1 , (uint8_t *)&ch, 1 , 0xffff);
  return ch;
}

#define LOG_ENABLE 1
#if LOG_ENABLE
#define log(format,...) printf(format"\r\n",##__VA_ARGS__)
#else
#define log(format,...)
#endif
/* USER CODE END Includes */

2.日志输出

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  uint8_t cnt=1;
  while (1)
  {
    //  输出
    log("hello world!%d", cnt);
    cnt += 1;
    //  延时500ms
    HAL_Delay(1000);
  }
    /* USER CODE END WHILE */

在这里插入图片描述

3.关闭日志输出

为保证下位机代码的封装,有时日志信息不应被用户查看,此时只需要将上述宏定义中变量LOG_ENABLE定义为0即可关闭日志输出

#define LOG_ENABLE 0

输出浮点数

默认使用的输出并未开启浮点数输出,可以通过修改CMakeLists.txt实现输出。

1.CMakeLists.txt修改

打开项目空间根目录下的CMakeLists.txt文件,找到其中语句:

add_compile_options(-ffunction-sections -fdata-sections -fno-common -fmessage-length=0)

在其后添加内容:

add_compile_options(-u _printf_float)

在这里插入图片描述

2.重置缓存并重新加载项目

完成对CMakeList.txt文件的改动后,需要重置缓存并重新加载项目。

点击CLion上方选项卡Tools(工具)并选择CMake下的Reset Cache and Reload Project(重置缓存并重新加载项目)
在这里插入图片描述

3.输出浮点数

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
    //  输出
    log("hello world!%f", 1.1);
    //  延时500ms
    HAL_Delay(1000);
  }
    /* USER CODE END WHILE */

烧录后,效果如下所示:

在这里插入图片描述

4.重置

此部分,在使用CubeMX重新生成代码时,将被覆盖,需要重新修改CMakeList.txt文件添加相应内容。

由于整型数据UInt8仅占8位比特,而单精度浮点型float占32位比特。所以在进行数据传输时,一般将浮点型扩大取值从而降低消耗。

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
    //  输出
    log("hello world!%hd", (short)(1.11*100));
    //  延时500ms
    HAL_Delay(1000);
  }
    /* USER CODE END WHILE */
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值