JLink RTT(Real Time Transfer) 是用於嵌入式系統監控和交互的工具, 類似於SWO, 可以雙向通信, 特點是性能很高, 基本上不影響嵌入式應用的實時行為, 可以對比一下使用printf輸出日誌時的各種限制. 而且因為和 JLink 介面集成, 不需要再浪費一個串口輸出 pr... ...
目錄
- 普冉PY32系列(一) PY32F0系列32位Cortex M0+ MCU簡介
- 普冉PY32系列(二) Ubuntu GCC Toolchain和VSCode開發環境
- 普冉PY32系列(三) PY32F002A資源實測 - 這個型號不簡單
- 普冉PY32系列(四) PY32F002A/003/030的時鐘設置
- 普冉PY32系列(五) 使用JLink RTT代替串口輸出日誌
JLink RTT
JLink RTT(Real Time Transfer) 是用於嵌入式系統監控和交互的工具, 類似於SWO, 可以雙向通信, 特點是性能很高, 基本上不影響嵌入式應用的實時行為, 可以對比一下使用printf輸出日誌時的各種限制. 而且因為和 JLink 介面集成, 不需要再浪費一個串口輸出 printf了.
完整的介紹可以參考SEGGER官網的介紹頁 https://www.segger.com/products/debug-probes/j-link/technology/about-real-time-transfer/
JLink RTT相關的軟硬體
硬體部分
RTT可以支持最低端的 JLink OB, 因此硬體上只需要有一個 JLink OB.
軟體部分
軟體部分在 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
其它的配置可以使用預設, 只需要調整一下 BUFFER_SIZE_UP, 這是在MCU上需要占用的位元組數, 預設為 1024, 對於普通調試可以設成256.
#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輸出
在需要使用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 查看輸出
打開 RTT Viewer, 會彈出配置視窗, 以下根據 JLink OB進行配置
- 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
- RTT 帶緩存, 因此即使錯過一部分日誌, 在連接上 RTT 後, 會將前面緩存的日誌也顯示出來
- RTT 的輸出不帶時間戳, 如果用慣了CuteCOM, 對這點可能會不習慣.
使用JLink RTT的示例代碼
用於演示的代碼已經放到倉庫
https://github.com/IOsetting/py32f0-template/tree/main/Examples/LL/SEGGER_RTT