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!
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...
> 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
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!)
Zeig mal deine Interrupt Vektortabelle.
Wahrscheinlich fehlen da die Peripherie-spezifischen Interrupts und sind
standardmäßig alle auf den HardFault gemappt.
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.
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).
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.
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.
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!
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?
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.
Glossar schrieb:> Beim Anlegen des CubeMX Projektes kannst du den Pfad zum SW4STM32> Projekt angeben.
Das bedeutet du erstellst erst ein SW4STM32 Projekt?
> 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".
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.
Das Projekt wird durchaus erstellt und funktioniert problemlos.
Nur die Vectortable wird anscheinend nicht korrekt erstellt.
Peripherie etc. wird alles korrekt konfiguriert.
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!
@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.
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.
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?
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.
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