Forum: Mikrocontroller und Digitale Elektronik Cortex M, Trace im Betrieb starten?


von Norminator (Gast)


Lesenswert?

Hallo,

ich nutze gerade Cortex M3 von STM(STM32F103) und programmiere in Keil 
µVision4. Es gibt da wunderbare Debuggingfunktionen mit der ITM über 
SWD, z.B. die Printf-Ausgaben oder das auslesen von Variablen während 
der Laufzeit. Ich nutze ULINK2 und ST-Link.

Kann man diese Funktionen, insbesondere die Printf-Ausgaben über die 
ITM, während des Betriebes eines Controllers ansehen, oder sind die nur 
erreichbar wenn ich explizit debugge? Ich würde diese gerne generell 
nutzen um bei Problemen mit Geräten einfach die Ausgaben im Betrieb zu 
loggen oder an zu sehen.

Die Variablen kann man ja beispielweise im STMStudio anzeigen. Da wären 
die Textausgabe der ITM eine super Ergänzung.

Ein erster Test mit dem Oszilloskop zeigt dass der Controller von 
alleine keine ausgaben macht.

Kann man ihn überreden?

von Marcus H. (mharnisch) Benutzerseite


Lesenswert?

Norminator schrieb:
> Kann man diese Funktionen, insbesondere die Printf-Ausgaben über die
> ITM, während des Betriebes eines Controllers ansehen, oder sind die nur
> erreichbar wenn ich explizit debugge?

Na ja, man muss diese Funktion natürlich einschalten. Nichts anderes 
macht der Debugger wenn Du den ITM Viewer verwendest. Der Prozessor 
befindet sich nicht in einem speziellen Debug modus, während man das 
Programm in einem Debugger laufen lässt.

--
Marcus

von Norminator (Gast)


Lesenswert?

Das heißt also es funktioniert, ich muss
das Ausgeben in der Firmware einschalten,
und dann kann ich die Daten auch am Pin mitlesen, richtig so?

Aber wie zeige ich die Empfangenen Daten dann an?

von Marcus H. (mharnisch) Benutzerseite


Lesenswert?

Norminator schrieb:
> ich muss das Ausgeben in der Firmware einschalten,
> und dann kann ich die Daten auch am Pin mitlesen, richtig so?

Ja.

> Aber wie zeige ich die Empfangenen Daten dann an?

Dazu musst Du natürlich dass verwendete Protokoll kennen. Die Ausgabe 
kann im sogenannten UART Modus erfolgen, so dass prinzipiell ein 
Pegelwandler und ein UART reichen, um die Rohdaten zu empfangen.

http://infocenter.arm.com/help/topic/com.arm.doc.ddi0314h/Chdbabbg.html#Chdgbehj

Was Du dann mit den Rohdaten anstellst bleibt Dir überlassen.

--
Marcus

von Norminator (Gast)


Lesenswert?

Im RM0008 von ST habe ich folgendes gefunden:


Example of configuration
To output a simple value to the TPIU:
● Configure the TPIU and assign TRACE IOs by configuring the DBGMCU_CR 
(refer to
Section 30.17.2: TRACE pin assignment and Section 30.16.3: Debug MCU
configuration register)
● Write 0xC5ACCE55 to the ITM Lock Access Register to unlock the write 
access to the
ITM registers
● Write 0x00010005 to the ITM Trace Control Register to enable the ITM 
with Sync
enabled and an ATB ID different from 0x00
● Write 0x1 to the ITM Trace Enable Register to enable the Stimulus Port 
0
● Write 0x1 to the ITM Trace Privilege Register to unmask stimulus ports 
7:0
● Write the value to output in the Stimulus Port Register 0: this can be 
done by software
(using a printf function)


TPUI TRACE pin assignment
By default, these pins are NOT assigned. They can be assigned by setting 
the
TRACE_IOEN and TRACE_MODE bits in the MCU Debug component configuration
register. This configuration has to be done by the debugger host.


Der letzte Satz gibt mir ein bisschen zu denken, kann ich etwa nur per 
Debugger den SWO-Pin einstellen? Ich habe die entsprechenden Register 
wie vorgesehen beschrieben, aber es funktioniert nur wenn ich Debugge.
1
  /* Aktiviere SWD */   
2
  AFIO->MAPR |= AFIO_MAPR_SWJ_CFG_JTAGDISABLE;   
3
4
  /* Aktiviere TRACE */
5
  CoreDebug->DEMCR |= CoreDebug_DEMCR_TRCENA_Msk;
6
  /* Select Pin Protocol -> SWO NRZ */
7
  *((char*)0xE00400F0) = 0x02;
8
  /* Aktiviere den asynchronen Trace mode */
9
//  DBGMCU->CR &= !DBGMCU_CR_TRACE_MODE;
10
  /* Aktiviere den Trace Pin */
11
  DBGMCU->CR = DBGMCU_CR_TRACE_IOEN;
12
  /* Unlock ITM registers */
13
  ITM->LAR = 0xC5ACCE55;
14
  /* configure and activate ITM trace control */
15
  ITM->TCR = 0x00010000 | ITM_TCR_SYNCENA_Msk | ITM_TCR_ITMENA_Msk;
16
  /* Aktiviere ITM Port 0 */
17
  ITM->TER |= 1;
18
  /* unmask stimulus ports 7:0 */
19
  ITM->TPR |= 1;

Hat jemand eine Idee was da schief läuft?

von Marcus H. (mharnisch) Benutzerseite


Lesenswert?

Norminator schrieb:
> Der letzte Satz gibt mir ein bisschen zu denken, kann ich etwa nur per
> Debugger den SWO-Pin einstellen? Ich habe die entsprechenden Register
> wie vorgesehen beschrieben, aber es funktioniert nur wenn ich Debugge.

Gut möglich. Debug host und Prozessor greifen auf die Debug Resourcen 
über unterschiedliche Adressräume zu. Damit kann unterschieden werden 
woher der Zugriff kam. ST könnte das so implementiert haben, dass diese 
Register nur via JTAG/SWD schreibbar sind. Hab' gerade leider keine Zeit 
zum Testen.

Gruß
Marcus

von M. G. (looking)


Lesenswert?


Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.