Tipps zum Vorgehen bei der Fehlersuche STM32F103 E-Bike-Controller

Gast #7323747
Lesenswert?

Ich kämpfe gerade mit einem unschönen Phänomen bei meiner offenen Firmware für Lishui EBike-Controller. Diese Controller gibt es in den verschiedensten Platinenlayouts, die Funktionalität ist aber immer die Gleiche. https://github.com/EBiCS/EBiCS_Firmware/wiki

Jetzt habe ich eine sehr kompakte Controllervariante, die aus zwei aufeinandergesteckten Platinen besteht, bei der die Firmware leider zicken macht. Nach einer undefinierten, nicht reproduzierbaren Zeit scheint die Hauptschleife nicht mehr abgearbeitet zu werden, der Prozessor scheint aus den Interrupts nicht mehr herauszukommen. Das äußert sich darin, daß der Motor weiter läuft, der Controller aber auf keine Benutzeraktionen mehr reagiert. Das ist für den Fahrer natürlich nicht schön, wenn er nur noch Passagiert ist :-) Ich habe das jetzt durch den Watchdog aufgefangen, so daß der Prozessor resettet, wenn das passiert, schöner wäre es natürlich, wenn man die Ursache bekämpfen könnte. Da das Problem bei allen anderen Layoutvarianten bisher nie aufgetreten ist, hab ich zuerst an ein EMV-Problem aufgrund dieser zweistöckigen Bauweise gedacht. Wie kann man so einen nicht reproduzierbaren Bug am besten Debuggen? Der Debugger der STM32-Workbench steigt leider auch immer nach einigen Sekunden aus, wenn der Motor auf dem Rollentrainer mit ordentlich Last dreht. Ich habe mir auch schon mit dem Oszi die Dauer der verschiedenen Interrupt-Routinen angeschaut und sehe auch, daß einzelne Routinen ab und zu deutlich länger brauchen als sonst, kann daraus aber nicht ableiten, woher die längere Dauer kommt...

Die Interrupts sind derzeit so konfiguriert:

1
HAL_NVIC_SetPriority(DMA1_Channel1_IRQn, 0, 1); //DMA ADC1
2
HAL_NVIC_SetPriority(ADC1_2_IRQn, 0, 0); //ADC1+2
3
HAL_NVIC_SetPriority(MemoryManagement_IRQn, 1, 0);
4
HAL_NVIC_SetPriority(BusFault_IRQn, 2, 0);
5
HAL_NVIC_SetPriority(UsageFault_IRQn, 2, 0);
6
HAL_NVIC_SetPriority(SVCall_IRQn, 1, 0);
7
HAL_NVIC_SetPriority(DebugMonitor_IRQn, 2, 0);
8
HAL_NVIC_SetPriority(PendSV_IRQn, 1, 0);
9
HAL_NVIC_SetPriority(SysTick_IRQn, 0, 0);
10
HAL_NVIC_SetPriority(RCC_IRQn, 3, 0);
11
HAL_NVIC_SetPriority(TIM1_UP_IRQn, 1, 0);
12
HAL_NVIC_SetPriority(TIM1_TRG_COM_IRQn, 0, 0);
13
HAL_NVIC_SetPriority(TIM1_CC_IRQn, 0, 0);
14
HAL_NVIC_SetPriority(TIM2_IRQn, 0, 1); //Motor Halls
15
HAL_NVIC_SetPriority(TIM3_IRQn, 3, 0);
16
HAL_NVIC_SetPriority(USART1_IRQn, 3, 1);
17
HAL_NVIC_SetPriority(DMA1_Channel5_IRQn, 3, 1); //DMA UARTRx
18
HAL_NVIC_SetPriority(DMA1_Channel4_IRQn, 3, 1); //DMA UARTTx
19
HAL_NVIC_SetPriority(EXTI9_5_IRQn, 2, 0); //Speed and PAS sensors
20
HAL_NVIC_SetPriority(SysTick_IRQn, 0, 0);

Ich kann mir aber auch nicht recht vorstellen, daß es an der Interrupt Priorisierung liegt, auch wenn ich damit etwas rumexperimentiert habe....

Hat jemand einen Tipp, wie man sich hier systematisch der Problemlösung nähern kann?

Gruß hochsitzcola

Gast #7323840
Lesenswert?

Martin S. schrieb:

Ist die Spannung vom Controller stabil?

Beim Debuggen wird der Prozessor ja zusätzlich über den STLink mit Spannung versorgt. Daran sollte es also nicht liegen.

weiter weg schrieb:

