J-link工具使用技巧

前言

J-Link作为ARM仿真调试器在嵌入式领域应用广泛,然而多数开发者仅使用其烧录和调试功能,对J-Flash SPI 和RTT功能知之甚少。本文将详细介绍J-Link的SPI Flash编程和实时传输(RTT)功能的使用方法。

1 J-Flash SPI工具使用

1.1 硬件连接

J-link内部集成了SPI协议,部分接口是作为SPI复用功能的,具体硬件连接,如下图所示:
在这里插入图片描述
对于20P的标准JTAG接口

引脚编号名称属性SPI flash接口
5DI输入连接SPI Flash的MOSI引脚
7nCS输出连接SPI Flash的CS引脚
9CLK输出连接SPI Flash的CLK引脚
13DO输出连接SPI Flash的 DO引脚

对于10P的JTAG接口

引脚编号名称属性SPI flash接口
2nCS输入连接SPI Flash的nCS引脚
4CLK输出连接SPI Flash的CLK引脚
6DI输出连接SPI Flash的DI引脚
8DO输出连接SPI Flash的 DO引脚

1.2 J-Flash SPI工程创建

J-Flash SPI提供两种操作工具:图形界面的JFlashSPI.exe和命令行版本的JFlashSPI_CL.exe。本文主要讲解图形化工具JFlashSPI的使用方法。您可以在Jlink软件的安装目录中直接双击JFlashSPI启动程序,其界面布局与之前介绍的JFlash工具基本相似。
(a)打开JFlashSPI_CL.exe->Create new project

(b)Select device type->SPI NOR Flash ,Speed->15000kHz左右,Ddevice selection不知道flash的具体型号可以选择Auto detection(自动检测flash芯片型号),Select from list(根据具体的flash芯片型号选择支持了市面上主流的flash芯片)。
在这里插入图片描述
在这里插入图片描述
(C)连接SPI flash芯片,点击Target->Connect,如果连接成功的话,会在底部输出连接信息,会显示Flash芯片的型号,生产厂家,FlashID等信息。
在这里插入图片描述
(D)点击File->Opendatafile,打开要烧写的字库文件,支持多种格式的文件,由于是选择的Bin文件,没有起始地址,所以手动输入烧写的起始地址,这里填写烧录的起始地址就可以了,这里我们填写0。
在这里插入图片描述
在这里插入图片描述
(E)下载,点击Target->Auto下载程序到Flash芯片内。
在这里插入图片描述
下载完成后,会在底部窗口显示下载成功的信息,可以看出烧写速度还是比较快的,170KB的字库文件,用时不到1秒钟。
在这里插入图片描述
(F)与读写单片机程序一样,也是支持读取SPIFlash芯片的数据,点击Read Back->Entire chip进行回读。
在这里插入图片描述

2. J-Link的RTT使用。v

2.1 什么是RTT?

RTT(Real Time Transfer)是一种用于嵌入式中与用户进行交互的技术,它结合了SWO和半主机的优点,具有极高的性能。
使用RTT可以从MCU非常快速输出调试信息和数据,且不影响MCU实时性。这个功能可以用于很多支持J-Link的设备和MCU,兼容性强。
RTT支持两个方向的多个通道,上到主机,下到目标,它可以用于不同的目的,为用户提供尽可能多的自由。默认实现每个方向使用一个通道,用于可打印终端输入和输出。
使用J-Link RTT Viewer,可用于“虚拟”终端,允许打印到多个窗口(例如,一个用于标准输出,一个对于错误输出,一个用于调试输出)。
在这里插入图片描述

2.2 RTT的工作原理

RTT在MCU的存储器中使用SEGGER RTT控制块结构管理数据读写。控制块对于每个可用的信道都在内存中包含了一个ID,通过J-Link或者环形缓冲结构区(链表)都可以通过ID找到对应的控制块。
可用信道的最大数目可以在编译时配置,并且每个缓冲区都可以在MCU运行时配置和使用。上下缓冲区可以分开处理。每个通道都可以配置为阻塞或非阻塞。
在阻塞模式下,应用程序将等待缓冲区写满,直到可以写入所有内存为止,这将导致应用程序处于阻塞状态,但可以防止数据丢失。
在非阻塞模式下,只会写入适合缓冲区的数据,或完全不写入缓冲区,其余的数据将被丢弃。这样即使没有连接调试器,也可以实时运行。开发人员不必创建特殊的调试版本,并且代码可以保留在发布应用程序中。
在这里插入图片描述

2.3 RTT的性能

RTT的性能明显高于其他任何用于将数据输出到主机PC的方式。平均一行文本可以在1微秒或更短的时间内输出。基本上相当于做一个memcopy()的时间。

RTT实现代码使用大约500字节的ROM和(n(通道数) * (24字节ID+24字节))的RAM。推荐的大小是1 kByte(上行信道)和16到32字节(下行信道),这取决于输入/输出的负载。
在这里插入图片描述

2.4 RTT的安装和使用

