使用VSCode+CubeMx开发STM32,这里介绍分别使用串口以及SWD调试接口输出日志功能;

1.建立工程

1.1 创建项目文件

从已有的仓库中创建一个工程:

1
git clone https://github.com/makerinchina-iot/vscode_stm32cubemx_hello.git log

使用VSCode打开工程后,需要更改如下名字:

  • 文件夹根目录下CMakeLists.txt 文件中修改工程名字为log:
1
set(CMAKE_PROJECT_NAME log)
  • stm32cubemx配置文件更改为 log.ioc ,并更改以下文件名:
1
2
3
4
...
ProjectManager.ProjectFileName=log.ioc
ProjectManager.ProjectName=log
...
1.2 引脚配置

使用STM32CubeMx打开ioc配置文件,然后配置对应的串口引脚;

2. 编写代码

2.1 基本的串口输出

(1)首先在main中添加串口测试代码,测试串口正常输出:

1
2
const uint8_t test_out[] = "Hello, makerinchina!";
HAL_UART_Transmit(&huart2, test_out, sizeof(test_out), HAL_MAX_DELAY);

(2)输出重定向,使用printf打印输出:

  • 在main中添加如下代码:
1
2
3
4
5
6
7
8
#include <stdio.h>

int _write(int fd, char *ptr, int len)
{
UNUSED(fd);
HAL_UART_Transmit(&huart2, (uint8_t *)ptr, len, 0xFFFF);
return len;
}
  • 之后就可以使用 printf 函数打印输出到串口了;
2.2 使用SeggerRTT通过SWD调试接口输出

(1)首先下载Jlink软件安装(SEGGER - The Embedded Experts - Downloads - J-Link / J-Trace),然后从安装目录复制segger rtt代码到工程目录,安装目录如下:

1
...\JLink\Samples\RTT\SEGGER_RTT_V810h.zip\RTT

新建libs\segger_rtt目录,然后复制源码如下:

(2)将代码添加到cmake编译系统,修改CmakeLists.txt文件如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16

file(GLOB_RECURSE segger_rtt_src "libs/segger_rtt/*.c")

# Add sources to executable
target_sources(${CMAKE_PROJECT_NAME} PRIVATE
# Add user sources here

${segger_rtt_src}
)

# Add include paths
target_include_directories(${CMAKE_PROJECT_NAME} PRIVATE
# Add user defined include paths

libs/segger_rtt
)

这样在main中即可使用segger rtt打印:

1
2
3
4
5
#include "SEGGER_RTT.h"

SEGGER_RTT_Init();

SEGGER_RTT_printf(0, "Hello, makerinchina!\r\n");

可以看到正常打印:

2.3 使用日志库

这里使用rxi/log.c: A simple logging library implemented in C99

(1)将上述库复制到 libs/log 目录中,并添加相关移植文件:

这里通过 log_add_callback 接口添加串口和rtt两种输出,因此添加了log2rtt和log2serial移植文件;

(2)在CmakeLists.txt文件中添加文件到编译系统:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
file(GLOB_RECURSE log_src "libs/log/*.c")
file(GLOB_RECURSE segger_rtt_src "libs/segger_rtt/*.c")

# Add sources to executable
target_sources(${CMAKE_PROJECT_NAME} PRIVATE
# Add user sources here
${log_src}
${segger_rtt_src}
)

# Add include paths
target_include_directories(${CMAKE_PROJECT_NAME} PRIVATE
# Add user defined include paths
libs/log
libs/segger_rtt
)

(3)log打印:

1
2
3
4
5
6
7
8
9
10
11
12
#include "log.h"    

log_init(LOG_TRACE, false);

log_debug("debug msg print from rtt ^_^ ");
log_info("this is the info msg");
log_warn("warnning message shoud be attention");
log_fatal("some fatal err occured ☹");
log_trace("clearly trace msg info");
log_error("some errors occured, oops.");
log_debug("...\r\n");
log_debug("中文信息输出显示");
  • 串口输入打印
  • RTT打印