Deine unzureichend geschützte Hardware

Das ist ja keine selbstentwickelte Hardware sondern ein kommerzielles Produkt. Lishui bietet diese Controller in den verschiedensten Bauformen an und nur der LD-LS05-F macht Probleme.... https://www.lsdzs.com/ls_product/product.php?lang=en&class2=19

https://www.lsdzs.com/ls_product/showproduct.php?lang=en&id=86

Gruß hochsitzcola

Gast #7324052
Lesenswert?

hochsitzcola schrieb:

Beim Debuggen wird der Prozessor ja zusätzlich über den STLink mit Spannung versorgt.

Voll der Käse. Ein ST-Link bietet keine Versorgung sondern testet die Spannung des zu bearbeitenden Controllers. Die Annahme dass ein Debugger ein Target vollwertig mit Spanung versorgt zeugt von maximaler Ahnungslosigkeit. Von stabiler Versorgung kann keine Rede sein, selbst wenn es einen Debugger gibt der eine Versorgung liefern kann.

hochsitzcola schrieb:

Das ist ja keine selbstentwickelte Hardware sondern ein kommerzielles Produkt.

Und deshalb hat es garantiert keine Macken bzw. Fehler? Träum schön weiter.

hochsitzcola schrieb:

nur der LD-LS05-F macht Probleme....

.... und du kannst deinen Anteil daran haben dass er problemlos funktioniert oder eben mit Macken läuft. Der/die Fehler sitzen auf dem Board bzw. vor deinen Bildschirm.

Gast #7324160
Lesenswert?

Ich kenne ja deine Entwicklungsumgebung nicht, aber wenn man wie ich das Segger Embeddet Studio nimmt und einen jlink, dann kann man selbst in dem festgefahrenen Zustand den jlink verbinden und dann das Programm unterbrechen. Da sieht man dann wenigstens wo er (meistens in der Hardfault-Loop) hängt. Ob das mit dem stlink und deinem Debugger geht weiss ich nicht. Oder nur den Ozone-Debugger von Segger benutzen sollte auch gehen.

Gast #7324228
Lesenswert?

mitlesa schrieb:

Ein ST-Link bietet keine Versorgung sondern zeugt von maximaler Ahnungslosigkeit.

Ich liebe dieses Forum, man trifft immer wieder auf herzliche Artgenossen. Ich bin kein Profi, aber die Behauptung, der STLink könne das Target nicht mit Spannung versorgen, zeugt nicht gerade von tiefem know how ;-)

temp schrieb:

meistens in der Hardfault-Loop

Würden denn dann die Interrupts weiterlaufen? Der Motor läuft ja sauber weiter, die Kommutierung funktioniert ja also offensichtlich noch.

Auf JLink und Segger umzusteigen würde für mich wahrscheinlich ein Vierteljahr Einarbeitung bedeuten. Nur um festzustellen, daß der Code im Hardfault-Loop hängt?!

Gruß hochsitzcola

Gast #7324233
Lesenswert?

hochsitzcola schrieb:

Ich bin kein Profi, aber die Behauptung, der STLink könne das Target nicht mit Spannung versorgen, zeugt nicht gerade von tiefem know how

Aha, also nicht nur voll ahnungslos sondern auch noch massiv beratungsresistent. Schau in das Datenblatt deines ST-Link, vielleicht lässt du dich wenigstens damit "beraten".

Gast #7324284
Lesenswert?

mitlesa schrieb:

massiv beratungsresistent.

Allein, das ich hier immer wieder Fragen stelle, obwohl ich weiß, daß ich hier gern von vermeintlich Allwissenden beschimpft werde, zeugt wohl schon vom Gegenteil ;-) Glücklicherweise gibt es hier ja auch User, die in freundlich helfen.

Ein klassisches "Datasheet" zum STLink kenne ich tatsächlich nicht und in dem User Manual steht nichts zu Belastbarkeit von Pin 1 und 2, da steht lediglich als Function Target VCC für den STLink. https://www.st.com/resource/en/user_manual/um1075-stlinkv2-incircuit-debuggerprogrammer-for-stm8-and-stm32-stmicroelectronics.pdf

Meine Erfahrung zeigt: Mit der Spannungsversorgung über den STLink lässt sich der Prozessor flashen und die Peripherie wie UART, ADC etc. betreiben.

Ich werde auf jeden Fall testen, ob der Fehler weiterhin auftritt, wenn ich extern stabilisierte 3,3V auf VCC gebe.

Gruß hochsitzcola

Gast #7324743
Lesenswert?

