作者: dhyana 時間: 2010-8-1 21:24
標題: 請教STM32用JLINK V8 SWD輸出調試信息到ITM Viewer的問題
請教各位,我在用STM32F103VBT6 , RVMDK 3.9 ,J-LINK V8的SWD口。
接線為VCC PA13 PA14 GND的四線SWD。程序中重定義了printf的fputc到ITM0.
我想在調試時候,從SWO輸出調試信息,參考了一下網上的用ULINK2輸出到ITM viewer的例子,自己修改了一下。但是發現用J-LINK 有些問題。
代碼如下:
//ITM reg #define ITM_Port8(n) (*((volatile unsigned char *)(0xE0000000+4*n))) #define ITM_Port16(n) (*((volatile unsigned short*)(0xE0000000+4*n))) #define ITM_Port32(n) (*((volatile unsigned long *)(0xE0000000+4*n))) #define DEMCR (*((volatile unsigned long *)(0xE000EDFC))) #define TRCENA 0x01000000 struct __FILE { int handle; /* Add whatever you need here */ }; FILE __stdout; FILE __stdin; int fputc(int ch, FILE *f) { if (DEMCR & TRCENA) { while (ITM_Port32(0) == 0); ITM_Port8(0) = ch; } return(ch); }
如果在調試器CortexM3 JLINK選項中打開Trace,那么會收到警告信息“Trace僅能從SWO輸出,請選擇SWD模式”,如果不開trace,那么在ITM viewer中看不到自己的輸出信息。
請問有怎么樣才可以用printf輸出調試信息到ITM viewer
作者: dhyana 時間: 2010-8-1 21:31
原始的參考信息鏈接是這個:http://bbs.21ic.com/icview-109178-1-1.html
難道現在的J-LINK V8還是不能支持嗎
作者: dhyana 時間: 2010-8-2 11:04
(原文件名:swd.jpg)
上面是我原來連接用的電路,后來我按照下面的圖,加入了SWO-PB3連接。但還是不能工作。
一旦在cortexM3-JLINK中選擇了 trace,就會遇到
(原文件名:error1.jpg)
這樣的錯誤。
如果去掉trace,那么在 ITM viewer中則沒有任何信息出現。
作者: dhyana 時間: 2010-8-2 11:08
下面是我的設置方法和J-LINK信息。
(原文件名:1.jpg)
(原文件名:2.jpg)
(原文件名:3.jpg)
(原文件名:4.jpg)
作者: dr2001 時間: 2010-8-2 11:19
注意以下內容:
- Keil MDK版本適當更新,過舊的版本對Jlink的支持可能不夠好。該同步的DLL要同步。
- Cortex M3的調試接口必須使用SWD,至少需要5線連接:Vref, SWDIO, SWCLK, SWO, GND。
- 在Keil中確認調試模式選擇的SWD。
JLink設置沒有什么問題。
這種設置,應該是編譯通過,程序能運行,但是不一定ITM能看到輸出。
STM32開ITM輸出,有一個引腳功能需要手工設置,有一個寄存器。查一下手冊就行了。
作者: dhyana 時間: 2010-8-2 12:05
樓上很專業哈~
我現在已經連接了 Vref,SWDIO,SWCLK,SWO,GND
更換了keil下JL2CM3.DLL,由1.8.0換成了1.5.7,開啟 trace不會提示select sw port了。
現在用ST的庫,其中有ITM_SendChar,它已經設置了寄存器,但是我還是不能正常的看到我輸出的信息。ITM Viewer中有時會看到一些hex的數據,但是不明白是什么,而且程序在運行到ITM_SendChar后,似乎就停止下來了。
STM32Init();
while (1)
{
ITM_SendChar(0xAB);
}
下面是那個函數的定義,來源於core_cm3.h
static __INLINE uint32_t ITM_SendChar (uint32_t ch)
{
if (ch == '\n') ITM_SendChar('\r');
if ((CoreDebug->DEMCR & CoreDebug_DEMCR_TRCENA) &&
(ITM->TCR & ITM_TCR_ITMENA) &&
(ITM->TER & (1UL << 0)) )
{
while (ITM->PORT[0].u32 == 0);
ITM->PORT[0].u8 = (uint8_t) ch;
}
return (ch);
}
運行到 while (ITM->PORT[0].u32 == 0); 停止
作者: dhyana 時間: 2010-8-2 13:36
如果用軟件模擬,則在ITM Viewer 中,可以看到調試信息。
作者: dhyana 時間: 2010-8-2 18:47
現在的測試結果,用了jlink V7,V8兩個編程器。在MDK 4.12下,調試中會在core_cm3.c中的
static __INLINE uint32_t ITM_SendChar (uint32_t ch)
while (ITM->PORT[0].u32 == 0);
處死循環。
如果不調試,斷電上電運行,是正常的。但是都不能在ITM窗口看到調試信息。不明白了。。。
現在我的SWO(PB3)連接到jlink的13腳的。
作者: dr2001 時間: 2010-8-2 19:42
我看了一下,可以用的配置和你是類似的,看看這些是不是正確:
1、寫個點LED的代碼,確認程序下載到Flash了。(脫開JLink,應該能正常點燈)
2、我的JLink設置:
Debug的Cache Options是一個都沒選。因為我要求數據是同步的。這個應該沒影響。
Debug的Download Options,兩個都有。Verify應該可以不選;Download to Flash應該選上把……要不然咋用?
Trace的Core Clock要按照你初始化代碼初始化后的寫。
右邊一豎列,就是TimeStamp,Trace Events,這個要求MCU集成ETM才好用。STM32好像是沒有的,因此最好不要選。
中間的Inst Trace也是什么都不要選的。
ITM按圖沒問題。
3、代碼上,STM32F103C8T6需要DBGMCU_CR = 1 << 5;查一下手冊具體的含義。總之就是需要允許一個引腳功能,否則SWO打不出來。
4、用ITM之前,MCU的Core時鍾一定要到和你在JLink Trace一樣的頻率,否則異步數據打出來都是亂的。(類似UART波特率匹配)
寫ITM就是這樣的語句
while((CM3_ITM_PORT[0] & 0x1) == 0x0)
CM3_ITM_PORT[0] = _C
就足夠了。
你參考一下,我用103C8T6在Jlink V7上非常正常。當然開始的時候因為初始化什么的略微折騰了兩下。
作者: dr2001 時間: 2010-8-2 19:55
另外補充幾句,可能有助於ITM調試。
就我觀察到的現象,Keil MDK的Jlink驅動,會根據在Settings頁面的設置,在適當的時候設置Cortex M3相關的寄存器。這樣用戶就不用自行設置相關寄存器,而可以直接使用ITM。
當然,此事不能保證一定在所有的Keil版本和JLink的驅動上復現。
從CM3內核實現上來說,你就視SWO是一個UART就可以了(SWO好象是有兩個實現,一個是曼徹斯特編碼,一個是UART)。只不過它數據的數據是經過調試接口打包過的。ITM是數據報文的一部分而已。該UART是用CM3 Core的時鍾驅動的。
和串口一樣,仿真器需要給定一個采樣頻率,然后你需要在ARM Core設置相應的分頻數量。然后允許ITM相關的寄存器,並且讓信號從引腳輸出。最終ITM方可工作。
ITM輸出就是帶有Buffer的串口那樣。
按串口的調試思路,比較容易搞定。
作者: dhyana 時間: 2010-8-2 21:06
非常感謝dr2001,剛才調試通過了。
就是那個DBGMCU_CR的TRACE_IOEN位,需要在調試文件STM32DBG.INI中配置,默認是0,選為1即可。否則程序就會在while (ITM->PORT[0].u32 == 0);處死循環。
補充一下,Download to Flash和verify不用選上,我沒有發現選中和不選的差異。
右邊那些event,我選中后,有一些我看不明白的調試信息輸出。研究中。
SWO速度,好像按照一定的分頻,就不會出錯,就像usart的波特率,只要是和標准波特率沒有過大的偏差,就可以自己適應。
可憐網上的資源啊,之前只有一個德文論壇上有類似討論,我懷疑網上資料大部分都僅僅是調試了軟件模擬,沒有真實硬件調試。
調試功能中有一些好像JLINK不支持,准備去買一個ULINK2試一下。
作者: lzyr 時間: 2010-8-2 21:31
IAR 可以嗎?
作者: dr2001 時間: 2010-8-3 09:35
回復【10樓】dhyana
-----------------------------------------------------------------------
恭喜。搞定了就好。
Download to Flash,主要是JLink自己能分辨目標是RAM還是Flash,然后調用對應策略搞定。所以Keil的有些選項究竟是什么作用,不太容易弄清楚。不影響使用的話,還是不選比較安全點。
那些Event都會通過ETM打出來調試報文,Keil的調試界面不一定解析了這些東西。或者他的JLink驅動沒去解析。誰知道呢。。。
反正一般情況下用不到那些。
具體報文結構在CM3的TRM里邊貌似有線索,可能需要看ETM的手冊才能知道報文格式。
ITM是單向輸出的,如果就是打印調試信息的話,是個很好用的東西。
作者: dr2001 時間: 2010-8-3 09:37
回復【11樓】lzyr
-----------------------------------------------------------------------
IAR不太清楚,你可以查查。
支持CortexM調試的話,我估計多少會支持一些的。
作者: dhyana 時間: 2010-8-3 15:31
IAR據說是支持的。
dr2001很熱心,我目前打印調試信息就可以了。之后准備花時間專門學習一下調試方面的東西。
作者: rlogin 時間: 2010-8-3 23:54
好貼啊,應該褲頭
作者: gamep 時間: 2010-8-18 19:48
又見高人,學習
作者: lileistone 時間: 2010-10-11 11:57
最近在看trace方面的東西,mark一下~
作者: twd3621576 時間: 2010-12-29 11:21
UART 調試
作者: sky412 時間: 2011-1-2 21:48
請問樓主有沒有在ULINK2下試驗成功?
作者: scsdwxj2005 時間: 2011-7-14 15:43
發一個在ULINK2下可用的工程,紅牛開發板例程。
紅牛開發板例程,可用於ULINK2仿真器。 ourdev_657801UUTPRH.rar(文件大小:280K) (原文件名:ADC_test.rar)
作者: YOYOPAOPAO 時間: 2011-7-17 09:47
JLINKV8的USB驅動可以發一份給我么?
作者: gamethink 時間: 2011-7-24 21:13
簡單來說,能不能認為ITM Viewer其實就是一個串口呢?
只不過這個串口不占系統資源?(但實際上也要調用函數發送出去)
作者: www1519 時間: 2011-7-24 21:22
mark
作者: hnsw 時間: 2011-8-6 19:12
mark~~~
作者: fengyin_kai 時間: 2011-8-11 11:10
提示: 該帖被管理員或版主屏蔽
作者: youke 時間: 2011-8-17 22:00
反正發現用ULINK2 根本 就不行 讓費了 我5天時間 官方的例子不行 看到隔壁一個哥們 用TI的CCS開發環境能采樣到AD的波形在開發平台上顯示出來 羡慕中!
MDK 官方說 用硬件 看邏輯分析儀只能看 4路 結果一個都不行 害得讓費我幾天時間.
作者: youke 時間: 2011-8-17 22:03
請問 【20樓】 scsdwxj2005 兄弟 有沒有 把硬件AD采樣的 波形在 MDK 邏輯分析儀上顯示正確過??
作者: gaoup1986 時間: 2011-8-17 22:29
樓主的問題我遇見過,后來找了FAE解決的
1.我用的是IAR5.1版本的,后來FAE給裝了6.2版本,據說低版本的用SWD用一些文件沖突;
2.VCC GND SWDIO SWDLK一個都不用上拉,FAE給出的解釋是,盜版的JLINK內部19腳有5V輸出,而正版的沒有5V,所以接口上拉,有很多不必要的麻煩;
作者: alan8918 時間: 2012-4-10 17:20
Mark SWD調試
作者: adwinter 時間: 2012-6-29 17:09
寫的很好 解決了很多疑問 學習了
作者: alan_yzh 時間: 2012-10-10 10:34
不錯,原來這個問題這么復雜的,學習了!
作者: yuhui 時間: 2012-11-15 21:56
好資料,學習。
作者: automaticdai 時間: 2012-11-16 09:05
學習一下,非常想實現這個先進的調試功能。
作者: lovelywwei 時間: 2012-11-16 09:21
這個功能很實用。學習了。
