Forum: Mikrocontroller und Digitale Elektronik STM32F0 HardFault bei UART Empfang


von Glossar (Gast)


Angehängte Dateien:

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)


Lesenswert?

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

von Jim M. (turboj)


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)


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)


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)


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)


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)


Lesenswert?

Vielleicht mal da nachschauen:

Beitrag "STM32 - BusFault finden"

von Glossar (Gast)


Angehängte Dateien:

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:

Lesenswert?

Vector Table

von Mike R. (thesealion)


Lesenswert?

Und wie soll der arme Controller bei der Vector Tabelle den USART 
Interrupt finden?

von pegel (Gast)


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)


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:

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)


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)


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)


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. (Gast)


Angehängte Dateien:

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)


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)


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)


Lesenswert?

Glossar schrieb:
> Das Projekt wird durchaus erstellt

Von wem?
SW4STM32 oder CubeMX?

von Glossar (Gast)


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)


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)


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)


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)


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)


Lesenswert?

Hi pegel

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

Vielen herzlichen Dank für deine Hilfe.

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.