Forum: Mikrocontroller und Digitale Elektronik stm32F103 USB total absturz problem


von Willem B. (mr_willem)


Lesenswert?

Hallo liebe Forumsmitglieder,

ich scheitere gerade daran mit einem STM32F103C8T6 eine USB 
Kommunikation hinzubekommen. Ich versuche einen virtuellen ComPort zu 
implementieren mit dem dann geloggte Daten ausgelesen werden sollen.
Ich habe mich größtenteils an das Beispiel im Forum gehalten. Nur den 
Pin für das USB Enable Signal (der Pullup an D+) habe ich angepasst.
Hardwareseitig gibt es keine Fehler. Die Widerstände haben gemessen die 
erwarteten Werte, es gibt keine Kurzschlüsse und das Kabel ist eins zu 
eins mit den entsprechenden Pins des Controllers verbunden.

Passieren tut folgendes.

Der Controller zieht D+ auf 3,3 Volt (Das wird ja in der USB Init 
routine gemacht) und erkennt anscheinend das Potential auf der USB 
Leitung, zumindest wird der USB_Istr() Interrupt ausgelöst. Ab da wird 
es kritisch weil der Prozessor einfach stehen bleibt. Ich benutze zum 
debuggen einen Jlink über SWD interface und eclipse. Und wenn ich dann 
in Eclipse irgendwann auf "Pause" drücke komme ich in ein Fenster wo 0x0 
steht.

Packe ich in die USB_Istr() einen breakpoint und gehe die routine 
schritt für schritt mit eclipse durch sehe ich das die USB_Istr() ISR 
ein paar mal ausgelöst wird.
Sobald sie nicht mehr ausgelöst wird kann ich das Programm normal 
fortsetzen also ohne step debugging. Es funktioniert wie gewohnt (Es 
wird z.B. jede Sekunde das Display mit der aktuellen Uhrzeit 
aktualisiert, daran sehe ich auch das es nicht abgestürzt ist).
Stecke ich jetzt den USB Port in den USB Hub des Computers, wird wie 
erwartet die USB_Istr() wieder ausgeführt. Das Programmm kommt zum 
stehen wenn ich die USB_Istr() nicht im Schritt debug modus einzeln 
durchgehe.

Der Takt des USB sollte passen. Mein Quarz ist 8 MHz, der MCU wird mit 
72 MHZ betrieben und der USB Clock divider steht auf 1,5.

Da ich die Routine ja im step debug modus durchläuf, gehe ich mal davon 
aus das ich nicht irgendwo in Speicher schreibe wo ich nicht darf.

Kann das eventuell durch Code optimierung hervorgerufen werden? Ich habe 
eigentlich -O0 als gcc Flag gesetzt.

Habe auch schon versucht die NVIC Prioritäten zu ändern um 
auszuschließen das die ISR irgendwie unterbrochen wird. Die USB ISR hat 
bei mir jetzt als einzige höchste Priorität.
Hat jemand schon einmal ähnliches beobachtet?

Grüße, Willem.

von abc (Gast)


Lesenswert?

Willem B. schrieb:
> Hat jemand schon einmal ähnliches beobachtet?

Die USB Implementierungen (HAL&co) von ST sind mit großer Vorsicht zu 
verwenden. Die hat viele Bugs.

von M. K. (kichi)


Lesenswert?

Ich habe dieselbe MCU mit dem HAL-CustomHID-Beispiel laufen und musste 
feststellen, dass sich dort USB und Debugger nicht vertragen. Ob mein 
Fehlerbild exakt deinem entspricht, weiß ich nicht mehr, da es schon 
eine Weile her ist. Könnte ich aber heute Abend nochmal ausprobieren.

Exakt denselben Code kann ich auf einem STM32L151 problemlos debuggen, 
aber auf dem F103 springt er irgendwann nicht mehr in die ISR und wird 
am PC nicht erkannt. Starte ich die ganze Geschichte ohne Debugger, 
läuft auf Windows-Seite alles problemlos. Im ST-Forum habe ich keine 
Antwort erhalten.

Meine Vermutung ist, dass die USB-Peripherie des F103 alt ist und aus 
irgendwelchen Gründen im Debug-Modus nicht läuft, weil es Probleme mit 
dem Timing/Takt gibt.

Mein Quarz hat 12Mhz, die CPU 48MHz und der USB-Teiler steht demnach auf 
1. Das Problem tritt sowohl mit dem STlink als auch mit der 
BlackMagicProbe auf.

von Willem B. (mr_willem)


Lesenswert?

Hallo,

danke für die Antwort. Das habe ich auch schon ausprobiert. Also den 
Code einfach ohne Debugger laufen lassen. Funktioniert nur leider genau 
so wenig.
Der Controller stürzt einfach ab.

Hier im Forum wurde schon einmal das problem beschrieben
Beitrag "STM32 USB Virtual COM Port"
weiter unten im thread con Lukas M.

leider gab es da aber so weit ich lesen konnte keine Lösung.




Michael K. schrieb:
> Ich habe dieselbe MCU mit dem HAL-CustomHID-Beispiel laufen und musste
> feststellen, dass sich dort USB und Debugger nicht vertragen. Ob mein
> Fehlerbild exakt deinem entspricht, weiß ich nicht mehr, da es schon
> eine Weile her ist. Könnte ich aber heute Abend nochmal ausprobieren.

