STM32 EXTI Modul

OP #6928881
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?!
Angehängte Dateien:
Gast #6928907
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.
OP #6928959
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
..
OP #6928963
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?.
Gast #6928980
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 :-)
Gast #6928989
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?
OP #6928995
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...
Angehängte Dateien:
Gast #6929008
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.
Gast #6929013
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.
OP #6929015
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;
#6929023
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
Gast #6929024
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.
OP #6929029
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 =)
OP #6929036
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren