STM32F0 HardFault bei UART Empfang

Gast #5281895
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!
Angehängte Dateien:
#5281976
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...
Gast #5281995
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!)
Gast #5282060
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.
Gast #5283965
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).
Angehängte Dateien:
Gast #5284047
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.
Gast #5284092
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!
Angehängte Dateien:
Gast #5284105
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.
Gast #5284132
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.
Gast #5284159
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!
Gast #5284160
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.
Gast #5284172
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.
Gast #5284191
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?
Gast #5284202
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.

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