hochsitzcola schrieb:

Beim Debuggen wird der Prozessor ja zusätzlich über den STLink mit Spannung versorgt. Daran sollte es also nicht liegen.

Normalerweise ist es anders herum. Der Debugger wird vom Target versorgt.

Außer man nimmt diese schrottigen China ST-Link Sticks, die das genau so falsch handhaben, wie deren USBASP Sticks. Die Chinesen kopieren sogar ihre Fehler mehr als 10 Jahre lang.

Gast #7324754
Lesenswert?

hochsitzcola schrieb:

Ein klassisches "Datasheet" zum STLink kenne ich tatsächlich nicht und in dem User Manual steht nichts zu Belastbarkeit von Pin 1 und 2, da steht lediglich als Function Target VCC für den STLink.

Und zwar deswegen, weil es nicht vorgesehen ist, das der Adapter eine Stromversorgung für das Target liefert.

Pin 1 und 2 sind in der Fußnote so beschrieben:

"The power supply from the application board is connected to the ST-LINK/V2 debugging and programming board to ensure signal compatibility between the boards."

Will sagen: Das application Board soll damit die Treiberstufen des ST-Link versorgen, damit die Spannungen auf der Schnittstelle zum application Board passen.

Pin 19 liefert hingegen eine Versorgungsspannung, aber nicht auf den isolierten Varianten des Adapters. Und außerdem soll er weder bei SWD noch bei JTAG verwendet werden. Da steht in den beiden Spalten eindeutig "Not connected".

Selbst wenn man Pin 19 verwenden wollte: Ohne Angabe wie viel Strom man da entnehmen darf, kann man damit nicht viel anfangen. Auf keinen Fall würde ich da einen kompletten Motor-Controller dran hängen.

Gast #7324809
Lesenswert?

hochsitzcola schrieb:

Würden denn dann die Interrupts weiterlaufen? Der Motor läuft ja sauber weiter, die Kommutierung funktioniert ja also offensichtlich noch.

Auf JLink und Segger umzusteigen würde für mich wahrscheinlich ein Vierteljahr Einarbeitung bedeuten. Nur um festzustellen, daß der Code im Hardfault-Loop hängt?!

Ich habe hier nicht davon gesprochen, dass das bei dir der Code im Hardfault hängt, das war nur ein Beispiel. Solange du nicht mal deinen Debugger vernünftig zum Laufen bekommst, würde ich hier besser nichts mehr Fragen, die Gefahr sich lächerlich zu machen ist schon ganz schön groß.

Wir kennen keine einzige Zeile deines Codes oder haben nur in etwa eine Ahnung was du überhaupt wie in die Interrupts verteilst noch kennen wir sonst irgendwelche Details. Was soll uns das sagen "der Controller aber auf keine Benutzeraktionen mehr reagiert"? Ich kann erahnen das das über UART passiert. Alle andern können raten. Liegt es daran dass das Hauptprogramm nicht mehr läuft, da helfen Blinkerspiele oder ist dein UART kaputt?

Ein immer mal wieder vorkommendes Problem ist das zu frühe Verlassen des Interrupts. So in etwa Interrupt Flag löschen und gleich return. Da ist es mir jedenfalls selbst schon unter gekommen, dass der Interrupt sofort wieder neu gestartet wird, weil das Rücksetzen des Interrupflags noch nicht in der Hardware angekommen ist. (Höher priorisierte Interrupts kommen in so einer Konstellation trotzdem noch dazwischen). Oder wurde eine Flag gar nicht erst gelöscht? Alles möglich. Hier wird dir sicher keiner helfen können ohne sich tiefer einzuarbeiten. Aber wozu? Wenn selbst dein Debugger abschmiert sehe ich keine Möglichkeit einer systematischen Fehlersuche. Frohes Kaffeesatzlesen.

Gast #7324915
Lesenswert?

Danke für eure Rückmeldungen. Der Code ist Open Source und bei Github verfügbar, siehe Link im Eingangspost. Ich bin Maschinenbauer. Die ganze Programmiererei mache ich (jetzt schon eine ganze Weile) learning by doing. Die User-Interaktion passiert über digitale Eingänge für PAS (Pedal Assist Sensor, im wesentlichen ein Rechtecksignal) und Bremse. Analoge Eingänge für Gas-Signal, lineare Reku, Drehmoment an der Kurbel, sowie über UART (Display/Bedien-und Anzeige Panel). Ich werde jetzt noch mal versuchen herauszufinden, warum der Debugger aussteigt...

Gruß hochsitzcola

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren