Toggle navigation
首页
问答
文章
积分商城
专家
专区
更多专区...
文档中心
返回主站
搜索
提问
会员
中心
登录
注册
Jlink
RT-Thread Nano
软件IO模拟串口UART
调试时没有串口怎么办
发布于 2021-07-01 13:33:03 浏览:2299
订阅该版
[tocm] # 前言 基于RT-Thread Nano V3.1.3移植SEGGER/RTT # 一、RTT是什么 > J-Link RTT – Real Time Transfer: SEGGER's Real Time Transfer (RTT) is the proven technology for system monitoring and interactive user I/O in embedded applications. It combines the advantages of SWO and semihosting at very high performance. >* Bi-directional communication with the target application >* Very high transfer speed without affecting real time behavior >* Uses debug channel for communication >* No additional hardware or pin on target required >* Supported by any J-Link model >* Supported by ARM Cortex-M0/M0+/M1/M3/M4/M7/M23/M33 and Renesas RX100/200/600 >* Complete implementation code providing functionality and freedom 简而言之,RTT是SEGGER基于J-Link开发的一款可使用SWO接口(仅SWDIO、SWCLK和GND三线即可)与嵌入式系统进行输入输出交互的组件,不影响、不占用系统中的任何硬件资源。 # 二、为什么要使用RTT 在一些项目中,由于成本考量等原因,选用了硬件资源较为紧张的STM32,譬如只有两个串口。如果这仅有的两个串口都被系统占用了的话,我们在调试的时候就没有办法使用串口来对接控制台以及打印调试信息了。 令人欣慰的是,RT-Thread(Nano)的FinSH(shell)组件并非只局限于串口,且它的输入输出接口都被剥离了出来,方便我们将控制台重定向到其它硬件上如以太网、USB以及本文的J-Link RTT 等。 # 三、RTT怎么用 IDE: Windows + MDK + LL Libraries for STM32 需要下载安装:[J-Link / J-Trace](https://www.segger.com/downloads/jlink/) ![image.png](https://oss-club.rt-thread.org/uploads/20210701/1d8c841188f2adde6541c19d0a876e9f.png.webp) 1. 移植RTT到MDK工程中 举例说明: ①找到JLink安装目录 我的安装目录: ![image.png](https://oss-club.rt-thread.org/uploads/20210701/56ff72b72c631b69b9382d8f7f9c4cb2.png) ②将`..\SEGGER\JLink\Samples\RTT`目录中的`SEGGER_RTT_Vxxxx.zip`拷贝到工程目录中解压,创建相关文件夹管理,并加入工程,添加头文件目录。 我的工程结构: ![image.png](https://oss-club.rt-thread.org/uploads/20210701/01358af8d0004c5f0a09ad1181aef78d.png) ![image.png](https://oss-club.rt-thread.org/uploads/20210701/dc7dad978e54e916dadfcce8924766ff.png) 2. 修改代码与配置(LL库) ①修改`SEGGER_RTT_Conf.h` 按需修改上、下行以及缓冲区大小 ```c // // Most common case: // Down-channel 0: RTT // Down-channel 1: SystemView // #ifndef SEGGER_RTT_MAX_NUM_DOWN_BUFFERS #define SEGGER_RTT_MAX_NUM_DOWN_BUFFERS (3) // Max. number of down-buffers (H->T) available on this target (Default: 3) #endif #ifndef BUFFER_SIZE_UP #define BUFFER_SIZE_UP (1024) // Size of the buffer for terminal output of target, up to host (Default: 1k) #endif #ifndef BUFFER_SIZE_DOWN #define BUFFER_SIZE_DOWN (16) // Size of the buffer for terminal input to target from host (Usually keyboard input) (Default: 16) #endif #ifndef SEGGER_RTT_PRINTF_BUFFER_SIZE #define SEGGER_RTT_PRINTF_BUFFER_SIZE (64u) // Size of buffer for RTT printf to bulk-send chars via RTT (Default: 64) #endif #ifndef SEGGER_RTT_MODE_DEFAULT #define SEGGER_RTT_MODE_DEFAULT SEGGER_RTT_MODE_NO_BLOCK_SKIP // Mode for pre-initialized terminal channel (buffer 0) #endif ``` ②修改RT-Thread Nano -> `board.c` 我使用了一个宏来管理该模块和串口的互斥,方便调试的时候相互切换: ```c #define USART_SHELL USART1 #ifndef USART_SHELL #include "SEGGER_RTT.h" #endif ``` 使用如下代码来导出至RT-Thread Nano的自动初始化功能: ```c #ifndef USART_SHELL int RTT_init() { SEGGER_RTT_ConfigUpBuffer(0, "RTTUP", NULL, 0, SEGGER_RTT_MODE_NO_BLOCK_SKIP); SEGGER_RTT_ConfigDownBuffer(0, "RTTDOWN", NULL, 0, SEGGER_RTT_MODE_NO_BLOCK_SKIP); SEGGER_RTT_SetTerminal(0); return RT_EOK; } INIT_COMPONENT_EXPORT(RTT_init); #endif ``` 使用如下代码来对接RT-Thread Nano的输入输出函数(LL库): ```c void rt_hw_console_output(const char *str) { #ifdef USART_SHELL rt_size_t i = 0, size = 0; char a = '\r'; size = rt_strlen(str); for (i = 0; i < size; i++) { while(!LL_USART_IsActiveFlag_TXE(USART_SHELL)) { } if (*(str + i) == '\n') { LL_USART_TransmitData8(USART_SHELL, a); while(!LL_USART_IsActiveFlag_TXE(USART_SHELL)) { } } LL_USART_TransmitData8(USART_SHELL, *(str + i)); } #else SEGGER_RTT_printf(0, str); #endif } char rt_hw_console_getchar() { int ch = -1; #ifdef USART_SHELL if(LL_USART_IsActiveFlag_RXNE(USART_SHELL)) { ch = LL_USART_ReceiveData8(USART_SHELL); } else { if(LL_USART_IsActiveFlag_ORE(USART_SHELL)) { LL_USART_ClearFlag_ORE(USART_SHELL); } rt_thread_mdelay(10); } #else if(SEGGER_RTT_HasKey()) ch = SEGGER_RTT_GetKey(); else rt_thread_mdelay(10); #endif return ch; } ``` 3. 使用J-Link RTT Viewer 选择芯片型号并连接: ![image.png](https://oss-club.rt-thread.org/uploads/20210701/12890671518dbca38d9235db639b5187.png) ![image.png](https://oss-club.rt-thread.org/uploads/20210701/2b9c6feea3cf2e5f41c35a976cbd3a74.png) 输出功能: ![image.png](https://oss-club.rt-thread.org/uploads/20210701/e0069cb002a37177a8623be957154d6a.png) 输入功能: ![image.png](https://oss-club.rt-thread.org/uploads/20210701/89dd4a4536bc9672d09d84223c658b07.png) # 问题与总结 本文简述了如何将RTT对接到RT-Thread Nano中来代替常用的串口打印。RT-Thread(Nano)的模块化、接口抽象和面向对象设计能够让我们很轻松地做功能移植,灵活且方便。然而在使用过程中发现有如下问题有待解决,时间原因我暂时不去追根溯源,欢迎大家研究并留言: ![image.png](https://oss-club.rt-thread.org/uploads/20210701/daca6b6c99b3865cc98032de63b69b09.png) ## 参考资料: 1. [Real Time Transfer (RTT)](https://www.segger.com/products/debug-probes/j-link/technology/about-real-time-transfer/) 2. [移植控制台/FinSH (rt-thread.org)](https://www.rt-thread.org/document/site/#/rt-thread-version/rt-thread-nano/finsh-port/an0045-finsh-port) 3. [SEGGER调试利器RTT(Real Time Transfer)组件下载](http://www.armbbs.cn/forum.php?mod=viewthread&tid=86014&highlight=RTT) 4. [【专题教程第5期】工程调试利器RTT实时数据传输组件,替代串口调试,速度飞快,可以在中断和多任务中随意调用](http://www.armbbs.cn/forum.php?mod=viewthread&tid=86177&highlight=RTT)
0
条评论
默认排序
按发布时间排序
登录
注册新账号
关于作者
CharlesX
Make science fiction science
文章
4
回答
33
被采纳
8
关注TA
发私信
相关文章
1
求高手指点,RTThread下nanosleep()函数功能如何实现?在线等啊
2
RTT1.2.2在新塘Nano130KE3BN的移植中始终出现栈溢出的问题
3
官方能否出一个nano在mdk下移植finsh到stm32的教程
4
从裸机开始,创建一个RT-Thread Nano系统工程
5
Nano版如何启用shell
6
项目从RTT 2.x NANO移植到 RTT 3.x ENV 环境
7
nano 版本有没有集成到 IAR 中啊?
8
关于MDK5的RT-THREAD NANO中添加MSH组件的例程
9
rtt_nano版本,源代码在哪里下载啊?
10
RTT Nano 在keil 使用C++11 的问题
推荐文章
1
RT-Thread应用项目汇总
2
玩转RT-Thread系列教程
3
国产MCU移植系列教程汇总,欢迎查看!
4
机器人操作系统 (ROS2) 和 RT-Thread 通信
5
五分钟玩转RT-Thread新社区
6
【技术三千问】之《玩转ART-Pi》,看这篇就够了!干货汇总
7
关于STM32H7开发板上使用SDIO接口驱动SD卡挂载文件系统的问题总结
8
STM32的“GPU”——DMA2D实例详解
9
RT-Thread隐藏的宝藏之completion
10
【ART-PI】RT-Thread 开启RTC 与 Alarm组件
热门标签
RT-Thread Studio
串口
Env
LWIP
SPI
AT
Bootloader
Hardfault
CAN总线
FinSH
ART-Pi
USB
DMA
文件系统
RT-Thread
SCons
RT-Thread Nano
线程
MQTT
STM32
RTC
FAL
rt-smart
ESP8266
I2C_IIC
WIZnet_W5500
UART
ota在线升级
PWM
cubemx
freemodbus
flash
packages_软件包
BSP
潘多拉开发板_Pandora
定时器
ADC
GD32
flashDB
socket
中断
Debug
编译报错
msh
SFUD
keil_MDK
rt_mq_消息队列_msg_queue
MicroPython
ulog
C++_cpp
本月问答贡献
踩姑娘的小蘑菇
7
个答案
3
次被采纳
a1012112796
15
个答案
2
次被采纳
张世争
9
个答案
2
次被采纳
rv666
5
个答案
2
次被采纳
用户名由3_15位
13
个答案
1
次被采纳
本月文章贡献
程序员阿伟
9
篇文章
2
次点赞
hhart
3
篇文章
4
次点赞
大龄码农
1
篇文章
5
次点赞
RTT_逍遥
1
篇文章
2
次点赞
ThinkCode
1
篇文章
1
次点赞
回到
顶部
发布
问题
投诉
建议
回到
底部