Forum: Mikrocontroller und Digitale Elektronik STM32 USB init problem


von Alex (Gast)


Lesenswert?

Hallo Leute,

ich versuche mich derzeit an einem Projekt mit einem kleinen STF32F042, 
den ich über USB (VCP) anspreche.

USB Code mit CubeMX generiert, der STM hat keinen Quarz sondern holt 
sich den Takt vom USB.

Das funktioniert im Debug-Modus hervorragend, wenn ich als Release 
kompiliere meldet sich der STM aber am USB nicht korrekt an.

Hat jemand eine Idee, woran das liegen könnte?

Danke, Alex

von pegel (Gast)


Lesenswert?

Das hört sich an, als wurde etwas wichtiges weg-optimiert.

von Stefan F. (Gast)


Lesenswert?

Vielleicht ein Timing Problem, irgendetwas läuft zu schnell.

Da war doch was mit einer ID Nummer, die der PC dem µC zuweist. Der µC 
muss diese Zuweisung bestätigen, darf aber erst danach die ID Nummer 
anwenden (in ein Register schreiben).

Vielleicht hat es damit zu tun.

Jemand hat hier mal empfohlen, die Kommunikation mit Wireshark zu 
analysieren, ich konnte mit der Flut an Output allerdings nichts 
anfangen. Als bei mir mal USB nicht funktionierte, kam ich besser mit 
zahlreichen Debug-Meldungen klar, die ich ins Programm einfügte.

Mit Debug Meldungen konnte die Pakete (ohne Details) protokollieren, die 
hin und her gesendet wurden. Da habe ich dann die guten Fälle mit den 
schlechten verglichen und bin so ziemlich schnell auf die fehlerhafte 
Stelle gekommen.

Vielleicht bringt dich diese Vorgehensweise auch weiter. Ist einen 
Versuch wert.

von Niklas G. (erlkoenig) Benutzerseite


Lesenswert?

Stefanus F. schrieb:
> Jemand hat hier mal empfohlen, die Kommunikation mit Wireshark zu
> analysieren, ich konnte mit der Flut an Output allerdings nichts
> anfangen.

Man muss halt genau schauen was zum eigenen Gerät gehört. Wireshark kann 
da schon sehr hilfreich sein. Das Gerät an einem Linux-PC anschließen 
und die Kernel-Meldungen ansehen (dmesg) ist ebenfalls sehr nützlich.

pegel schrieb:
> Das hört sich an, als wurde etwas wichtiges weg-optimiert.

Gut möglich. Vielleicht enthält die ST Library fehlerhaften Code, 
welcher sich auf Undefined Behaviour verlässt, von dem der Compiler 
annehmen darf, dass es nie auftritt, und es so wegoptimiert...

von Alex (Gast)


Lesenswert?

Schönen Abend!

Hab mittlerweile rausgefunden, dass das Verhalten etwas mit den 
Optimierungs-levels zu tun hat.
Was genau die Ursache ist, ist mir aber noch nicht klar.

Alex

von Stefan F. (Gast)


Lesenswert?

Alex schrieb:
> Hab mittlerweile rausgefunden, dass das Verhalten etwas mit den
> Optimierungs-levels zu tun hat.

Das hast du schon gestern in den Eröffnungsbeitrag geschrieben.

von TheBug (Gast)


Lesenswert?

Wie weit kommt der denn beim Enumerieren?

von Alex (Gast)


Angehängte Dateien:

Lesenswert?

Ich komme langsam zu der Erkenntnis, dass ich mit der 
Entwicklungsumgebung des STM nicht wirklich zurechtkomme.
CubeIDE 1.0.2

Ich wollte versuchen rauszufinden, bei welchen Einstellungen es 
nicht/funktioniert und hänge hier:

Hab in der while(1) eine Abfrage eines flags, das in der USB-RX-Callback 
Funktion gesetzt wird.
Wenn das Flag gesetzt ist, wird aus dieser IF der empfangene String 
zurückgeschickt.

