28-Ext_Interrupt-Library (STM32F4)

Zum benutzen der 16 externen Interrupt-Lines für jeden Port, gibt es die EXT_INTx-Librarys.

Für die Interrupts 0 bis 4 gibt es je eine eigene LIB (0,1,2,3,4).
Für die Interrupts 5 bis 9 gibt es eine gemeinsame (5To9)
und für die Interrupts 10 bis 15 gibt es auch eine gemeinsame (10To15).

Beim STM32F4 kann man auf EXT_INT0 die Port-Pins PA0,PB0,PC0,PD0 usw legen,
auf EXT_INT1 kann man PA1,PB1,PC1,PD1 legen das geht so weiter bis EXT_INT15.
Man darf aber nicht mehrere Pins auf die gleiche Interrupt-Line legen. (z.B. PB2 und PC2 geht nicht gleichzeitig)

Im C-File kann man festlegen welchen Port-Pin man benutzen will und auf welche Flanke man triggern will. Es gibt eine Funktion zum initialisieren und für jeden Interrupt je zwei User Funktionen “P_EXT_INTx_LoFlanke()” und “P_EXT_INTx_HiFlanke” in denen man seinen eigenen Code reinschreiben muss, was bei einem Interrupt passieren soll.

Voraussetzungen :

1
2
Benutzte Module der CooCox-IDE : GPIO, EXTI, SYSCFG, MISC
Benutzte Librarys : keine

Funktionen (für EXT-INT0):

1
void UB_Ext_INT0_Init(void); // zum initialisieren

Beispiel (Main) :

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
//--------------------------------------------------------------
// File     : main.c
// Datum    : 01.04.2013
// Version  : 1.0
// Autor    : UB
// EMail    : mc-4u(@)t-online.de
// Web      : www.mikrocontroller-4u.de
// CPU      : STM32F4
// IDE      : CooCox CoIDE 1.7.0
// Module   : CMSIS_BOOT, M4_CMSIS_CORE
// Funktion : Demo der EXT-Interrupt-Library
// Hinweis  : Diese zwei Files muessen auf 8MHz stehen
//              "cmsis_boot/stm32f4xx.h"
//              "cmsis_boot/system_stm32f4xx.c"
//--------------------------------------------------------------
 
#include "main.h"
#include "stm32_ub_led.h"
#include "stm32_ub_ext_int0.h"
 
int main(void)
{
  SystemInit(); // Quarz Einstellungen aktivieren
 
  // init der LEDs
  UB_Led_Init();
 
  // init vom Ext-Interrupt-0
  UB_Ext_INT0_Init();
 
  while(1)
  {
    // Wenn der User-Button gedrückt wird (Hi-Flanke an PA0),
    // wird per ext-Int0 die grüne LED eingeschaltet
  }
}

Beispiel (Interrupt) :

1
2
3
4
5
6
7
8
9
10
11
12
#include "stm32_ub_led.h"
 
//--------------------------------------------------------------
// diese Funktion wird aufgerufen,
// bei einer Hi-Flanke am EXT-INT0
// wenn [EXTI_Trigger_Rising oder EXTI_Trigger_Rising_Falling]
//--------------------------------------------------------------
void P_EXT_INT0_HiFlanke(void)
{
  // hier eigenen Code eintragen
  UB_Led_On(LED_GREEN);
}

Hier die Library zum Download :

ub_stm32f4_ext_int_v100

Hier der komplette CooCox-Projektordner zum Download :

Demo_28_EXTI

