Forum: Mikrocontroller und Digitale Elektronik STM32F0 HardFault bei UART Empfang


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von Glossar (Gast)


Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Freunde!

Ich bin neu in der STM32 Welt und versuche gerade die UART mit der HAL 
Lib in Betrieb zu nehmen.

Senden funktioniert soweit.

Ich versuche nun unter Verwendung des Empfangsinterrupts zu empfangen.
Jedoch stürzt der Controller ab (und geht in den HardFault_Handler) 
sobald ich auch nur ein Byte an den Controller sende.

Ich versuche nun schon seit Stunden diesen HardFault zu lokalisieren, 
jedoch ohne erfolgt.

Am Senden vom Controller liegt es nicht. Sobald ich 
HAL_UART_Receive_IT() aktiviere und Bytes an den Controller sende stürzt 
er ab.

Habe bereits Versucht den Buffer zu initialisieren und auch mit dem 
alignment des Buffers habe ich getestet, jedoch ohne effekt.

Mit dem Debugger (J-Link) bin ich noch zu wenig erfahren um damit 
sinnvoll zu arbeiten.

Wo würdet ihr suchen?

Bin um jeden Tipp dankbar!

von pegel (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Hast du das Projekt mit CubeMX erstellt?
Wenn ja, hänge mal die .ioc Datei an.

von Jim M. (turboj)


Bewertung
0 lesenswert
nicht lesenswert
Bau mal einen eigenen Hardfault_Handler() ein. Meistens ist es damit 
getan.

In seltenen Fällen stimmt die Interrupt Tabelle nicht, oder man hat ein 
.c File mit dem Interrupt Handler vergessen. Der Default Handler ist 
meistens eine Endlosschleife.

Glossar schrieb:
> Mit dem Debugger (J-Link) bin ich noch zu wenig erfahren um damit
> sinnvoll zu arbeiten.

Der sollte Dir aber sagen wo der Prozessor steht, wenn Du auf "Halt" 
gehst. Das würde eventuell nicht nur uns weiterhelfen...

von Olaf (Gast)


Bewertung
0 lesenswert
nicht lesenswert
> Mit dem Debugger (J-Link) bin ich noch zu wenig erfahren um damit
> sinnvoll zu arbeiten.

> Wo würdet ihr suchen?

In der Bedienungsanleitung deines Debuggers damit du kompetenter wirst. 
:)

Olaf

