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?
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
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?
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
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?
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
Vielleicht hilft das hier weiter: http://forums.arm.com/index.php?/topic/14590-output-data-via-swo-without-debugger/
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.