
![]() 本文描述了如何配置和使用SW接口来获取各种调试信息。 一、目标调试阶段的配置: A4 ?) F! Z1 J3 N2 ? ! T8 K' [2 S/ m4 f1 X+ i# X0 Z% E 1.调试器的选择 # M' a$ `9 `' W( c 选择μVision->Debug ->Options for Target –>Debug,并选择ULINK Cortex Debugger调试器。 ![]() 9 h6 A$ S, w- Z4 K! ] d- d8 X 2.调试目标初始化文件 ( f- x7 W+ M9 w4 V' _3 k, b 按照路径\Keil\ARM\Startup\ST,将文件STM32DBG.ini拷贝到工程文件夹中。选择μVision->Debug -> Options for Target –>Debug,同时在Initialization File选项中选择该文件。7 b3 d) D5 _% v6 R. g3 k ![]() 3.Cortex-M 目标设备调试驱动配置 / W8 b5 I7 ~# q7 K& m" w 选择Options for Target – Debug – Settings,设置SWJ,端口选择SW。 ![]() ) ]: k& m1 P* t, }- s+ v" b 4.Trace功能的配置1 M" U7 S" K5 G$ p0 O - i: D& K, s& T) |0 v" j- h& u Trace功能包括:Core Clock, Trace Port 以及定义TraceEvents 等。8 g( Q& m. L1 I: q8 P) Y ![]() ' U2 _, F2 k! `& L; A) v: |* z 二、实时跟踪) ~; h) ~$ D& {+ ?4 g8 o" v- ]8 B 8 d+ @9 Q; [3 h' O7 x& Z% i 1.μVision的状态栏信息 在μVision的状态栏中显示了实时跟踪的状态信息。" l' h0 P( V4 b: s ![]() 2.实时跟踪窗口 / F- r& q( l# \. k/ l1 B* o+ L 调试时选择Peripherals – Trace。 W0 l3 L S0 q" N! P ![]() 1)Trace Records窗口0 ?" ~ a, B9 J# ]# g) ~ @: f 该窗口显示了所有被捕获的跟踪记录,每一个跟踪记录都包含了详细的信息。可以选择Peripherals - Trace – Records来查看。( ]5 p9 s9 w2 U, [. }6 _3 M ![]() 2)Exception Trace 窗口 0 p- |; G* a# {& O7 ]/ Q 该窗口显示了异常和中断的统计信息,这些信息是基于Trace Records中所捕获的跟踪记录的。可以选择Peripherals - Trace - Exceptions来查看。 ![]() . u% x" d9 u2 Q1 F* \ 3)Event Counters窗口 这个窗口显示了特殊事件计数器的值,计数值是基于Trace Records中所捕获的跟踪记录的。 0 ~ C( ^0 b2 r& @+ } ![]() 3.ITM Viewer窗口3 ^8 ?7 P9 Y. F8 t6 H 可以通过ITM的激励端口0在ITM Viewer窗口上输出ASCII 或 Hex格式的数据,目前只有ITM 端口0可以在ITM Viewer窗口显示。要使用ITM Viewer窗口来显示调试跟踪的输出信息,需要进行以下的操作。' W$ Z8 T3 I6 H( Z6 D& R- [% B 4 R3 D/ ~( I* O4 L l 在源代码中添加ITM激励端口寄存器的定义。- J7 ]5 ~* C3 S# M( a2 e & H; d# r0 K6 E% U+ w$ T #define ITM_Port8(n) (*((volatile unsigned char *)(0xE0000000+4*n)))" b5 L. R+ g6 f" Q #define ITM_Port16(n) (*((volatile unsigned short*)(0xE0000000+4*n)))2 s0 r8 @+ k/ ~) D E6 A( }* G #define ITM_Port32(n) (*((volatile unsigned long *)(0xE0000000+4*n)))4 c0 Z! @- P( W$ {/ \: T+ K, V, H* f #define DEMCR (*((volatile unsigned long *)(0xE000EDFC))) #define TRCENA 0x01000000) K6 p2 W6 N! {7 q { l 在源代码中添加fputc函数,它向ITM的激励端口0寄存器写数据。如果有了fputc函数,则可以用printf函数做为调试输出。ITM的激励端口0与ITM Viewer窗口固定连接。5 S0 i N1 W, ]8 g. Y- W J0 u; e 9 I( o0 D9 h- q7 P+ w struct __FILE { int handle; /* Add whatever you need here */ };0 v6 h, P; j3 x5 H. D3 H FILE __stdout; FILE __stdin;5 n+ P/ ?6 b" }) A# m int fputc(int ch, FILE *f) {& {9 [! f" y% J# i, O# y) J* H* Q if (DEMCR & TRCENA) { while (ITM_Port32(0) == 0);4 e1 ]5 R. a5 g- K5 s! K ITM_Port8(0) = ch; }$ L( n1 ~8 m+ A0 U0 F8 o return(ch); }' \% I# }5 z% |2 g: T l 在源代码中添加printf函数来显示调试跟踪信息。* M3 X+ ?( Z% R8 p 6 i0 V1 ~% J0 s! D( e, ? @ printf("Serial Wire Output Debug Trace message"); l 在Cortex-M Target Driver Setup窗口中使能ITM激励端口0 ![]() * z$ C" W Z2 N l 在目标调试期,打开ITM Viewer窗口8 {8 o2 Y1 B/ T( L 选择μVision-> View -> Serial Window -> ITM Viewer ![]() 完成这些步骤以后,可以在目标调试期通过ITM Viewer窗口查看到调试跟踪信息,例如显示AD转换的结果。 ![]() ITM Viewer的功能类似串口打印调试信息,使用ITM更简单,而且不需要串口以及相关驱动程序。 4.Logic Analyzer 窗口 在调试的时候,可以通过逻辑分析器观测至多4个变量值的变化。执行以下步骤来使用逻辑分析器。! A2 g- j- _4 Q3 ^* l · 在Cortex-M Target Driver Setup窗口使能Timestamps并选择合适的Prescaler值。9 g9 w( q8 e7 ~ A: r8 ^ ![]() 7 I9 j( y# x8 F. U% ? 要想在逻辑分析器的窗口中观测到精确的时间值,必须使能Timestamps。* D2 e' ~ v* x( U" y5 m& c 2 r7 O- h$ X& K: h8 S E · 添加准备观测的变量到逻辑分析器中# B Z* f0 M# x/ A3 M6 H9 e · 在调试过程中观测变量值的变化+ z0 m4 v0 F v- ~ ![]() , ?" M! o* F, U0 Q. H7 [# @1 D# O 5.RTX Kernel Event Viewer 窗口# E# E5 B* z/ ]$ t 当运行RTX系统时,RTX Kernel Event Viewer 窗口中显示了任务的切换过程,任务切换信息通过专门的ITM激励端口31来传输。 ' i; e# m. g( I4 p 执行以下步骤来使能RTX Kernel Event Viewer。. y, \- j5 ]2 S& B ^& Y: E9 R · 在Cortex-M Target Driver Setup窗口使能ITM 激励端口31 ![]() · 选择Trace Enable,设置正确的Core Clock。" p; a$ [- R0 y* s1 h0 L) }1 L ![]() 0 L: Z! w+ K+ d1 `6 [0 r- l) E · 核查Timestamps为enabled. ![]() · 在目标调试过程中打开RTX Kernel窗口4 V) n1 u( P q9 ` 3 D! t) p+ L S( S 选择Peripherals -> RTX Kernel8 T9 _9 U2 l) x( s8 d- s* @ ![]() " b; S1 p+ _! ~! |( j2 v · 在RTX内核窗口选择Event Viewer标签 ![]() 在窗口中更新了每个任务转换过程。选择in或者out按钮放大或缩小窗口。点击all按钮可以显示所有事件记录。 出处:小野狼 |
回复:使用RealView MDK进行SW调试和实时跟踪
RE:使用RealView MDK进行SW调试和实时跟踪
RE:使用RealView MDK进行SW调试和实时跟踪