von gdb (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Glossar schrieb:
> Hallo Freunde!
>
> Ich bin neu in der STM32 Welt und versuche gerade die UART mit der HAL

Gut, mach aber nicht den 3. Schritt vor dem 2.

> Bin um jeden Tipp dankbar!

Konfiguriere deine IDE/Code erstmal so, dass du mit einem Click einen 
ordentlichen backtrace bekommst.

(Ja, das geht fast immer auch aus dem HardFault Handler!)

von chris (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Zeig mal deine Interrupt Vektortabelle.
Wahrscheinlich fehlen da die Peripherie-spezifischen Interrupts und sind 
standardmäßig alle auf den HardFault gemappt.

von Nop (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Glossar schrieb:

> Ich versuche nun schon seit Stunden diesen HardFault zu lokalisieren,
> jedoch ohne erfolgt.

Bau Dir nen Hardfault-Handler, lies da die relevanten Register aus (CFSR 
oder so) und dann noch Stackpointer plus 24 (IIRC), da sollte die 
Programmadresse liegen, die den Hardfault verursacht hat. Dann guckst Du 
ins Mapfile, welche Funktion das denn ist.

von UART (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Vielleicht mal da nachschauen:

Beitrag "STM32 - BusFault finden"

von Glossar (Gast)


Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
CubeMX Project File ist angehängt.
VectorTable ist angehängt.

Zusätzlich ein Bild der Trace.

Eingenen HardFault Handler habe ich angelegt. Hat nichts gebracht.

Im Moment ist wirklich fast nichts drin, was einen Einfluss haben 
könnte.
Hier die while-Schleife aus dem Main:

 while (1)
  {
  /* USER CODE END WHILE */

  /* USER CODE BEGIN 3 */



    //LED Blink Process
  //  if ((HAL_GetTick()- lastLEDTime) > LEDBLINKINTERVAL) {
      HAL_GPIO_TogglePin(GPIOB, GPIO_PIN_0);


      HAL_Delay(1000); //delay 100ms
    HAL_UART_Transmit(&huart1, sensTrigStr, 1, 1000);


  }
  /* USER CODE END 3 */

}


Ich habe irgendwie das Gefühl, das Programm kommt vom HAL_GetTick() 
(0x8003b8) Aufruf her. Der UART IRQ wird nicht ausgelöst, er stürzt 
vorher ab.

Ich habe bereits einiges zur Priorität vom SysTick Interrupt gelesen, 
ich denke jedoch dass der auf der niedrigsten Priorität ist (CubeMX 
Standard Einstellung).

von Glossar (Gast)


Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Vector Table

von Mike R. (thesealion)


Bewertung
0 lesenswert
nicht lesenswert
Und wie soll der arme Controller bei der Vector Tabelle den USART 
Interrupt finden?

von pegel (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Ich habe versucht aus der ioc ein Projekt zu erzeugen.
Das gibt allerdings eine Meldung das das Projekt nicht richtig angelegt 
wurde.

Weitere Versuche haben gezeigt, dass er offensichtlich Probleme mit 
deinem Projektnamen hat.

Habe noch mehrere mit ac6..... versucht, gibt immer die Meldung.
Ändere ich den Namen, lässt sich auch für deinen µC problemlos ein 
Projekt generieren.

von pegel (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Ist jetzt bestätigt. Es darf kein ac6 im Projektnamen vorkommen.

Ich habe dein Projekt noch mal gespeichert und erstellt als:
My_ac6Two
ergibt wieder Fehler.

Dann als:
My_ac_6_Two
alles gut.

von Glossar (Gast)


Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Mike R:
Eine sehr gute Frage!

Das ist nun der Nachteil wenn man ohne tieferes Verständis die HAL 
verwendet. :/  Ich nahm an, dass dies bereits automatisch konfiguriert 
wurde.

An welcher Stelle müsste ich dann meinen Handler eintragen bzw. in 
welchem der vielen Dokumente ist dies aufgelistet?


@Pegel
Ah, ok, danke für die Info.
Beziehst du dich auf folgende Fehlermeldung? (s.h. Anhang)
Ich habe mich schon gefragt, woher die kommt.
Danke, werde es mit einem andern Namen versuchen. Jedoch hat dies wohl 
nichts mit  meinem HardFault_Hanlder Problem zu tun, nehme ich an?

Vielen Dank schonmal!

von pegel (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Mit der falschen Vector Tabelle ist der HardFault_Hanlder sehr 
wahrscheinlich.

Wie bekommst du eigentlich das CubeMX Projekt in SW4STM32?
Irgendwie mit kopieren oder importieren?

von Glossar (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Nein, ist einfacher:

Beim Anlegen des CubeMX Projektes kannst du den Pfad zum SW4STM32 
Projekt angeben. Anschliessend kannst du die CubeMX konfiguration 
erledigen und den Sourcecode generieren lassen. Dieser Schritt 
überschreibt die Files im System Workbench Projekt (alles ausser deinen 
User Code), worauhin du dort nur noch Refresehen und Builden must. 
Fertig.

von pegel (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Glossar schrieb:
> Beim Anlegen des CubeMX Projektes kannst du den Pfad zum SW4STM32
> Projekt angeben.

Das bedeutet du erstellst erst ein SW4STM32 Projekt?

von Stefan ⛄ F. (stefanus)


Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
> Wie bekommst du eigentlich das CubeMX Projekt in SW4STM32?
> Irgendwie mit kopieren oder importieren?

Das macht er ganz automatisch. Siehe Bilder.

Ansonsten kann man Projekte in der Eclipse basierten IDE im Datei Menü 
"Importieren".

von pegel (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Darauf wollte ich hinaus.

Wenn er erst in SW4STM32 ein Projekt anlegt, muss er alles zwei mal 
auswählen.

Beim Importieren kommen die Einstellungen mit.
So hätte er auch gemerkt, dass nach der Fehlermeldung oben kein Projekt 
erstellt wurde, da es nicht in der Import List erscheint.

von Glossar (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Das Projekt wird durchaus erstellt und funktioniert problemlos.

Nur die Vectortable wird anscheinend nicht korrekt erstellt.
Peripherie etc. wird alles korrekt konfiguriert.

von pegel (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Glossar schrieb:
> Das Projekt wird durchaus erstellt

Von wem?
SW4STM32 oder CubeMX?

von Glossar (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Alles geklärt Freunde.

Das Problem war die Vector Tabelle.

Ich habe nun mit CubeMX ein neues Projekt mit korrektem Namen angelegt 
und von dort das start_stm32.s Assembler File in mein Projekt kopiert.

Ich danke euch vielmals!

von Glossar (Gast)


Bewertung
0 lesenswert
nicht lesenswert
@Pegeal

Das CubeMX Projekt wird trotz der Fehlermeldung erstellt und für die 
Peripherie und alles andere der korretke Code erstellt. Aus diesem Grund 
habe ich die Fehlermeldung ignoriert ohne zu wissen, dass meine Vector 
Table aus diesem Grund nicht mit der korrekten durch CubeMX ersezt 
wurde.

Die Vector Table, welche ich gepostet habe, wurde von SW4STM32 erstellt 
und ist generic (steht sogar).

Nun klappt alles.

von pegel (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Wenn ich direkt dein originales Projekt vergleiche, fehlen bei dem mit 
der Fehlermeldung:

startup/startup_stm32f051x8.s
.project .cproject und STM32F051K6Ux_FLASH.ld

Natürlich auch die Doku wenn man die erstellt hat.

von Glossar (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Ich habe nun ein neues SW4STM32 Projekt mit anderem Namen erstellt und 
auch ein neues CubeMX Projekt Ohne AC6 im Namen.

Die obige Fehlermeldung erscheint trotzdem.

Also ist deiner Meinung nach der korrekte Weg für CubeMX und SW4STM32 
immer zuerst ein CubeMX Projekt zu erstellen und dies dann in SW4STM32 
zu importieren?

Was ist, wenn man im CubeMX Projekt eine Änderung machen muss? Wie 
bekommt man die dann in da SW4STM32 Projekt, ohne ein neues Projekt zur 
erstellen?

von pegel (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Nehmen wir ein Blinky im workspace-F051

So mache ich das:

***************************
CubeMX -> neues Projekt -> alles einstellen -> Speichern:
workspace-F051 -> Ordner Blinky anlegen, darin Blinky.ioc speichern.
SW4STM32 Projekt erstellen, Doku erstellen
CubeMX schliessen.

***************************
SW4STM32 starten mit workspace-F051
Importieren aus workspace-F051
es erscheinen Projekte in der Liste
Projekt auswählen -> importieren
testen: main.c öffnen compilieren

***************************
soll noch einmal CubeMX benutzt werden, passen die Ordner so

***************************
wurden in CubeMX Dateinamen ergänzt, danach in SW4STM32
Index -> Rebuild ausführen.

von Glossar (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Hi pegel

Ich habe nun ebenfalls diesen Weg verwendet, funktioniert sehr gut und 
ohne Fehlermeldung.

Vielen herzlichen Dank für deine Hilfe.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.