使用VSCode+CubeMx开发STM32,这里介绍分别使用串口以及SWD调试接口输出日志功能;
1.建立工程
1.1 创建项目文件
从已有的仓库中创建一个工程:
git clone https://github.com/makerinchina-iot/vscode_stm32cubemx_hello.git log
使用VSCode打开工程后,需要更改如下名字:
- 文件夹根目录下CMakeLists.txt 文件中修改工程名字为log:
set(CMAKE_PROJECT_NAME log)
- stm32cubemx配置文件更改为 log.ioc ,并更改以下文件名:
...
ProjectManager.ProjectFileName=log.ioc
ProjectManager.ProjectName=log
...
1.2 引脚配置
使用STM32CubeMx打开ioc配置文件,然后配置对应的串口引脚;
2. 编写代码
2.1 基本的串口输出
(1)首先在main中添加串口测试代码,测试串口正常输出:
const uint8_t test_out[] = "Hello, makerinchina!";
HAL_UART_Transmit(&huart2, test_out, sizeof(test_out), HAL_MAX_DELAY);
(2)输出重定向,使用printf打印输出:
- 在main中添加如下代码:
#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代码到工程目录,安装目录如下:
...\JLink\Samples\RTT\SEGGER_RTT_V810h.zip\RTT
新建libs\segger_rtt目录,然后复制源码如下:
(2)将代码添加到cmake编译系统,修改CmakeLists.txt文件如下:
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打印:
#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文件中添加文件到编译系统:
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打印:
#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打印
评论