von Pieter (Gast)


Lesenswert?

moin moin,

habe auf dem STM32F103C8T6 für USB das HID laufen.
Bei der Enumeration sollte das erstmal egal sein.
Das Problem beim debuggen ist das enge Zeitfenster von Windows.
Habe mir daher Zeichen über die UART ausgeben lassen, da sieht man dann 
"wo" "was" ist.
Prio der ISR habe ich nicht verändert.

VG
Peter

PS:ich progge in Pascal.

von Willem B. (mr_willem)


Lesenswert?

Danke, aber ich bin aber noch im Schritt vor der Enumeration.
Ich habe auf dem MCU ein funktionierendes Programm und das friert ein 
wenn ich USB einschalte.
Ich glaube ich habe das zu dem Zeitpunkt wo die Interrupts angeschaltet 
werden eingrenzen können. In verschiedenen Foren gibt es hier ähnliche 
beispiele, das der controller an der Stelle einfriert aber leider habe 
ich noch nirgendwo ne Lösung gefunden.

Nach etwas weiterem lesen habe ich mich daran erinnert, das durch die 
ISR irgendwann mal eine Funktion WFI aufgerufen wurde.

Ich habe mich noch nie mit STM low power modes beschäftigt, aber wird 
hierdurch der Prozessor in den Sleep Modus geschickt?
Kann es sein das er dort verweilt und aus irgend einem Grund nicht mehr 
raus kommt z.B. weil ich zu dem Zeitpunkt nur den systick Interrupt 
laufen habe?


Kann es sein das durch step debuging der sleep mode unterbrochen wird, 
nicht aber wenn Breakpoints ausgeschaltet sind und man dann irgendwie 
auf pause drückt? Ich lande ja auch nicht explizit im Hardfault handler.

Ich werde mal ausprobieren die WFI() funktion nicht aufrufen zu lassen.

von W.S. (Gast)


Angehängte Dateien:

Lesenswert?

Willem B. schrieb:
> ich scheitere gerade daran mit einem STM32F103C8T6 eine USB
> Kommunikation hinzubekommen.

Du kannst einen USB-Treiber im µC NICHT debuggen. Es geht definitiv 
nicht, da du vom Host nach 3 ms rausgeworfen und auf Eis gelegt wirst.

Ich hänge dir mal nen älteren Code hier dran, dn ich vor Jahren für 
einen STM32F103ZET6 geschrieben habe. Wundere dich nicht darüber, daß er 
sich am PC als virtueller Nuvoton-COM-Port anmeldet. Es sind 2 Versionen 
dabei: eine normale und eine Debug-Version. Aber denk nicht mal dran, da 
mit einem Debugger ranzugehen. Die Debug-Version ist nur für einen in 
deiner Firmware zu schreibenden Post-Mortem-Debugger gedacht. Siehe 
"debugfkt.inc".

Ich denk mal, daß der C8T6 sich nicht grundlegend vom ZET6 
unterscheidet, der Code sollte daher ohne oder zumindest fast ohne 
Änderungen sofort laufen. OK, den 1k5-Betätiger mußt du in jedem Falle 
anpassen.

W.S.

von Willem B. (mr_willem)


Lesenswert?

Hallo,

danke nochmal für eure Mühe.
@W.S. Das ich nicht die USB Kommunikation debuggen kann ist klar. Ich 
wollte lediglich feststellen woran es lag. Wie gesagt, gelangte der Chip 
in einen nicht mehr anzusprechenden Zustand.
Trotzdem danke für deinen sehr gut beschriebenen Code. Der ist echt 
super.

Ich habe nun in dem Beispiel der USB ISR Die man hier im Forum unter 
https://www.mikrocontroller.net/articles/STM32_USB-FS-Device_Lib findet 
in der Datei

usb_istr.c
in der funktion
void USB_Istr(void)
{
....
....

 if (wIstr & ISTR_SUSP & wInterrupt_Mask)
  {

---- > Diese Änderung
    /* this is a hack to disable power suspend */
    fSuspendEnabled=0;

---- > Stop Änderung

    /* check if SUSPEND is possible */
    if (fSuspendEnabled)
    {
      Suspend();

.....
....


Damit vermeide ich augenscheinlich den USB Suspend.

seit dem läuft das Programm weiter und dmesg unter linux sagt :

[ 2985.280633] usb 3-3.3: Product: STM32 Virtual COM Port
[ 2985.280637] usb 3-3.3: Manufacturer: STMicroelectronics
[ 2985.280641] usb 3-3.3: SerialNumber: Pÿlg\xffffffc2\xffffff85SIU'$g
[ 2985.308012] cdc_acm 3-3.3:1.0: ttyACM0: USB ACM device
[ 2985.308867] usbcore: registered new interface driver cdc_acm
[ 2985.308870] cdc_acm: USB Abstract Control Model driver for USB modems 
and ISDN adapters

freu :-)

Es lag wohl wirklich daran das der code den chip in den Schlaf geschickt 
hat.

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.