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