使用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打印输出:
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("中文信息输出显示");
|