Funktioniert in den Optimization-Modes O0 und Og problemlos.
In allen anderen Ox meldet sich das Ding am USB zwar an (hatte es das 
letzte mal nicht gemacht), und auch das Emfangs-Flag wird gesetzt 
nachdem ich etwas sende.
Allerdings springt er nie in die if rein (Bild).

Da steh ich mit Fehlersuche dann irgendwie an.
Selbst wenn in der IF nichts anderes gemacht wird, als das Flag wieder 
zu löschen...

Kurzum, ich bin grad nichtmal in der Lage, sinnvolle Fragen zu stellen.
Mit der Ausnahme nach einem Einstiegs-Tutorial

von Nop (Gast)


Lesenswert?

Alex schrieb:

> Hab in der while(1) eine Abfrage eines flags, das in der USB-RX-Callback
> Funktion gesetzt wird.

Ist das Flag wenigstens überall als volatile deklariert?

von Alex (Gast)


Lesenswert?

Das Flag ist als globale Variable in einer globals.h definiert, die 
überall eingebunden ist.

von Nop (Gast)


Lesenswert?

Alex schrieb:
> Das Flag ist als globale Variable in einer globals.h definiert,
> die überall eingebunden ist.

Also ohne volatile, sonst hättest Du das bestätigt. Wenn Du eine 
Variable benutzt, um Daten zwischen Interrupt und Applikation 
auszutauschen, MUSS sie als volatile deklariert sein - ansonsten kann 
der Compiler das u.U. wegoptimieren.

von Alex (Gast)


Lesenswert?

Bingo!
Danke Nop!

...ich hätt beim assembler bleiben sollen...

mit diesem Erfolgserlebnis leg ich mich jetzt schlafen...

Danke nochmal!

von Alex (Gast)


Lesenswert?

Hallo Leute,
ich steck schon wieder fest :-(

Ich möchte mit dem STM via USB Gleitkomma-Daten austauschen.
sprintf/sscanf oder atof..

Sobald in den Einstellungen "Use float with printf from newlib-nano (-u 
_printf_float)" aktiviert ist, gibt es errors wegen RAM/FLASH
overflow.

Durch Suchen hab ich threads gefunden, in denen Probleme wegen einem 
Fehler im Linker-Skript diskutiert wurden, das trifft aber bei meinem 
STM32F042 nicht zu...
( 
https://community.st.com/s/question/0D50X0000AnrcyjSQA/how-to-use-float-in-printf 
)

Hat hier jemand eine Idee dazu?


Um RAM freizumachen hätte ich mal versucht, die USB Buffer (USB CDC *x 
Buffer Size) von den 1000 Bytes zu reduzieren. Das hat aber keinen 
Effekt. Laut .map-file belegen die Buffer immer 2* 1000 Bytes im RAM, 
egal was im Codegenerator eingestellt ist.

Vielen Dank für jede Hilfe,
Alex

von Stefan F. (Gast)


Lesenswert?

Wie viel RAM und Flash hast du denn frei und um welchen STM32 geht es?

http://stefanfrings.de/stm32/stm32l0.html#newlib (M0)
http://stefanfrings.de/stm32/stm32f1.html#newlib (M3)
http://stefanfrings.de/stm32/stm32f3.html#newlib (M4F)

Der Flash-Bedarf variiert ziemlich stark, je nach Cortex Variante.

von Alex (Gast)


Lesenswert?

Der STM32F042F6P6 hat
32k Flash
6k RAM

compiler -Os

ohne "-u _printf_float":

   text     data      bss      dec      hex  filename
  13372      380     5492    19244     4b2c  testUsb.elf

