STM32有两个调试端口,即JTAG和SW。Keil 的ULINK2 USB-JATG接口适配器支持这两种调试接口。" _" D) k$ P% W) r % Q- \' |6 Y6 }* c/ U3 w% x 本文描述了如何配置和使用SW接口来获取各种调试信息。5 x' L6 Z9 P+ i1 F 一、目标调试阶段的配置 1.调试器的选择 选择μVision->Debug ->Options for Target –>Debug,并选择ULINK Cortex Debugger调试器。 - r8 t. U* r2 i* Q) W8 U& N6 Z+ ~ 2.调试目标初始化文件+ U) A; Y5 S% ^( Q 8 |1 n5 y: M4 E2 P 按照路径\Keil\ARM\Startup\ST,将文件STM32DBG.ini拷贝到工程文件夹中。选择μVision->Debug -> Options for Target –>Debug,同时在Initialization File选项中选择该文件。 ; z+ j' ^" c# t' o; F 3.Cortex-M 目标设备调试驱动配置 : C: y' I0 {3 }& f7 u; p* ^ 选择Options for Target – Debug – Settings,设置SWJ,端口选择SW。% R x+ i8 l" [7 M% b: i 4.Trace功能的配置 2 i. E# `# R) |/ D& |+ d7 ?9 g% P' W& O- { Trace功能包括:Core Clock, Trace Port 以及定义TraceEvents 等。 # B! e3 I/ p; } } 4 s/ `( C" D/ Z# F 二、实时跟踪 1.μVision的状态栏信息8 M9 \, R) `) f- d# A0 U- L 4 h5 h% S: }+ M, x7 M, c% P( f 在μVision的状态栏中显示了实时跟踪的状态信息。 * T' @& @8 z7 Q6 ^1 |) T* w + `/ x- d" K7 [. e0 i 2.实时跟踪窗口 ' p1 F) M! T/ K3 z 调试时选择Peripherals – Trace。 g2 J& _. N# n' ^0 E 1)Trace Records窗口 该窗口显示了所有被捕获的跟踪记录,每一个跟踪记录都包含了详细的信息。可以选择Peripherals - Trace – Records来查看。& \6 e/ \' l9 c8 q# R M - ~) O5 X! I3 T' u7 g$ W ' }# M' m7 D+ y6 w' E. p. S 2)Exception Trace 窗口 9 O% m' O G9 w5 R3 V* s 该窗口显示了异常和中断的统计信息,这些信息是基于Trace Records中所捕获的跟踪记录的。可以选择Peripherals - Trace - Exceptions来查看。 ( r: V2 [2 M1 [9 y/ \) ^ 3)Event Counters窗口6 _; R5 G W9 l, l$ C/ z 这个窗口显示了特殊事件计数器的值,计数值是基于Trace Records中所捕获的跟踪记录的。 , n$ `3 Q7 I" D % f$ x, h D5 j: L6 ` 3.ITM Viewer窗口 可以通过ITM的激励端口0在ITM Viewer窗口上输出ASCII 或 Hex格式的数据,目前只有ITM 端口0可以在ITM Viewer窗口显示。要使用ITM Viewer窗口来显示调试跟踪的输出信息,需要进行以下的操作。 ) {: I" Q! @# u+ N, @3 \: {$ a, X l 在源代码中添加ITM激励端口寄存器的定义。 #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))); \8 J* b9 Q, P" _ _5 r" d #define TRCENA 0x01000000 l 在源代码中添加fputc函数,它向ITM的激励端口0寄存器写数据。如果有了fputc函数,则可以用printf函数做为调试输出。ITM的激励端口0与ITM Viewer窗口固定连接。 3 I+ g7 x& \) q+ h 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);: a" |; }6 E+ s0 z) Q- n ITM_Port8(0) = ch;: Z( z! M2 X* ^% Y, z! Z }7 L( U/ ~( j% y7 F return(ch); } l 在源代码中添加printf函数来显示调试跟踪信息。 printf("Serial Wire Output Debug Trace message"); l 在Cortex-M Target Driver Setup窗口中使能ITM激励端口0 ; b. k3 P8 j6 }, E6 Y * o. X1 s* v7 A' p) H' m; b l 在目标调试期,打开ITM Viewer窗口4 S/ g) ^( g' ]/ j4 C 8 ]% O4 J. F2 S8 E9 j# E 选择μVision-> View -> Serial Window -> ITM Viewer # q3 G. e% w% Q 完成这些步骤以后,可以在目标调试期通过ITM Viewer窗口查看到调试跟踪信息,例如显示AD转换的结果。) V7 e, r# [' Z8 a6 B ITM Viewer的功能类似串口打印调试信息,使用ITM更简单,而且不需要串口以及相关驱动程序。 + s4 k& V+ k0 M 4.Logic Analyzer 窗口; b; L) k1 _* j. z [ 在调试的时候,可以通过逻辑分析器观测至多4个变量值的变化。执行以下步骤来使用逻辑分析器。 : h) W! I, K- B% E; } · 在Cortex-M Target Driver Setup窗口使能Timestamps并选择合适的Prescaler值。 & z& l, z' k: n8 W 0 L' ]# C" b# u% Q9 c- w# X7 K 要想在逻辑分析器的窗口中观测到精确的时间值,必须使能Timestamps。 3 U- ^6 y* X+ K8 a' q+ |1 I9 c · 添加准备观测的变量到逻辑分析器中/ d8 p9 ~: t2 S: k- K · 在调试过程中观测变量值的变化+ E* s/ l7 q% m) y3 K% q$ j4 F 1 H* F/ K' X; I4 w 5.RTX Kernel Event Viewer 窗口 当运行RTX系统时,RTX Kernel Event Viewer 窗口中显示了任务的切换过程,任务切换信息通过专门的ITM激励端口31来传输。 执行以下步骤来使能RTX Kernel Event Viewer。 · 在Cortex-M Target Driver Setup窗口使能ITM 激励端口31/ W4 M9 _8 r" Z4 U 5 [0 C3 R+ c$ q' u. O & i' n" ]- A2 ]: T4 u. { · 选择Trace Enable,设置正确的Core Clock。 # w7 d9 V/ v/ t$ l5 h2 e/ D · 核查Timestamps为enabled. ' \: U; S5 b# K+ ]0 r! Z - W4 ?3 X1 k. D4 C · 在目标调试过程中打开RTX Kernel窗口 ) F3 A7 J' Y$ E 选择Peripherals -> RTX Kernel 2 P6 a; P* e# l/ f" y3 ^5 f · 在RTX内核窗口选择Event Viewer标签 " Z+ z: q d% w 2 ?5 e0 A" C5 `/ W8 W# w1 Y6 A4 k* J6 A % l) ^* [% O8 k7 r8 j- S9 ?% I5 } 在窗口中更新了每个任务转换过程。选择in或者out按钮放大或缩小窗口。点击all按钮可以显示所有事件记录。% S8 ?* L( c, Q5 e Z ' t. F8 j! R$ ?1 c- u' q 出处:小野狼 |
回复:使用RealView MDK进行SW调试和实时跟踪
RE:使用RealView MDK进行SW调试和实时跟踪
RE:使用RealView MDK进行SW调试和实时跟踪