1
2
3 #define ITM_ENA (*(volatile unsigned int*)0xE0000E00)
// ITM Enable
4 #define ITM_TPR (*(volatile unsigned int*)0xE0000E40)
// Trace Privilege Register
5 #define ITM_TCR (*(volatile unsigned int*)0xE0000E80)
// ITM Trace Control Reg.
6 #define ITM_LSR (*(volatile unsigned int*)0xE0000FB0)
// ITM Lock Status Register
7 #define DHCSR (*(volatile unsigned int*)0xE000EDF0)
// Debug register
8 #define DEMCR (*(volatile unsigned int*)0xE000EDFC)
// Debug register
9 #define TPIU_ACPR (*(volatile unsigned int*)0xE0040010)
// Async Clock presacler register
10 #define TPIU_SPPR (*(volatile unsigned int*)0xE00400F0)
// Selected Pin Protocol Register
11 #define DWT_CTRL (*(volatile unsigned int*)0xE0001000)
// DWT Control Register
12 #define FFCR (*(volatile unsigned int*)0xE0040304)
// Formatter and flush Control Register
13 //
14 // STIM word and byte acces
15 #define ITM_STIM_U32 (*(volatile unsigned int*)0xE0000000)
16 #define ITM_STIM_U8 (*(volatile char*)0xE0000000)
17
18 // The stimulus port from which SWO data is received and displayed.
19 unsigned
int ITM_PORT_BIT0 =
0;
20
21 // Has to be calculated according to the CPU speed and the output baud rate
22 unsigned
int TargetDiv =
1;
23
24 void SWO_Enable(
void )
25 {
26 unsigned
int StimulusRegs;
27 //
28 // Enable access to SWO registers
29 //
30 DEMCR |= (
1 <<
24 );
31 ITM_LSR =
0xC5ACCE55;
32 //
33 // Initially disable ITM and stimulus port
34 // To make sure that nothing is transferred via SWO
35 // when changing the SWO prescaler etc.
36 //
37 StimulusRegs =
ITM_ENA;
38 StimulusRegs &= ~(
1 <<
ITM_PORT_BIT0 );
39 ITM_ENA = StimulusRegs;
// Disable ITM stimulus port
40 ITM_TCR =
0;
// Disable ITM
41
42 //
43 // Initialize SWO (prescaler, etc.)
44 //
45 TPIU_SPPR =
0x00000002;
// Select NRZ mode
46 TPIU_ACPR = TargetDiv -
1;
// Example: 72/48 = 1,5 MHz
47 ITM_TPR =
0x00000000;
48 DWT_CTRL =
0x400003FE;
49 FFCR =
0x00000100;
50 //
51 // Enable ITM and stimulus port
52 //
53 ITM_TCR =
0x1000D;
// Enable ITM
54 ITM_ENA = StimulusRegs | (
1 << ITM_PORT_BIT0 );
// Enable ITM stimulus port
55 }
56
57 // Prints a character to the ITM_STIM register in order to provide data for SWO
58 void SWO_PrintChar(
char c )
59 {
60 // Check if SWO is set up. If it is not,
61 // return to avoid that a program hangs if no debugger is connected.
62 //
63 // Check if DEBUGEN in DHCSR is set
64 //
65 if ( ( DHCSR &
1 ) !=
1 )
66 return;
67
68 //
69 // Check if TRACENA in DEMCR is set
70 //
71 if ( ( DEMCR & (
1 <<
24 ) ) ==
0 )
72 return;
73
74 //
75 // Check if ITM_TRC is enabled
76 //
77 if ( ( ITM_TCR & (
1 <<
22 ) ) ==
1 )
78 return;
79
80 //
81 // Check if stimulus port 0 is enabled
82 //
83 if ( ( ITM_ENA &
1 ) ==
0 )
84 return;
85
86 //
87 // Wait until STIMx is ready to accept at least 1 word
88 //
89 while ( ( ITM_STIM_U8 &
1 ) ==
0 )
90 {
91
92 }
93
94 ITM_STIM_U8 =
c;
95 }
96
97 // Prints a string via SWO
98 void SWO_PrintString(
const char *
s )
99 {
100 //
101 // Print out character per character
102 //
103 while ( *
s )
104 {
105 SWO_PrintChar( *s++
);
106 }
107 }
JLINK SWO Viewer
Free-of-charge utility for J-Link. Displays the terminal output of the target using the SWO pin. Can be used in parallel with a debugger or stand-alone.
This is especially useful when using debuggers which do not come with built-in support for SWO.
http://www.segger.com/j-link-swo-viewer.html
转载于:https://www.cnblogs.com/shangdawei/archive/2013/04/10/3011582.html
相关资源:数据结构—成绩单生成器