STM32有两个调试端口,即JTAG和SW。Keil 的ULINK2 USB-JATG接口适配器支持这两种调试接口。本文描述了如何配置和使用SW接口来获取各种调试信息。 . u# P5 {: x/ a& a6 p 一、目标调试阶段的配置 1.调试器的选择3 O5 U, Y8 Z; m: k2 Q 选择μVision->Debug ->Options for Target –>Debug,并选择ULINK Cortex Debugger调试器。9 r5 g, |1 u7 C' b0 O& h ![]() 2.调试目标初始化文件 : V; b: C5 V7 W, o9 @/ R- K 按照路径\Keil\ARM\Startup\ST,将文件STM32DBG.ini拷贝到工程文件夹中。选择μVision->Debug -> Options for Target –>Debug,同时在Initialization File选项中选择该文件。 ![]() ) H& c9 i: Q+ k+ Z+ l3 Z* y 3.Cortex-M 目标设备调试驱动配置$ X8 M* B( K. F2 X 9 j; g0 q0 n1 r I9 E7 R( [ 选择Options for Target – Debug – Settings,设置SWJ,端口选择SW。7 L8 `6 [( N' V8 n7 k) h6 F" S; V/ V ![]() 4.Trace功能的配置 5 ^+ a# T' Y3 Y Trace功能包括:Core Clock, Trace Port 以及定义TraceEvents 等。: f* G: S3 q! f3 X2 ? ![]() - i9 Z- S1 M! H( y# @* B M 二、实时跟踪# u: `3 c% s& z$ i 1.μVision的状态栏信息$ ?7 `9 I. U8 o. {& s 在μVision的状态栏中显示了实时跟踪的状态信息。 A; c& P6 S, W" P3 t& W/ s/ y2 Y 2.实时跟踪窗口+ m. U' Y9 {$ r1 N4 S 调试时选择Peripherals – Trace。1 J6 j7 Y* G$ {! p t. e0 X0 w " W, O. ~/ x. j. J5 [/ y8 {' E# S. z( k4 R( r& D9 @* a6 Z 1)Trace Records窗口# g, o0 K. ]( h; p4 m 该窗口显示了所有被捕获的跟踪记录,每一个跟踪记录都包含了详细的信息。可以选择Peripherals - Trace – Records来查看。 ![]() - O: V+ P' c5 d% i. X5 ]/ J 2)Exception Trace 窗口 该窗口显示了异常和中断的统计信息,这些信息是基于Trace Records中所捕获的跟踪记录的。可以选择Peripherals - Trace - Exceptions来查看。( A8 @' H; e0 \0 u/ K# X% g ) f& T7 i9 r b. M! E% j4 |7 x o- H F. b! i S! f 3)Event Counters窗口 ; z9 q3 @9 G$ }4 @ 这个窗口显示了特殊事件计数器的值,计数值是基于Trace Records中所捕获的跟踪记录的。 ![]() ( }! c1 S+ W7 s0 h 3.ITM Viewer窗口 可以通过ITM的激励端口0在ITM Viewer窗口上输出ASCII 或 Hex格式的数据,目前只有ITM 端口0可以在ITM Viewer窗口显示。要使用ITM Viewer窗口来显示调试跟踪的输出信息,需要进行以下的操作。 % d# z1 [, \# \$ [ l 在源代码中添加ITM激励端口寄存器的定义。1 q1 o& z. x( _* W$ m7 d3 l7 w3 d1 U #define ITM_Port8(n) (*((volatile unsigned char *)(0xE0000000+4*n)))" r& ?4 L6 k. L! \ #define ITM_Port16(n) (*((volatile unsigned short*)(0xE0000000+4*n)))3 t. r# i$ M2 {9 ~ #define ITM_Port32(n) (*((volatile unsigned long *)(0xE0000000+4*n)))& e& V# m- B! P- D #define DEMCR (*((volatile unsigned long *)(0xE000EDFC))) #define TRCENA 0x01000000) k$ n! J7 t% D- b1 K l 在源代码中添加fputc函数,它向ITM的激励端口0寄存器写数据。如果有了fputc函数,则可以用printf函数做为调试输出。ITM的激励端口0与ITM Viewer窗口固定连接。- h8 X7 }+ l4 i2 [5 I# j 2 i. P& e# a! L8 }; x( A struct __FILE { int handle; /* Add whatever you need here */ }; FILE __stdout;/ Q5 a+ Y# W R: S7 i3 a' X FILE __stdin; int fputc(int ch, FILE *f) {' Y7 E! Y4 h# N' T. F* K if (DEMCR & TRCENA) {- D3 o+ @5 O, h: y! J* q while (ITM_Port32(0) == 0); ITM_Port8(0) = ch; } return(ch); } l 在源代码中添加printf函数来显示调试跟踪信息。 printf("Serial Wire Output Debug Trace message"); ( J5 |- A- ^1 Z& q) h$ L- @- l# A l 在Cortex-M Target Driver Setup窗口中使能ITM激励端口0 ![]() . d1 I7 Y0 Q/ |. W# T l 在目标调试期,打开ITM Viewer窗口1 B& A! W/ Y& W" } 选择μVision-> View -> Serial Window -> ITM Viewer$ ?- [( M! a C+ T& J3 s+ h * q. K! R5 Q$ E6 E5 Z9 s5 Q完成这些步骤以后,可以在目标调试期通过ITM Viewer窗口查看到调试跟踪信息,例如显示AD转换的结果。: L- g0 j1 D2 @* C, p4 C ![]() ITM Viewer的功能类似串口打印调试信息,使用ITM更简单,而且不需要串口以及相关驱动程序。; T, W5 O) E% }2 K9 G9 w. V1 T 4.Logic Analyzer 窗口 2 y5 B/ h, e5 S8 H) z 在调试的时候,可以通过逻辑分析器观测至多4个变量值的变化。执行以下步骤来使用逻辑分析器。 · 在Cortex-M Target Driver Setup窗口使能Timestamps并选择合适的Prescaler值。3 L: m0 O& A8 O ![]() $ F5 T9 }" v- b+ q6 ~# z5 H 要想在逻辑分析器的窗口中观测到精确的时间值,必须使能Timestamps。 · 添加准备观测的变量到逻辑分析器中/ e2 b2 K' m( T1 j9 Y9 G8 m · 在调试过程中观测变量值的变化& f" z% |# m. ?' `( T; S # L G+ }. L- l; \) [: X' L5.RTX Kernel Event Viewer 窗口 当运行RTX系统时,RTX Kernel Event Viewer 窗口中显示了任务的切换过程,任务切换信息通过专门的ITM激励端口31来传输。 ^# c S8 w' \9 J5 s ' H' [" d7 _ {; W7 G6 T 执行以下步骤来使能RTX Kernel Event Viewer。1 q9 P+ o: r7 u4 y3 Z( z. g: } · 在Cortex-M Target Driver Setup窗口使能ITM 激励端口31- u+ a. L: G* a ![]() $ |/ w! `3 Y8 S" U' d · 选择Trace Enable,设置正确的Core Clock。: o2 w* o2 {# H- P8 E. y ![]() 1 O2 Z- b% e/ a7 J; {/ \ · 核查Timestamps为enabled. ![]() · 在目标调试过程中打开RTX Kernel窗口1 {& ? u5 J2 ~# @) L, Y 选择Peripherals -> RTX Kernel + _2 l5 [3 q# j8 h1 q$ |5 L; j! H+ p1 B6 j · 在RTX内核窗口选择Event Viewer标签 8 q% ^* v9 g2 O- B+ x/ E4 N. W. V ![]() 在窗口中更新了每个任务转换过程。选择in或者out按钮放大或缩小窗口。点击all按钮可以显示所有事件记录。4 X" ]. ], ^9 X 出处:小野狼 |
微信公众号
手机版
回复:使用RealView MDK进行SW调试和实时跟踪
RE:使用RealView MDK进行SW调试和实时跟踪
RE:使用RealView MDK进行SW调试和实时跟踪