(a)首先安装J-Link的软件驱动。
在这里插入图片描述
(b)安装完成后,打开J-Link的安装目录(开始->SEGGR->J-Link RTT Viewer->右键打开文件所在位置->然后继续右键打开文件所在位置->此时就是安装目录了),找到如下路径SEGGER\JLink_V632f\Samples\RTT,解压路径里面的压缩包SEGGER_RTT_V632f.zip(不同的版本,V后面的数字可能不一样)。
在这里插入图片描述
(c)将解压完的文件拷贝到代码工程目录中。

(d)在项目工程中加入SEGGER_RTT_V632f\RTT目录下的全部四个文件。工程添加文件方法请自行百度。

(e)工程加入文件后,在想要用到RTT的文件中包含#include “SEGGER_RTT.h”,然后直接调用SEGGER_RTT_printf()就好了,

例如SEGGER_RTT_printf(0,“hello world!”)这个和C语言的printf的格式差不多,就是前面加了一个端口0的参数。(详细信息请看高级使用教程)

(f)然后点击开始->SEGGR->J-Link RTT Viewer,打开J-Link RTT Viewer 选择好你的芯片型号后,点击确认。
在这里插入图片描述
(g)然后就能看到我们打印的内容了。
在这里插入图片描述
1.部分函数介绍:

(1)void SEGGER_RTT_Init (void) RTT初始化函数,应放于程序开始阶段。

(2)int SEGGER_RTT_GetKey (void); 从RTT终端获取一个按键字符。

Return Value

ValueMeaning
>=0返回按键字符(0-255)
< 0缓存区中没有有效的字符

示例代码:

int c;
c = SEGGER_RTT_GetKey();
if (c == 'q') {
    exit();
}

(3)int SEGGER_RTT_HasKey (void);检测缓存区中是否还有字符。
Return Value

ValueMeaning
0缓存区中至少有一个字符是有效的
1缓存区中没有有效的字符

示例代码:

   if (SEGGER_RTT_HasKey()) {
      int c = SEGGER_RTT_GetKey();
   }

(4)int SEGGER_RTT_printf (unsigned BufferIndex, const char * sFormat, …)格式化输出字符串
Return Value

ValueMeaning
>=0已经发送的字符数
< 0发生错误

附加信息:

转换规范具有以下语法:

%[标志][字段宽度][.精度]转换指定程序

支持的标志:

-:在字段宽度内左对齐

+:始终打印有符号转换的符号扩展名

0:用0代替空格。使用“-”标志或精度时忽略

支持的转换说明符:

c:将参数打印为一个字符

d:将参数打印为有符号整数

u:将参数打印为无符号整数

x:将参数打印为十六进制整数

s:打印参数指向的字符串

p:将参数打印为8位十六进制整数。

ps.似乎官方没有给float类型格式化输出方式。

示例代码:

SEGGER_RTT_printf(0, "SEGGER RTT Sample. Uptime: %.10dms.", /*OS_Time*/ 890912);

同时,可以使用SEGGER_RTT_printf()来设置字体颜色还背景颜色:
示例代码:

SEGGER_RTT_printf(0,RTT_CTRL_BG_WHITE);
SEGGER_RTT_printf(0,RTT_CTRL_TEXT_BLUE);

(5)void SEGGER_RTT_SetTerminal(char TerminalId);设置虚拟终端ID。
Return Value

ParameterMeaning
TerminalId虚拟终端的ID

示例代码:

//
// Send a string to terminal 1 which is used as error out.
//
SEGGER_RTT_SetTerminal(1); // Select terminal 1
SEGGER_RTT_WriteString(0, "ERROR: Buffer overflow");
SEGGER_RTT_SetTerminal(0); // Reset to standard terminal

SEGGER_RTT_WriteString中的0参数,是通道号,不是终端号。

(6)int SEGGER_RTT_WaitKey (void);检测缓存区中是否还有字符。
Return Value

ValueMeaning
≥0等待返回一个按键值
示例代码:
   int c = 0;
    do {
        c = SEGGER_RTT_WaitKey();
    } while (c != 'c');

附上测试代码

/*terminal 0: if you press any key in the keyboard ,terminal 0 will show the key value witch you press.
  terminal 1: show the date
  terminal 2: show the time
*/		
if (SEGGER_RTT_HasKey()) 
{
	int c = SEGGER_RTT_GetKey();
	SEGGER_RTT_SetTerminal(0); 
	SEGGER_RTT_Write (0, &c, 1);
	SEGGER_RTT_printf(0,"\n");
}
//GET DATA
HAL_RTC_GetTime(&hrtc,&_current_time,RTC_FORMAT_BIN);
//GET TIME
HAL_RTC_GetDate(&hrtc,&_current_date,RTC_FORMAT_BIN);
//Printf
SEGGER_RTT_SetTerminal(1); 
SEGGER_RTT_printf(0,"%d . %d . %d \n",_current_date.Year,_current_date.Month,_current_date.Date);
SEGGER_RTT_SetTerminal(2); 
SEGGER_RTT_printf(0,"%d : %d : %d \n\n",_current_time.Hours,_current_time.Minutes,_current_time.Seconds);

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值