STM32 EXTI Modul

OP #6928881
Irgendwie habe ich noch nicht ganz gerafft wie man den EXTI richtig 
konfiguriert.

Aktuell verstehe ich das so ->
1
/*
2
* SYSCFG->EXTICR[0] = PORTA0, PORTB0, PORTC0, PORTD0, PORTF0
3
* SYSCFG->EXTICR[1] = PORTA1, PORTB1, PORTC1, PORTD1, PORTF1
4
* SYSCFG->EXTICR[2] = PORTA2, PORTB2, PORTC2, PORTD2, PORTF2
5
* SYSCFG->EXTICR[3] = PORTA3, PORTB3, PORTC3, PORTD3, PORTF3
6
*/

Laut dem Bild (Auszug aus dem Datenblatt 
(https://www.mouser.de/datasheet/2/389/dm00088500-1797910.pdf) ) sind in 
diesen 4 Register jeweils die IRQ Lines von den jeweiligen Pins wie im 
Code zu sehen vorhanden.

Was ist mit den anderen "PORTA4..PORTA15" usw.

Werden diese im EXTI Modul vorher maskiert? so das die IRQs in den 
EXTICR[0..3} dann Variable sind?!
Angehängte Dateien:
Gast
Du musst ins Referenzhandbuch schauen.
https://www.st.com/resource/en/reference_manual/dm00091010-stm32f030x4x6x8xc-and-stm32f070x6xb-advanced-armbased-32bit-mcus-stmicroelectronics.pdf#page=147

Das EXTICR1 Register ist für die Port Pins 0-3.
Das EXTICR2 Register ist für die Port Pins 4-7.
Das EXTICR3 Register ist für die Port Pins 8-11.
Das EXTICR4 Register ist für die Port Pins 12-15.
OP
Stefan ⛄ F. schrieb:
> Du musst ins Referenzhandbuch schauen.
> 
https://www.st.com/resource/en/reference_manual/dm00091010-stm32f030x4x6x8xc-and-stm32f070x6xb-advanced-armbased-32bit-mcus-stmicroelectronics.pdf#page=147
>
Sorry das verlinkte Blatt war ja auch nur das normale Chip Datenblatt. 
Das andere habe ich auch.

> Das EXTICR1 Register ist für die Port Pins 0-3.
Genau so habe ich das auch verstanden. Das sind dann die Pins von 
GPIOA-F
oder?.

> Das EXTICR2 Register ist für die Port Pins 4-7.
hier dann natürlich auch von GPIOA-F..
> Das EXTICR3 Register ist für die Port Pins 8-11.
..
> Das EXTICR4 Register ist für die Port Pins 12-15
..
OP
1
Bits 15:0 EXTIx[3:0]: EXTI x configuration bits (x = 0 to 3)
2
These bits are written by software to select the source input for the EXTIx external interrupt.
3
x000: PA[x] pin
4
x001: PB[x] pin
5
x010: PC[x] pin
6
x011: PD[x] pin
7
x100: Reserved
8
x101: PF[x] pin
9
other configurations: reserved
Das heißt im Endeffekt das ich hier jeweils von GPIOx Pin 0..3 als 
Quelle auswählen kann und dann in der ISR entsprechend prüfen muss 
welcher ausgelöst hat?.

Und was stelle ich dann in dem Interrupt mask register (EXTI_IMR) genau 
ein?.
Gast
Jan H. schrieb:
>> Das EXTICR1 Register ist für die Port Pins 0-3.
> Genau so habe ich das auch verstanden. Das sind dann die Pins von
> GPIOA-F oder?

Ja. Jedes Bit steht für einen I/O Pin, aber nicht einfach 1:1 zugeordnet 
(1 Register = 1 Port). Das wäre ja zu einfach, wer das will muss zu AVR 
wechseln :-)
Gast
Ich verstehe die Frage nicht. In den vier Registern gibt es für jeden 
I/O Pin ein entsprechendes Bit.

Das EXTICR1 Register ist für die Port Pins 0-3.
Das EXTICR2 Register ist für die Port Pins 4-7.
Das EXTICR3 Register ist für die Port Pins 8-11.
Das EXTICR4 Register ist für die Port Pins 12-15.

Wo ist jetzt dein Problem?
OP
Stefan ⛄ F. schrieb:
> Ich verstehe die Frage nicht. In den vier Registern gibt es für
> jeden
> I/O Pin ein entsprechendes Bit.
>
> Das EXTICR1 Register ist für die Port Pins 0-3.
> Das EXTICR2 Register ist für die Port Pins 4-7.
> Das EXTICR3 Register ist für die Port Pins 8-11.
> Das EXTICR4 Register ist für die Port Pins 12-15.
>
> Wo ist jetzt dein Problem?

Es gibt ja GPIOA, GPIOB, GPIOC, GPIOD, GPIOF. Das sind 5 Ports.
Das Register SYSCFG_EXTICR1 hat jeweils EXTI0..EXTI3 mit jeweils 4 Bit.

Da raffe ich noch nicht ganz wie ich die Pins [0..3] von den 5 Ports 
unterbringen kann.

Ja ich stehe auf dem Schlauch...
Angehängte Dateien:
Gast
Jan H. schrieb:
> Da raffe ich noch nicht ganz wie ich die Pins [0..3] von den 5 Ports
> unterbringen kann.

Das EXTICR1 Register verbindet die Interrupts EXTI 0 bis 3 mit jeweils 
einem I/O Pin:

EXTI0 ist für Pin 0 von einem frei wählbaren Port.
EXTI1 ist für Pin 1 von einem frei wählbaren Port.
EXTI2 ist für Pin 2 von einem frei wählbaren Port.
EXTI3 ist für Pin 3 von einem frei wählbaren Port.

Das EXTICR2 Register verbindet die Interrupts EXTI 4 bis 7 mit jeweils 
einem I/O Pin:

EXTI4 ist für Pin 4 von einem frei wählbaren Port.
EXTI5 ist für Pin 5 von einem frei wählbaren Port.
EXTI6 ist für Pin 6 von einem frei wählbaren Port.
EXTI7 ist für Pin 7 von einem frei wählbaren Port.

Das EXTICR3 Register verbindet die Interrupts EXTI 8 bis 11 mit jeweils 
einem I/O Pin:

EXTI8 ist für Pin 8 von einem frei wählbaren Port.
EXTI9 ist für Pin 9 von einem frei wählbaren Port.
EXTI10 ist für Pin 10 von einem frei wählbaren Port.
EXTI11 ist für Pin 11 von einem frei wählbaren Port.

Das EXTICR4 Register verbindet die Interrupts EXTI 12 bis 15 mit jeweils 
einem I/O Pin:

EXTI12 ist für Pin 12 von einem frei wählbaren Port.
EXTI13 ist für Pin 13 von einem frei wählbaren Port.
EXTI14 ist für Pin 14 von einem frei wählbaren Port.
EXTI15 ist für Pin 15 von einem frei wählbaren Port.

Jeder der 16 Interrupts kann nur mit der jeweils gleichen Pin Nummer 
eines beliebigen Portes verbunden werden. Wenn du PB5 mit EXTI5 
verbunden hast, dann kannst du Pin 5 der anderen ports nicht mit EXTI 
verbinden, weil EXTI5 schon belegt ist.
Gast
Das ist ganz einfach ein Multiplexer. Tabellarisch dargestellt:
1
Interrupt   Port
2
EXTI0       PA0   PB0   PC0   PD0   PF0 
3
EXTI1       PA1   PB1   PC1   PD1   PF1 
4
EXTI2       PA2   PB2   PC2   PD2   PF2
5
EXTI3       PA3   PB3   PC3   PD3   PF3
6
EXTI4       PA4   PB4   PC4   PD4   PF4
7
...
8
EXTI15      PA15  PB15  PC15  PD15  PF15

In jeder Reihe darfst du dir einen Port aussuchen, mit dem der 
Interrupt-Kanal verbunden werden soll. Kreuze an was du brauchst, dann 
weißt du welche Bits du setzen musst.
OP
Stefan ⛄ F. schrieb:
> Das ist ganz einfach ein Multiplexer. Tabellarisch dargestellt:
> Interrupt   Port
> EXTI0       PA0   PB0   PC0   PD0   PF0
> EXTI1       PA1   PB1   PC1   PD1   PF1
> EXTI2       PA2   PB2   PC2   PD2   PF2
> EXTI3       PA3   PB3   PC3   PD3   PF3
> EXTI4       PA4   PB4   PC4   PD4   PF4
> ...
> EXTI15      PA15  PB15  PC15  PD15  PF15
>
> In jeder Reihe darfst du dir einen Port aussuchen, mit dem der
> Interrupt-Kanal verbunden werden soll.

Das hast Du sehr gut erklärt das habe ich jetzt verstanden.

Der Code ab 113 dort wird auch der EXTI konfiguriert. Aber ist dieser 
Code nicht falsch?.
https://gitlab.com/rjesse/mcal-stm/-/blob/master/MCAL/Src/mcalEXTI.c#L130

Insbesondere:
1
        case PIN0:
2
        case PIN1:
3
        case PIN2:
4
        case PIN3:
5
            shift = pin * 4;        // Every pin uses four bits
6
            index = 0;              // Set the array-index of SYSCFG->EXTICR[]
7
            break;
Wenn man es einmal weiß ist es logisch, aber das Degenblatt ist aber in 
dieser Stelle schwer zu lesen.

Das Bit 3 wird überall ignoriert es kann 1 oder 0 sein, es werden für 
die Portauswahl nur die Bits 2 bis 0 ausgewertet.
1
Bits 15:0 EXTIx[3:0]: EXTI x configuration bits (x = 0 to 3)
2
These bits are written by software to select the source input for the EXTIx external interrupt.
3
x000: PA[x] pin
4
x001: PB[x] pin
5
x010: PC[x] pin
6
x011: PD[x] pin
7
x100: Reserved
8
x101: PF[x] pin
9
other configurations: reserved

Das 'x' in den Eckigen Klammer  bezieht sich oben auf das EXTIx nicht 
auf das x vor den 3 Bits
Gast
Jan H. schrieb:
> Wenn ich jetzt PIND2 als Interrupt nehmen möchte,
> muss ich das wie folgt machen:
> SYSCFG->EXTICR1 |= 0b0010 << 8;
> richtig?.

Pin 2 kann bei allen Ports nur mit EXTI2 verbunden werden. 8x schieben 
ist daher richtig.

Aber der Wert 0b0010 verbindet Port C2 mit EXTI2. Für Port B musst du 
den Wert 0x0011 hinein schreiben.
OP
Stefan ⛄ F. schrieb:
> Jan H. schrieb:
>> Wenn ich jetzt PIND2 als Interrupt nehmen möchte,
>> muss ich das wie folgt machen:
>> SYSCFG->EXTICR1 |= 0b0010 << 8;
>> richtig?.
>
> Pin 2 kann bei allen Ports nur mit EXTI2 verbunden werden. 8x schieben
> ist daher richtig.
>
> Aber der Wert 0b0010 verbindet Port C2 mit EXTI2. Für Port B musst du
> den Wert 0x0011 hinein schreiben.

Ja genau =)
OP
Stefan ⛄ F. schrieb:
> Jan H. schrieb:
>> Der Code ab 113 dort wird auch der EXTI konfiguriert. Aber ist dieser
>> Code nicht falsch?.
>
> Nein, der ist in Ordnung. Spiele das mal mit allen PIN Nummern durch und
> schaue, welche Bits gesetzt werden.

Okay. Jetzt habe ich es auch verstanden.
Das ihr euch da immer so schnell reindenken könnt ist ja Wahnsinn!
Danke für eure Hilfe.
Gast
Jan H. schrieb:
> Das ihr euch da immer so schnell reindenken könnt ist ja Wahnsinn!

Da ging es mir nicht anders als dir. Ich habe diese Rätselstunde bloss 
schon hinter mir. Das schöne ist, das ganz viele STM32 Modelle dem 
gleichen Muster folgen.

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 4 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.