前 言
J-Scope是Segger推出的一款免費軟件,用于MCU運行時,實時顯示數據波形,可以以類似示波器的方式顯示多個變量的值。本文提供簡單的例子演示如何基于先楫半導體的芯片新建 J-scope工程并顯示運行數據。
以下內容介紹分為四個模塊:工作模式、軟硬件版本、HSS模式工程創建和RTT模式工程創建。
一、工作模式
J-Scope分為HSS和RTT兩種模式:
1. HSS(High-Speed-Sampling)模式:jlink周期性的讀取數據,將數據上傳至j-scope顯示。
優點:
1)簡單,代碼無需做任何更改
2)通過elf文件確定變量地址
缺點:
1)相比RTT模式數據傳輸速度更慢
2)異步采樣,具有相當的非實時性
2. RTT(Real-Time-Transfer)模式:實時傳輸模式,代碼主動上報變量數值至j-scope顯示。
優點:
1)比HSS模式速度更高,最大上傳速度可達2MB/s
2)數據上傳與MCU內程序運行是同步的,具有實時性
3)要監控的變量可自動檢索,無需指定地址或提供elf文件
4)數據可加時間戳
缺點:
1)需要寫代碼,具體的,需要加載RTT組件,并在代碼中手動上傳要顯示的數據
2)占用一定的內存(RTT Buffer)
二、軟硬件版本
硬件J-Link:V10版本及以上(支持risc-v內核),推薦使用J-Link V11。
軟件J-Scope:J-Link Software and Documentation pack V7.88f及以上,一般使用最新版本J-Link驅動即可。安裝完成后在windows內搜索即可找到J-Scope GUI工具。
三、HSS模式工程創建
1.代碼添加
打開SDK1.1.0內hello_world工程,添加如下代碼:
float my_pi = 3.141592654f;
float my_two_pi = 6.283185307f;
typedef struct{
float ts;
float omega;
float theta;
float sinval;
float cosval;
}jscope_debug_t;
jscope_debug_t jscope_debug = {
.ts = 0.001f,
.omega = 2.0f * 3.141592654f * 10.0f,
.theta = 0.0f,
.sinval = 0.0f,
.cosval = 0.0f,
};
void jscope_debug_run(jscope_debug_t *p)
{
p->theta += p->omega * 0.001f;
if(p->theta > my_pi)
p->theta = p->theta - my_two_pi;
p->sinval = sinf(p->theta);
p->cosval = cosf(p->theta);
return;
}
以上代碼定義了jscope_debug_t結構體,添加了一個jscope_debug_t型變量,并在jscope_debug_run函數內對變量值做修改。
添加如下代碼,設計一個1ms定時器中斷,在中斷函數內執行jscope_debug_run:
void gptmr_init(void)
{
gptmr_channel_config_t config;
gptmr_channel_get_default_config(GPTMR, &config);
config.reload = 100*1000;
gptmr_enable_irq(GPTMR, GPTMR_CH_RLD_IRQ_MASK(GPTMR_CH));
gptmr_channel_config(GPTMR, GPTMR_CH, &config, false);
gptmr_channel_reset_count(GPTMR, GPTMR_CH);
gptmr_start_counter(GPTMR, GPTMR_CH);
intc_m_enable_irq_with_priority(GPTMR_IRQ, 1);
}
void isr_gptmr(void)
{
volatile uint32_t s = GPTMR->SR;
GPTMR->SR = s;
if (s & GPTMR_CH_RLD_STAT_MASK(GPTMR_CH)) {
//this is a 1ms isr_handler
jscope_debug_run(&jscope_debug);
}
}
SDK_DECLARE_EXT_ISR_M(GPTMR_IRQ, isr_gptmr)
注意:需要將監控的變量放在noncachable內存區,或者直接關閉L1緩存(l1c_dc_disable()),否則數據一直在l1緩存內,J-Link讀不到數據。
2.GUI操作
打開J-Scope,新建工程,如下所示:
在彈出的界面配置如下:
1、本文作者使用HPM6200evk,因此設備選擇HPM6280xPAx。注意,如果找不到對應的芯片型號,考慮升級J-Link驅動包。
2、Sampling Source選擇HSS模式。
3、Sampling Rate選擇1Khz,即每1000us采集一次數據。
4、指定elf文件。HSS模式會解析elf文件確定變量地址。
選擇要監控的數據,在變量后面的方框內打勾即可。
保證芯片內程序正在運行,點擊圖中開始采樣按鈕,即可開始采集波形并顯示。移動光標可以查看某一時刻采集的3個數據的值。
Sampling后有兩個功能按鈕,前一個開始/暫停采樣,后一個停止采樣。Target后有兩個功能按鈕,前一個開始/暫停芯片執行,后一個復位芯片。
界面右上角放大縮小符號以及其后的下拉框,可控制時間軸縮放。
界面下方watch window內,可顯示變量名、變量地址、變量數值(光標處),最大值、最小值、滑動平均值。修改 Y Resolution 與 Y Offset,可以對每一根曲線的Y軸縮放與偏移進行設置。
四、RTT模式工程創建
1. 代碼添加
打開SDK1.1.0內hello_world工程的cmakelists,做如下修改:
添加如下代碼:
float my_pi = 3.141592654f;
float my_two_pi = 6.283185307f;
typedef struct{
float ts;
float omega;
float theta;
float sinval;
float cosval;
}jscope_debug_t;
jscope_debug_t jscope_debug ={
.ts = 0.001f,
.omega = 2.0f * 3.141592654f * 10.0f,
.theta = 0.0f,
.sinval = 0.0f,
.cosval = 0.0f,
};
void jscope_debug_run(jscope_debug_t *p)
{
p->theta += p->omega * 0.001f;
if(p->theta > my_pi)
p->theta = p->theta - my_two_pi;
p->sinval = sinf(p->theta);
p->cosval = cosf(p->theta);
return;
}
void isr_gptmr(void)
{
volatile uint32_t s = GPTMR->SR;
GPTMR->SR = s;
if (s & GPTMR_CH_RLD_STAT_MASK(GPTMR_CH)) {
//this is a 10ms isr_handler,add your code here
jscope_debug_run(&jscope_debug);
}
}
SDK_DECLARE_EXT_ISR_M(GPTMR_IRQ, isr_gptmr)
void gptmr_init(void)
{
gptmr_channel_config_t config;
gptmr_channel_get_default_config(GPTMR, &config);
config.reload = 100*100;
gptmr_enable_irq(GPTMR, GPTMR_CH_RLD_IRQ_MASK(GPTMR_CH));
gptmr_channel_config(GPTMR, GPTMR_CH, &config, false);
gptmr_channel_reset_count(GPTMR, GPTMR_CH);
gptmr_start_counter(GPTMR, GPTMR_CH);
intc_m_enable_irq_with_priority(GPTMR_IRQ, 1);
}
main函數如下:
int main(void)
{
int u;
char JS_RTT_UpBuffer[4096]; // J-Scope RTT Buffer
int JS_RTT_Channel = 1; // J-Scope RTT Channel
int i;
board_init();
board_init_led_pins();
gptmr_init();
l1c_dc_disable();
board_timer_create(LED_FLASH_PERIOD_IN_MS, board_led_toggle);
printf("helloworld ");
SEGGER_RTT_ConfigUpBuffer(JS_RTT_Channel, "JScope_f4f4f4f4f4", &JS_RTT_UpBuffer[0], sizeof(JS_RTT_UpBuffer),SEGGER_RTT_MODE_BLOCK_IF_FIFO_FULL);
while(1)
{
SEGGER_RTT_Write(JS_RTT_Channel,&jscope_debug, sizeof(jscope_debug));
}
return 0;
}
上述代碼首先配置了RTT組件的upbuffer1,將其命名為"JScope_f4f4f4f4f4"(命名規則下文描述),配置其占用的內存區為JS_RTT_UpBuffer,數組大小為4096個字節,以及寫函數的調用策略為當內存區滿時以阻塞模式寫入(請參考RTT wiki百科)。 然后在while循環內,不停的調用SEGGER_RTT_Write函數上傳數據到J-Scope進行顯示。 RTT模式uploadbuffer命名規則:
通道名稱以“JScope_”開頭,后面跟解析RTT內存數據需要的數據個數、數據類型與每個數據占用的字節數。例如浮點數一定占用4個字節,而整形可以占用1、2、4個字節。
2.GUI操作
打開J-Scope,新建工程,如下所示:
在彈出的界面配置如下:
選擇設備,芯片型號。
選擇RTT模式。
如果需要更高的傳輸速率,可以增加JTAG速度,比如12000khz或20000khz。
進入GUI界面,可以看到我們沒有提供任何的elf文件,J-Scope自動識別出上報的結構體有5個float型數據。這是RTT組件自動在內存中搜索,找到了我們定義的RTT buffer的結果。由于沒有提供elf,所以watch window內無變量名信息,也無地址信息。
采樣可以觀察到,波形明顯有鋸齒了,說明RTT上傳的速度高,同一個數據上傳了多次。
trigger功能可以用來達成條件觸發采樣,如圖所示,設置sin的值大于0.5時觸發采樣,則波形從sin=0.5358時開始采樣。
小 結
本文首先介紹了基于HPM6000系列芯片如何使用J-Scope調試??傮w而言J-Scope是一款相當易用的工具,使用時只需注意變量放在非l1緩存區即可。讀者可自行嘗試,提高調試效率。
審核編輯:湯梓紅
-
芯片
+關注
關注
454文章
50460瀏覽量
421980 -
mcu
+關注
關注
146文章
17019瀏覽量
350375 -
調試
+關注
關注
7文章
574瀏覽量
33901 -
RTT
+關注
關注
0文章
65瀏覽量
17089 -
先楫半導體
+關注
關注
10文章
214瀏覽量
2082
原文標題:如何用先楫芯片構建J-scope工程及運行
文章出處:【微信號:HPMicro,微信公眾號:先楫半導體HPMicro】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
評論