mit "-u _printf_float" (ohne einem printf-aufruf!)

  region `RAM' overflowed by 200 bytes


Den FLASH-Overflow kann ich nicht mehr reproduzieren, im RAM belegt der 
USB-Buffer schon mal 2k, die restlichen USB-Sachen locker nochmal 2k, 
meine eigenen Daten 0x78 ;-)

von Alex (Gast)


Lesenswert?

vergessen: Ist ein M0

von Stefan F. (Gast)


Lesenswert?

Du brauchst ungefähr 1,5kB (mit reduzierter Performance nur 0,5kB) und 
4,3kB FLASH. Mit Fließkomma kommen weitere 9kB FLASH dazu.

Dein RAM ist auf jeden Fall rappelvoll (data + bss). Das kriegst du nur 
gelöst, indem du dein Programm umschreibst. Eventuell hast du ein paar 
Strings oder Arrays, die niemals verändert werden und daher durch das 
Schlüsselwort "const" direkt aus dem FLASH geladen werden können. 
Dadurch wird RAM frei.

Die folgenden Optionen helfen eventuell, den FLASH Bedarf zu reduzieren.

Compiler: -Os -ffunction-sections
Linker: -Wl,--gc-sections -lm

Die USB CDC Implementierung von W.S. ist wesentlich schlanker und das 
kannst du den Pufferspeicher wirksam verkleinern, falls das dann noch 
nötig sein sollte. Ich vermute mal, dass der gleiche Code wie vom 
STM32L0 geht:http://stefanfrings.de/stm32/stm32l0.html#vcpnohal

von Alex (Gast)


Lesenswert?

Ja, der RAM ist zu voll, aber den belegt der USB-Teil (codegenerator) 
und die newlib-float.
Meine Daten beschränken sich auf 120 Byte!

Deshalb hab ich ja versucht, die USB buffer kleiner zu machen, was aber 
nicht geht.

Selbst wenn mein code keinen Speicher belegt, ginge sich das also nicht 
aus.

Mein Fazit derzeit:
USB + Float ist mit 6k RAM nicht zu machen.
Find ich ziemlich unglaublich.

von Stefan F. (Gast)


Lesenswert?

Alex schrieb:
> USB + Float ist mit 6k RAM nicht zu machen.

Doch, mit dem Code von von W.S. geht das. 
http://stefanfrings.de/stm32/stm32l0.html#vcpnohal

von Stefan F. (Gast)


Lesenswert?

Noch zwei Linker Optionen, die eventuell helfen FLASH zu sparen:

-specs=nano.specs -specs=nosys.specs

von Alex (Gast)


Lesenswert?

ich wollte mit dem kleinen STM ein Tool, dass es bereits mit einem AVR 
gibt, um eine Funktion erweitern (die ich dort nicht mehr reinkriege).
Aber die Grund-Funktionalität des 4k Flash / 256Byte RAM - AVR-Dings 
ist standardmäßig nicht in den 32k/6k STM unterzubringen. WTF?

von Nop (Gast)


Lesenswert?

Alex schrieb:

> Ich möchte mit dem STM via USB Gleitkomma-Daten austauschen.
> sprintf/sscanf oder atof..

Du könntest das auch einfach als 32bit-Rohwerte schicken und nicht als 
Strings. Dann muß man nur noch Endianess richtig beachten, aber sowohl 
x86 als auch ARM sind da eh identisch.

von Stefan F. (Gast)


Lesenswert?

Alex, hör auf zu meckern und schau Dir die Infos an, die ich Dir gegeben 
habe. Du meckerst in Wahrheit über deine eigenen Fehlentscheidungen. Als 
Anfänger muss man damit rechnen.

Dass ein zusammengeklicktes Programm auf Basis der Cube HAL nicht 
optimal ist, sollte niemanden wundern. Falls es für dich neu war, dann 
weißt du es wenigstens jetzt.

Und jetzt kommt die AHA-Erkenntnis Nr 2: Die generische newlib-nano 
braucht in jeder Hinsicht sehr viel mehr Speicher, als die speziell für 
AVR hand-optimierte avr-libc, insbesondere bezüglich stdio und float.

Warum zwängst du das alles auf diesen mickrigen Mikrocontroller?

von Stefan F. (Gast)


Lesenswert?

Ich habe noch eine Bitte: Mach für neue Probleme bitte ein neues Thema 
auf. Ewige Fortsetzungs-Geschichten werden schnell unübersichtlich.

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.