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!
Hast du das Projekt mit CubeMX erstellt? Wenn ja, hänge mal die .ioc Datei an.
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).
Und wie soll der arme Controller bei der Vector Tabelle den USART Interrupt finden?
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.