普冉PY32系列(五) 使用JLink RTT代替串口输出日志

科技资讯 投稿 6500 0 评论

普冉PY32系列(五) 使用JLink RTT代替串口输出日志

目录

    普冉PY32系列(一 PY32F0系列32位Cortex M0+ MCU简介
  • 普冉PY32系列(二 Ubuntu GCC Toolchain和VSCode开发环境
  • 普冉PY32系列(三 PY32F002A资源实测 - 这个型号不简单
  • 普冉PY32系列(四 PY32F002A/003/030的时钟设置
  • 普冉PY32系列(五 使用JLink RTT代替串口输出日志

JLink RTT

完整的介绍可以参考SEGGER官网的介绍页 https://www.segger.com/products/debug-probes/j-link/technology/about-real-time-transfer/

JLink RTT相关的软硬件

硬件部分

软件部分

软件部分在 JLink 的安装包中都包含了, 主要是两部分

    用于上位机的 RTT Viewer, 在安装路径下可以找到, 打开是类似于串口客户端的界面
  • 用于MCU的RTT库文件, 在安装路径的 Samples/RTT/ 目录下可以找到一个 SEGGER_RTT_Vxxx.tgz文件, 这个文件里包含了RTT需要的库.

├── Config
│   └── SEGGER_RTT_Conf.h
├── Examples
│   ├── Main_RTT_InputEchoApp.c
│   ├── Main_RTT_MenuApp.c
│   ├── Main_RTT_PrintfTest.c
│   └── Main_RTT_SpeedTestApp.c
├── LICENSE.md
├── README.md
├── RTT
│   ├── SEGGER_RTT_ASM_ARMv7M.S
│   ├── SEGGER_RTT.c
│   ├── SEGGER_RTT.h
│   └── SEGGER_RTT_printf.c
└── Syscalls
    ├── SEGGER_RTT_Syscalls_GCC.c
    ├── SEGGER_RTT_Syscalls_IAR.c
    ├── SEGGER_RTT_Syscalls_KEIL.c
    └── SEGGER_RTT_Syscalls_SES.c

在PY32F002A/003/030上使用JLink RTT

需要添加到项目的文件有

SEGGER_RTT.c
SEGGER_RTT.h
SEGGER_RTT_printf.c
SEGGER_RTT_Conf.h

其中 SEGGER_RTT_Conf.h 是RTT的配置文件

配置 SEGGER_RTT_Conf.h

#ifndef   BUFFER_SIZE_UP
  #define BUFFER_SIZE_UP                            (256  // Size of the buffer for terminal output of target, up to host (Default: 1k
#endif

再说一下 SEGGER_RTT_LOCK(和 SEGGER_RTT_UNLOCK(, 这两个方法用于禁用/启用MCU中断, 避免在RTT输出时被打断, 在M0/M0+上这两个方法默认为空, 因此是会产生输出混杂的情况的. 这块可以不设置, 因为RTT打印速度很快, 普通应用混杂的概率不大。

在项目中集成RTT输出

#include "SEGGER_RTT.h"

然后就可以调用RTT的方法输出了, 使用方法和printf基本上是一样的

# 输出字符串
SEGGER_RTT_WriteString(0, "exti_12 triggered\r\n";
# 输出带参数的字符串
SEGGER_RTT_printf(0, "SystemCoreClock: %ld\r\n", SystemCoreClock;

更完整的格式例子, 可以参考JLink ATT中的 Main_RTT_PrintfTest.c 文件

使用 RTT Viewer 查看输出

    Connection to J-Link: 选择 USB
  • Specify Target Device: 选择 PY32F030X8, (如果是32KF/4KR的选择 PY32F030X6
  • Target Interface & Speed: SWD, 4000KHz
  • RTT Control Block: Auto Detection

其它默认, 点击OK后就会连接到目标开始接收输出。

    使用 RTT 输出和 JLink 烧录是冲突的, 在烧录前需要断开 RTT
  1. RTT 带缓存, 因此即使错过一部分日志, 在连接上 RTT 后, 会将前面缓存的日志也显示出来
  2. RTT 的输出不带时间戳, 如果用惯了CuteCOM, 对这点可能会不习惯.

使用JLink RTT的示例代码

用于演示的代码已经放到仓库

https://github.com/IOsetting/py32f0-template/tree/main/Examples/LL/SEGGER_RTT

编程笔记 » 普冉PY32系列(五) 使用JLink RTT代替串口输出日志

赞同 (28) or 分享 (0)
游客 发表我的评论   换个身份
取消评论

表情
(0)个小伙伴在吐槽