- MultiPlus Wechselrichter Insel und Nulleinspeisung Conrad         
Ergebnis 1 bis 8 von 8

Thema: STM32 - Interrupts

  1. #1
    Erfahrener Benutzer Roboter Genie Avatar von White_Fox
    Registriert seit
    04.10.2011
    Beiträge
    1.473

    STM32 - Interrupts

    Anzeige

    Powerstation Test
    Ave

    Ich bin grad dabei, mich mal mit richtig mit Interrupts beim STm32 auseinander zu setzen.

    Der STm32 hat ja keine interrupt-Vektoren mehr wie der AVR (wo der Interrupt zu einem Sprungbefehl führt, sondern springt die jeweilige Adresse direkt an.

    Jetzt wollte ich mal gerne wissen wie ich das in C umsetze. Ich kann ja schlecht eine Adresse irgendwo in meinen Code reinknallen. Im Netz finde ich nur Beispiele mit der Standard-Bibliothek (die mir zudem auch nicht gerade einleuchten), ich arbeite aber nur mit den Registern. Hat da jemand vielleicht irgendein Beispiel?

  2. #2
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    03.09.2009
    Ort
    Berlin (Mariendorf)
    Beiträge
    1.023
    Zitat Zitat von White_Fox Beitrag anzeigen
    Der STm32 hat ja keine interrupt-Vektoren mehr wie der AVR (wo der Interrupt zu einem Sprungbefehl führt, sondern springt die jeweilige Adresse direkt an.
    Irgendwo muss doch der Ort der Service Routine bzw. deren Startadresse fix hinterlegt sein oder vom Programm bestimmt werden. Wie ist das denn im STm32 technisch gelöst? Ohne Adresssprung geht das doch irgendwie nicht, oder? Gibt es dort evtl. Register für die Sprungadressen anstelle der gewohnten im Code eingebetteten Sprungtabelle ?

  3. #3
    Hallo,

    um genau zu sein, möchtest du dich mit den Interrupts des CortexM auseinander setzen. Vielleicht hilft die Erkenntnis weiter?

    Sehr nützlich ist es auch sich das startup file des CortexM anzuschauen:
    https://github.com/Counterfeiter/ANN..._stm32f407xx.s

    Oben mal ein Beispiel aus einem beliebigen Projekt. Die Datei ist ein Template und fast bei jedem Projekt gleich aufgebaut.

    VG

    Basti

  4. #4
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    07.03.2011
    Beiträge
    1.899
    Ich kenne den STM nicht, aber eine kurze Google-Suche bringt follgendes zu Tage

    Derartige Funktionen sind als extern „C“ void zu deklarieren und besitzen fest vorgegebene Namen, die es dem Compiler ermöglichen, die ISR dem richtigen Interrupt zuzuordnen. Die Namen der Eventhandler folgen immer dem Muster Gerät_IRQHandler.
    Und als Beispiel:

    extern "C" void TIM7_IRQHandler() {

    Thats it. Das entspricht dem, was ich von anderen CPUs so kenne. In einem der Systemheader steht dann mehr zum jeweiligen Symbol (hier xxx_IRQHandler) und in einem Linkerfile etwas zu den absoluten Adressen. Den realen Mechanismus der jeweiligen CPU muß man eigentlich nicht kennen, C ist ja nicht Assembler.

    MfG Klebwax
    Strom fließt auch durch krumme Drähte !

  5. #5
    Erfahrener Benutzer Roboter Genie Avatar von White_Fox
    Registriert seit
    04.10.2011
    Beiträge
    1.473
    @Klebwax:
    Ich glaube, das von dir zitierte Beispiel kenne ich. Da wird mit der STL gearbeitet...das war der Grund, warum ich das nicht versucht habe nachzubauen.

    Ich hab in der stm32f446xx.h nichts gefunden, was irgendwie nach Interrupthandler aussieht.

  6. #6
    Wie gesagt, steht alles im startup-asm-file... Std-Perif. oder HAL-lib spielt keine Rolle.
    Die Einsprungadressen sind dann im Linker-File absolut definiert.

  7. #7
    Benutzer Stammmitglied
    Registriert seit
    19.05.2015
    Beiträge
    69
    White_fox, deinen Interrupthandler zu definieren geht so:

    Nehmen wir an du möchtest für dem TIM7 einen Handler schreiben.
    In deinem Projektordner befindet sich die Datei "startup_stm32f44axx.s", ja genau "*.s", eine Assembler Datei.
    In dieser Datei wird die Interrupt-Vektor-Tabelle definiert. Das ist eine Tabelle mit 96 Funktionszeigern vom Typ
    Code:
    void (*handler)(void);
    Also kein Rückgabewert und keine Parameter.

    Diese Namen, die in dieser Datei stehen, sind die Symbole die du suchst, für die du eine C-Funktion mit genau dem Namen einmal in deinem Code definieren mußt.
    Für Timer 7 schreibst du z.B. in deine "main.c"
    Code:
    void TIM7_IRQHandler(void) {
      /* dein Code */
    }
    Wie wird das jetzt aufgelößt beim Build?

    Zuerst macht der Assembler aus der startup Datei eine Objekt-Datei. In dieser *.o steht jetzt in der Symboltabelle das Symbol "TIM7_IRQHandler". Das Besondere ist, dass dieses Symbol als schwach (weak) markiert ist.
    Der Compiler übersetzt nun deine "main.c" und macht daraus "main.o". In der Symboltabelle dieser Datei befindet sich ebenfalls das Symbol "TIM7_IRQHandler" - aber - dieses ist _nicht_ als schwach makiert.
    Jetzt baut der Linker aus beiden "*.o"-Dateien eine Datei zusammen und muss die Symbole auflösen. Dabei stösst er auf die Tatsache, dass es zweimal das Symbol "TIM7_IRQHandler" gibt. Normalerweise ist das ein Konflikt, der zu einem Fehler führt. Hier aber kommt die schwache Markierung aus der ersten Objektdatei ins Spiel: Das erste Symbol aus "startup_stm32f446xx.o" wird durch das Symbol aus deiner "main.o" ersetzt. Sprich deine Funktion überschreibt die schwächere Definition aus der "startup_stm32f446xx.s".

    Für andere Handler schaust du in Zukunft in die Tabelle von "startup_stm32f446xx.s" rein, nimmst den Symbolnamen und schreibst dafür eine C-Funktion mit genau diesem Namen.

    Gruss botty
    Geändert von botty (01.11.2016 um 10:15 Uhr)

  8. #8
    Erfahrener Benutzer Roboter Genie Avatar von White_Fox
    Registriert seit
    04.10.2011
    Beiträge
    1.473
    Vielen Dank für die ausführliche Erklärung, botty. Das hat mir letzte Woche doch ein wenig was klarer werden lassen. .)

Ähnliche Themen

  1. RC Transmitter auf stm32 Basis
    Von The Man im Forum Vorstellungen+Bilder von fertigen Projekten/Bots
    Antworten: 1
    Letzter Beitrag: 07.09.2014, 19:28
  2. STM32 + Kamera
    Von Wsk8 im Forum ARM - 32-bit-Mikrocontroller-Architektur
    Antworten: 15
    Letzter Beitrag: 11.03.2014, 21:26
  3. sind ALLE Interrupts wieder ON nach Enable Interrupts?
    Von sBronco im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 2
    Letzter Beitrag: 19.07.2011, 15:58
  4. stm32 discovery
    Von drew im Forum ARM - 32-bit-Mikrocontroller-Architektur
    Antworten: 17
    Letzter Beitrag: 07.04.2011, 17:55
  5. STM32 + blinkende LED
    Von Mountainking im Forum Konstruktion/CAD/3D-Druck/Sketchup und Platinenlayout Eagle & Fritzing u.a.
    Antworten: 41
    Letzter Beitrag: 11.11.2009, 15:48

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

12V Akku bauen