Forum: Mikrocontroller und Digitale Elektronik STM32F207 GPIO Interrupt


von mimi m. (Firma: mumu) (ysp)


Lesenswert?

Hey, ich mache gerade meine ersten Gehversuche mit meinem STM32.

Kann mir jemand mit Interrupts helfen?

Ich möchte gerne einen Interrupt auf den Pin PC13 legen. So das bei 
Tastendruck

NVIC-EnableIRQ(EXTI15_10_IRQn) {} //activate interrupt

und die Funktion:

void EXTI15_10_IRQHandler(void) {}

Kann mir jemand sagen was da noch fehlt???

Danke

von holger (Gast)


Lesenswert?

NVIC-EnableIRQ(EXTI15_10_IRQn) {} //activate interrupt

Das wird wohl lustige Compilermeldungen geben.

Zieh dir die Firmware Library für deinen STM32
bei ST. Da sind haufenweise Beispiele dabei.

von mimi m. (Firma: mumu) (ysp)


Lesenswert?

Durch die Eile passieren Fehler ;) Das sollte natürlich ganz anders 
lauten...


Ich würde mich bei der Programmierung gerne auf CMSIS beschränken. Gibt 
es hierfür auch Beispiele???


Könnte mir jemand ein GPIO Interrupt Beispiel, welches sich nur auf 
CMSIS beschränkt posten?

von holger (Gast)


Lesenswert?

>Ich würde mich bei der Programmierung gerne auf CMSIS beschränken. Gibt
>es hierfür auch Beispiele???
>Könnte mir jemand ein GPIO Interrupt Beispiel, welches sich nur auf
>CMSIS beschränkt posten?

Das kann niemand.

CMSIS Cortex-M3 Core Peripheral Access Layer Source File

CMSIS bezieht sich nur auf den reinen CPU Core und dessen
Register. Sagen wir einfach mal CPU Register und Systick.

Die Peripherie ist für jeden Hersteller anders.

von Reinhard B. (brainstorm)


Lesenswert?

mimi momo schrieb:
> Kann mir jemand sagen was da noch fehlt???

Kenne den F2 nicht, aber beim F1 musst du noch im AFIO_EXTICRx das 
mapping von den Ports zu den EXTIx lines einstellen. Px0 geht auf EXTI0, 
Px1 auf EXTI1, usw.

Beim STM32F1 wären also im AFIO_EXTICR4 die Bits 7:4 auf '0010' zu 
setzen, damit PC13 auf EXTI13 reroutet wird.

mfg

von Matthias S. (Firma: matzetronics) (mschoeldgen)


Lesenswert?

Hier mal was für GPIO C , Pin 3 . benutzt allerdings die FW library, 
ymmv . Vllt. hilfts ja trotzdem:
1
// aus 'setup.h'
2
/* Direction Command Pin */
3
#define DIRECTION_GPIO_CLK                    RCC_APB2Periph_GPIOC     
4
#define USER_GPIO_PORT            GPIOC
5
#define DIRECTION_COMMAND_PIN           GPIO_Pin_3
6
#define DIRECTION_EXTI_PORT_SOURCE      GPIO_PortSourceGPIOC
7
8
#define DIRECTION_EXTI_IRQn             EXTI3_IRQn
9
#define DIRECTION_EXTI_PIN_SOURCE       GPIO_PinSource3
10
#define DIRECTION_EXTI_LINE             EXTI_Line3
11
// aus 'main.c'
12
RCC_APB2PeriphClockCmd(DIRECTION_GPIO_CLK | RCC_APB2Periph_AFIO, ENABLE);
13
14
/* Configure Direction Switch EXTI line . Clocks laufen schon und der Port ist bereits input */
15
GPIO_EXTILineConfig(DIRECTION_EXTI_PORT_SOURCE, DIRECTION_EXTI_PIN_SOURCE);
16
EXTI_InitStructure.EXTI_Line = DIRECTION_EXTI_LINE;
17
EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
18
// wähle die gewünschte Flanke
19
EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising_Falling;
20
EXTI_InitStructure.EXTI_LineCmd = ENABLE;
21
EXTI_Init(&EXTI_InitStructure);
22
// damit er nicht gleich losfeuert
23
EXTI_ClearITPendingBit(DIRECTION_EXTI_LINE);
24
NVIC_InitStructure.NVIC_IRQChannel = DIRECTION_EXTI_IRQn;
25
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x01;
26
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x01;
27
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
28
NVIC_Init(&NVIC_InitStructure);
Und dann:
1
/*
2
*  Direction Switch IRQ
3
*/
4
void EXTI3_IRQHandler(void)
5
{
6
  if(EXTI_GetITStatus(DIRECTION_EXTI_LINE) != RESET)
7
  {
8
    /* Clear the EXTI line pending bit */
9
    EXTI_ClearITPendingBit(DIRECTION_EXTI_LINE);
10
    // Mach was im Interrupt
11
   }
12
}

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.