1、硬件准备
首先准备Jlink硬件,V8版本在J-Scope中采样频率高到50Hz,粗略的观看还可以;V9版本可以到1MHz;对于Scpoe还有一个同时观察变量的数量,V8最少,V9可观察的多一些,基本够用。
2、软件准备
segger官方网站地址:https://www.segger.com/
Scope软件下载地址:https://www.segger.com/j-link-j-scope.html
目前为Setup_JScope_V510d.exe
3、J-Scope软件配套JLink的软件版本
要想使用J-Scope,需要JLink的软件版本高一些,软件版本和Jlink的硬件本无关,只要自己的仿真器支持升级就行,所以最好下载最新的JLink驱动。
下载网站:https://www.segger.com/downloads/jlink/#J-LinkSoftwareAndDocumentationPack
目前最新的驱动:JLink_Windows_V620h.exe
4、J-Scope软件的HSS使用方法
安装完成之后,找到自己的安装目录,如图所示,会看到J-Scope的启动文件和他的帮助文件。
UM08028_JScope.pdf是官方的帮助文档,非常详细专业。
(1)启动软件
可以新建工程,或打开以前已有的工程,如下图所示。
选择新建新建,电机【OK】后的界面如图所示:
(2)J-Scope软件配置
a、J-Link的链接选择
USB:大家用的基本是USB接口的
Serial No
TCP/IP
Exitsting Session
b、Specify Target Device:指明目标器件,配置过程如图
c、Target Interface &Speed:目标的接口和速度
JTAG、SWD或FINE,仿真的速度,如图
至于选择JTAG还是SWD,需要根据自己开发板的接口来选择,与之相一致就好。
d、Sampling Source
e、Sampling Rate 单位us,最小修改为1.
f、Elf File添加
Elf文件是keil 生成的文件。扩展名为axf,在自己keil工程的文件夹中寻找。
(3)J-Scope软件的观察变量
FOC核心算法中的各个变量,勾选上即可,然后【OK】即可。
连接好目标板,点击红色的圆点,即可开始采样,在采样过程中,用鼠标子在变量区点取一个变量,然后按【+】【-】键,则可以实现图形的上移、下移,如果按一下【Ctrl】键,然后在按【+】【-】,则可实现图形的放大和缩小,其实是修改了Y轴分辨率。
采样停止后,在图形界面,鼠标左键点住拖动,可实现图形的左右移动,方便观察图像的历史记录。
采样时或停止后均可点击放大和缩小图标,来实现采样率的改变。
(4)J-Scope软件的保存数据文件
【File】菜单中有数据的导出和导入功能,导出后可存为Excel文件,然后在Excel中进行处理,也可导入到Matlab中。
5、J-Scope软件RTT模式单片机工程中需要配置
注:RTT模式选芯片型号的时候,必选对应的型号不能选内核型号。
(1)下载这几个文件,也可以在Jscope的安装路径下找到。
安装路径如下图:
(2)将SEGGER_RTT.c,SEGGER_RTT.h,SEGGER_RTT.h添加进工程,并把SEGGER_RTT.c添加到工程。
(3)添加缓存定义
char JS_RTT_UpBuffer[4096]; // J-Scope RTT Buffer
int JS_RTT_Channel = 1; // J-Scope RTT Channel
上面的缓存大小可以给小点512也行。
(4)随便找个地方初始化
SEGGER_RTT_ConfigUpBuffer(JS_RTT_Channel, "JScope_I4I4I4", &JS_RTT_UpBuffer[0], sizeof(JS_RTT_UpBuffer), SEGGER_RTT_MODE_NO_BLOCK_SKIP);
(5)
#pragma pack(push, 1)
struct {
signed int Sine1;
signed int Sine2;
signed int Sine3;
} acValBuffer;
#pragma pack(pop)
上面是你要发送的结构体,自己定义。
(6)在你要发送的地方赋值并发送,例如中断:
acValBuffer.Sine1 = Test_Counter1;
acValBuffer.Sine2 = Test_Counter2;
acValBuffer.Sine2 = Test_Counter3;
SEGGER_RTT_Write(JS_RTT_Channel, &acValBuffer, sizeof(acValBuffer));
(7)下面是重点!!!官方没有提到的。例如我想发四个数,两个int型,两个short型。
#pragma pack(push, 1)
struct {
signed int Sine1;
signed int Sine2;
short Sine3;
short Sine4;
} acValBuffer;
#pragma pack(pop)
那么对应的初始化要改为"JScope_I4I4I4"这个参数就要改成"JScope_I4I4I2I2“
(8)还有一个更重要的!那就是如果发送频率过块,快卡死,卡在一个循环里。
SEGGER_RTT.c这个文件的WriteBlocking函数要做修改。
加一句。
if(NumBytesToWrite == 0){NumBytesToWrite = 1;}