Forum: Mikrocontroller und Digitale Elektronik STM32F107 Keil Datenübertragung


von Maximilian A. (longus)


Lesenswert?

Hallo

Ich habe für mein Forschungsprojekt eine Positionsregelung für einen 
Motor mit dem STM32F107 realisiert. Dazu wird das Eval-Board MCBSTM32C 
von Keil genutzt und auf dem µC läuft ein Tasksystem für die Regelung. 
Als Programmierumgebung habe ich Keil µVision4 benutzt. Die Regelung 
funktioniert ganz gut, bei der Auswertung würde ich aber ganz gern auch 
mal ne Kurve mit Messdaten angeben (Konkret: die Position und die 
Stellgröße zum jeweiligen Zeitpunkt ein long und ein int Wert).
Hat jemand ne Idee, wie ich mit den gegebenen Möglichkeiten mit 
möglichst wenig Aufwand (und wenig Code) die Daten von dem µC auf meinen 
PC kriege. Gibt es in der µVision Umgebung vllt. ne Funktion, mit der 
ich die Variablen beobachten kann?

Vielen Dank schon mal für die Hilfe

LG Longus

von Random .. (thorstendb) Benutzerseite


Lesenswert?

Hi,

hast du einen ULINK2/ME (oder besser: ULINK pro)?
Dann kannst du im laufenden Debugger eine globale(!) Variable per 
Rechtsclick-contextmenu an den Logic Analyzer senden, das ist so ne Art 
Oszi, der dir den Verlauf grafisch über der Zeit anzeigt.

Dazu musst du die CPU per SWD debuggen, und SWO aktivieren.

http://www.keil.com/support/man/docs/uv4/uv4_db_dbg_logicanalyzer.htm
http://www.keil.com/support/man/docs/uv4/uv4_using_la.htm


Ansonsten schnapp dir eins de Beispiele und kupfer die Funktion des 
UARTS oder USB ab, um deine Daten an den PC zu schicken.

Wahlweise kannst die auch im RAM buffern und (SD Card Example) auf eine 
SD Card schreiben.


Noch Fragen?


VG,
/th.

von Maximilian A. (longus)


Lesenswert?

Danke für die schnelle Antwort!

Ja, ich hab den ULINK2, werd dein Tipp bei mal versuchen. Hoffe es 
klappt.

LG Longus

von Random .. (thorstendb) Benutzerseite


Lesenswert?

Mit dem ULINK2 bekommst du ca. 1.2MHz Daten aus dem SWO Pin, das können 
ITM (z.B. printf: View -> Serial Windows -> Printf Window), DWT: z.B. 
Variablen für den Logic Analyzer) sein.

Ein Schreibzugriff auf deine globale(!) Variable wird dann an den 
Debugger geschickt und ist im UV4 im LA zu sehen, während das Target 
läuft.

Wird deine Variable zu oft geschrieben oder anderweitig (printf) zu viel 
Traffic auf dem SWO Pin erzeugt, steht unten in der Statusleiste was mit 
Data Overflow.

Mit dem ULINK pro könntest du dir das ganze mit Volldampf auf bis zu 4 
Variablen ansehen, also @CPU speed.

Mit dem ULINK2 geht das im Prinzip auch alles, nur halt langsamer :-)


VG,
/th.

von Maximilian A. (longus)


Lesenswert?

Nochmal danke für die Hilfe aber irgendwie funzt es nicht.
Ich habe alles wie in den links beschrieben einegestellt aber ich kriege 
am Logikanalyser kein Signal. Muss ich im µC noch irgendwas beachten, 
die Variablen die ich aufzeichnen mchte sind global.
P.S. den ersten Teil von deinem zweiten Post hab ich nicht verstanden, 
auch weil mir die Abkürzungen ITM und DWT nicht geläufig sind

LG Longus

von Random .. (thorstendb) Benutzerseite


Lesenswert?

Diese Cortex-M3 interne "Peripherals" sind Teil der Coresight Debug 
Architecture:

ITM: Instrumentation Trace Macrocell.
=====================================
Der Code muss erweitert (instrumentiert) werden, um von dieser Unit 
Gebrauch machen zu können.
Es stehen 32 Kanäle zur Verfügung, die im Prinzip frei mit Daten 
gefüttert werden können. Wie das geht, findest du in der Funktion 
ITM_Sendchar() aus der core_cm3.h (ganz unten). Diese Funktion macht 
sozusagen das printf.
Um es zu verwenden, siehe Code Beispiele mit retarget.c

Ausnahme:
Kanal 0 ist für printf reserviert und kommt im oben beschriebenen 
Terminal/Hex Window wieder heraus (vgl. Contextmenu der Terminals).

Kanal 31 ist für RTOS Messages reserviert. Im µVision können die 
Taskwechsel / IDLE vom RTX im Event Viewer angesehen werden. (Debug -> 
OS Support -> Event Viewer).

Alle Kanäle kannst du auch auf die HD loggen, im Debugger im Command 
Window:
itmlog <ch> > log.txt


DWT: Data Watch & Trace
=======================
Mit dieser Unit können nicht-invasive (also keine Laufzeitbeeinflussung) 
Zugriffe auf die laufende Software erfolgen. Dazu gehört z.B. das 
Überwachen einer Speicherstelle auf Schreibzugriffe und raussenden des 
neuen Wertes (das passiert für den Logic Analyzer).

Auch können hier Data Breakpoints aufgesetzt werden, z.B.:
BS WRITE myVar == 0x42


ETM: Embedded Trace Macrocell (nur ULINK pro)
=============================================
Mit dieser Unit kann man den kompletten Trace über einen speziellen Port 
aus der CPU ziehen. Neben dem Trace Window ermöglicht MDK-ARM/µVision 
u.a. Code Coverage und Anzeige der Ausführungszeiten direkt an den ASM 
und C Code Zeilen für Performancemessungen.

von Random .. (thorstendb) Benutzerseite


Lesenswert?

Um die Anzeige im LA zu aktivieren, muss du im Options for Target in den 
ULINK2/ME Settings folgendes einstellen:

Debug:
- Port: SW

Trace:
- Trace Enable
- Core Clock auf CPU clk (für ST meisst 72.000000 MHz)
- SWO Clk: Autodetect
- Timestamps enable, Prescaler: 16 (reicht idR.)
- Trace Events: alles deaktivieren (zu viel Traffic)
- PC Sampling: alles deaktivieren (zu viel Traffic)
- ITM Stimulus Ports: alles deaktivieren, Port 0 Enable. Port 7..0 
Priviledge sollte aus sein.


Für STM muss noch ein Ini script geladen werden, um den SWO Port 
freizuschalten. Dies geschieht im Options for Target -> Debug, dort, wo 
du den ULINK2/ME ausgewählt hast.

Unter "Initialisation File" trägst du folgendes ein (pfad ggf. anpassen, 
oder am besten das file in dein Projekt kopieren):
C:\Keil\ARM\Boards\Keil\MCBSTM32C\Blinky_ULp\STM32_SWO.ini

Dann deinen code compilieren, flashen, debug session starten.
Die globale Variable suchen, rechtsclick -> Add to: Logic Analyzer.
Run.

Ändert sich die Variable, so wird dies im LA angezeigt.

---
Noch Fragen?


VG,
/th.

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.