Forum: Mikrocontroller und Digitale Elektronik STM32 EXTI Modul


von Jan H. (janiiix3)


Angehängte Dateien:

Lesenswert?

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?!

von Stefan F. (Gast)


Lesenswert?

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.

von Jan H. (janiiix3)


Lesenswert?

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
..

von Jan H. (janiiix3)


Lesenswert?

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?.

: Bearbeitet durch User
von Stefan F. (Gast)


Lesenswert?

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 :-)

von Jan H. (janiiix3)


Lesenswert?

Kann ich dann im Register ->
1
SYSCFG->EXTICR1
Mich für 4 Ports endscheiden mit den jeweiligen Pins [0..3]?
Das Register hat ja nur EXTI0..3

von Stefan F. (Gast)


Lesenswert?

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?

von Jan H. (janiiix3)


Angehängte Dateien:

Lesenswert?

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...

von Stefan F. (Gast)


Lesenswert?

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.

von Jan H. (janiiix3)


Lesenswert?

Ahh okay, jetzt hat es klick gemacht glaube ich.
Ein Beispiel..

Wenn ich jetzt PIND2 als Interrupt nehmen möchte, muss ich das wie folgt 
machen:
1
SYSCFG->EXTICR1 |= 0b0010 << 8;

richtig?.

von Stefan F. (Gast)


Lesenswert?

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.

von Jan H. (janiiix3)


Lesenswert?

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;

: Bearbeitet durch User
von Christian K. (the_kirsch)


Lesenswert?

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

von Stefan F. (Gast)


Lesenswert?

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.

von Jan H. (janiiix3)


Lesenswert?

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 =)

von Stefan F. (Gast)


Lesenswert?

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.

von Stefan F. (Gast)


Lesenswert?

Jan H. schrieb:
> Für Port B musst du den Wert 0x0011 hinein schreiben.

Sorry, ich wolle Port D und 0b0011 schreiben.

von Jan H. (janiiix3)


Lesenswert?

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.

von Stefan F. (Gast)


Lesenswert?

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.

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
Noch kein Account? Hier anmelden.