SEGGER RTT在STM32中的移植
基于pyOCD + DAPLink在STM32单片机上使用SEGGER RTT进行信息的输出
官方Overview
With RTT it is possible to output information from the target microcontroller as well as sending input to the application at a very high speed without affecting the target’s real time behavior. SEGGER RTT can be used with any J-Link model and any supported target processor which allows background memory access, which are Cortex-M and RX targets.
简单来说,使用RTT就可以实现仅一个仿真器(DAP-Link、ST-Link、J-Link)就能输出信息,而不需要额外的外设,比如串口,并且速度极快。
移植使用
RTT兼容不同的编译器,这里以STM32CubeMX生成的CMake工程为例
RTT驱动源码移植
下载
在github下载SEGGER RTT源代码,仓库链接:SEGGERMicro/RTT: SEGGER RTT Sources
添加源码到工程目录
需要移植的文件有:
RTT/SEGGER_RTT.cRTT/SEGGER_RTT.hRTT/SEGGER_RTT_printf.cRTT/SEGGER_RTT_ASM_ARMv7M.SConfig/SEGGER_RTT_Conf.h
将以上5个文件拷贝到工程目录中,工程文件夹分类依据个人习惯,比如在工程中新建一个Library文件夹专门用于存放第三方库文件,在Library下创建segger_rtt存放SEGGER RTT源代码
移植后的目录结构如下:
1 | RTT-demo/ |
加入构建系统
注意:不同的开发工具或编译工具,操作步骤均不相同,这里以CMake为例
在Library/segger_rtt下创建CMakeLists.txt并写入以下内容:
1 | # Library/segger_rtt/CMakeLists.txt |

在项目根目录的CMakeLists.txt中,将Library/segger_rtt作为子模块添加,即增加一句:
1 | add_subdirectory(Library/segger_rtt) |

编译和使用
在代码中引用SEGGER_RTT.h头文件
1 | /* USER CODE BEGIN Includes */ |
在main函数中初始化
1 | /* USER CODE BEGIN Init */ |
在主循环中尝试调用打印函数,第一个参数默认写0即可
1 | /* Infinite loop */ |
输出预览
[!NOTE]
如果使用的仿真器是J-Link,直接使用SEGGER官方提供的J-Link RTT Viewer即可
如果是DAP-Link或ST-Link,可以使用pyOCD进行预览
安装pyOCD
直接使用pip命令安装即可:
注意:pyOCD依赖python运行环境,电脑上需要安装python运行环境,版本默认装最新
1 | pip install pyocd -i https://pypi.tuna.tsinghua.edu.cn/simple |
安装芯片包,这里以STM32G431CBU6为例:
1 | pyocd pack install stm32g431cb |
安装完成后,可以通过以下命令查看已有的芯片包,供后续预览使用:
1 | pyocd list --targets |
通过以下命令可以查看已连接的仿真器:
1 | pyocd list |
预览
使用以下命令进入RTT预览模式:
1 | pyocd rtt --target stm32g431cbux |
其中stm32g431cbux应为当前使用的芯片型号,x为通配符