17 Antworten auf 28-Ext_Interrupt-Library (STM32F4)

  1. Manuel sagt:

    Wie bzw.wozu kann ich die Interrupts benutzen?

    • admin_ub sagt:

      z.B. um auf einen externen Button zu reagiern. Dann muss dieser nicht ständig von der CPU gepollt werden ob er gedrückt ist, sondern man nutzt den EXTI z.B. auf Hi-Flanke und wenn man den Button dann drückt wird die ISR aufgerufen,egal was die CPU gerade macht.

  2. Manuel sagt:

    Also im Prinzip unterbreche ich damit den laufenden Prozess und nach der Funktion für den Button wird genau dort weitergemacht.
    Trifft das auch auf interne Buttons zu? Weil die meisten Programme verwenden einfach nur Funktionen ohne Interrupts … würde ja bei kleinen Funktionen wie dem Button der CPU nicht viel ausmachen oder?

    • admin_ub sagt:

      was ist den ein “interner” Button ?? Buttons sind immer extern. Und es kommt halt auf dein Programm an. Wenn du z.B. sehr schnell auf ein externes Ereignis reagieren musst ist es einfacher einmal einen Interrupt zu programmieren als überall im restlichen Programm den Status von dem Pin abzufragen und damit u.U. ein zu langes Delay zwischen Ereignis und Reaktion zu haben. Schau dir mal die PS2-Library an…die Daten der Tastatur kommen ja zu einem beliebigen Zeitpunkt und müssen sofort eingelesen werden, das ist eine tyische Anwendung für externe Interrupts.

  3. Manuel sagt:

    Ich meinte damit die beiden integrierten Buttons.

    Stimmt, ich müsste dann solange warten, bis die Schleife erneut durchlaufen wird.
    Aber Interrupts muss ich doch auch irgendwo im Code einbauen, dann muss ich doch trotzdem wArten, bis der vorherige Code abgearbeitet wird.

    • admin_ub sagt:

      nein, man muss nicht warten, das ist ja gerade der Sinn von Interrupts. Das programm wird unterbrochen egal wo es gerade ist. Und nach der ISR wird an der alten Stelle weitergemacht.

  4. Manuel sagt:

    UB_Ext_INT0_Init(); muss ich aber vor dem eigentliuchen Code in der while-Schleife eintragen oder? Es ist interessant zu sehen, dass obwohl ich mich in einer while-Schleife befinde, ich den Code trotzdem unterbrechend kann, sobald der Interrupt ausgelöst wurde :D

    • admin_ub sagt:

      auserhalb der while(1) … wie im Beispiel zu sehen ist, die Initialisierung darf nur einmal durchlaufen werden.

  5. Manuel sagt:

    Das ist genial. Also initialisiere die gewünschte Funktion oder auch mehrere Funktionen und überlasse es sozusagen dem Prozessor selbst zu reagieren bzw. die passende ISR zu wählen?

  6. Joerg B. sagt:

    Hallo Uwe,
    ich würde gerne eine Phasenanschnittsteuerung wie z.B. hier http://www.fritzler-avr.de/HP/tipps/dimm.php machen. Könntest du das portieren?

    Grüße

    Jörg

  7. gripper sagt:

    Kann man Interrupts auch erst ab einer bestimmten Stelle im Code beachten und sonst ignorieren. Also gibt es eine Funktion zum aktivieren und deaktivieren der ISR?

    • admin_ub sagt:

      ist google defekt ?

      __disable_irq();
      __enable_irq();

      • gripper sagt:

        Jo war grad down :D
        Ne hast recht. Trotzdem danke!

  8. Simon sagt:

    Hallo,
    ich versuche gerade einen Interrupt zu generiert, wenn das Signal am Port AO ändert. also Rising–> Falling oder umgekehrt.
    ich habe in EXTI_InitStructure mit folgendes EXTI_Trigger =EXTI_Trigger_Rising_Falling.
    probiert aber passiert nichts !!.
    hat jemanden vielleicht eine Idee?
    Grüße
    Simon

    • admin_ub sagt:

      Dein Fehler liegt in Zeile 42.

  9. Simon sagt:

    abgesehen von diesem Lib
    ich meinte wie kann man allgemein einen ISR aktivieren, wenn das Signal im Port ändert (entweder von Low –> Hig oder von Hig–> Low).

    • admin_ub sagt:

      du hast es doch schon geschrieben :
      “EXTI_InitStructure.EXTI_Trigger=EXTI_Trigger_Rising_Falling”
      das ist halt nur eine Zeile von ca. 20 die du brauchst
      (vergleich halt deinen Code mit meinem vom EXT_INT0)
      da wird irgendwo in den restlichen 19 Zeilen ein Fehler sein


Wie hat Dir dieser Artikel gefallen?

1 Stern2 Sterne3 Sterne4 Sterne5 Sterne (Noch keine Bewertungen)
Loading...

1 Antwort zu 28-Ext_Interrupt-Library (STM32F4)

  1. Nils sagt:

    Wie kann ich eine Variable aus der Main und Einen Counter aus der Main in dem Interrupt abfragen und überschreiben?

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert