STM32 InterruptRoutine ausführen

OP #2117061
Lesenswert?

Hallo Leute,

ich melde mich mal wieder mit folgendem Problem zu Wort:
Derzeit bin ich mit externen Interrupts auf einem STM32F103ZE am 
werkeln.

Hintergrund ist, ich möchte auf dem Evalboard einen Interrupt mittels 
einer Taste auslösen. Es funktioniert auch soweit. Nur leider Springt 
das Programm sobald ich die Taste drücke auf den DEFAULT_ISR_HANDLER 
aber nihct in die interrupt routine. Ich hoffe mir kann mal kurz jemand 
über meinen Quelltest schauen und mir einen Tip geben (ist alles zum 
testen quick and dirty geschrieben!).
1
void externalInterruptInit()
2
{
3
 GPIO_InitTypeDef GPIO_InitStructure;
4
 EXTI_InitTypeDef EXTI_InitStructure;
5
 NVIC_InitTypeDef NVIC_InitStructure;
6

7
  /* Enable the BUTTON Clock */
8
   RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOG | RCC_APB2Periph_AFIO, ENABLE);
9

10
  /* Configure Button pin as input floating */
11
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
12
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_15;
13
  GPIO_Init(GPIOG, &GPIO_InitStructure);
14

15

16
    /* Connect Button EXTI Line to Button GPIO Pin */
17
    GPIO_EXTILineConfig(GPIO_PortSourceGPIOG, GPIO_PinSource15);
18

19
   /* Configure Button EXTI line */
20
   EXTI_InitStructure.EXTI_Line = EXTI_Line15;
21
   EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
22

23
    EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;  
24

25
    EXTI_InitStructure.EXTI_LineCmd = ENABLE;
26
    EXTI_Init(&EXTI_InitStructure);
27

28
   /* Enable and set Button EXTI Interrupt to the lowest priority */
29
    NVIC_InitStructure.NVIC_IRQChannel = EXTI15_10_IRQn;
30
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x0A;
31
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x0A;
32
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
33

34
     NVIC_Init(&NVIC_InitStructure); 
35
  }
36

37

38
void EXTI15_10_IRQHandler(void)
39
   {
40
     unsigned char test;
41
     test=1;  //leider kommt das programm hier nie vorbei :(
42
   };

Leider Springt das programm hier her und bleibt dort stehen wenn ich die 
taste drücke:
1
DEFAULT_ISR_HANDLER EXTI15_10_IRQHandler  //diese Zeile befindet sich in der STM32F10x_Startup.s

Grüße Tarkan :)

PS: laut dissassembly wird die Routine auch nicht wegoptimiert !
#2117515
Lesenswert?

Nur mit den Namen. Entscheidend ist, dass die Namen der Funktionen auf 
Linker-Ebene den Namen der Default-Handler entsprechen. In 
C++-Funktionen werden aber die Parameter-Typen in die Namen 
hineincodiert (name mangling). Daher geht das bei Handlern nicht ohne 
extern "C" { ... } ab.
OP #2117556
Lesenswert?

Da fällt mir noch eine zweite frage ein die ähnlich ist.

Gesetzt den fall ich hab zwei objekte, die das gleiche 
hardware-interface benutzten. und ich will sozusagen 2 verschiedene ISR 
für den gleichen IRQ. je nachdem welches objekt ich am programmstart 
aufgerufen habe.

ist das möglich dass man da 2 verschiedene ISR schreibt und dann je 
nachdem welches objekt initialisiert wurde wird die entsprechende ISR 
ausgeführt.
#2117563
Lesenswert?

Wenn du ein einziges Interface für 2 gleiche Hardwaremodule meinst, dann 
ungefähr so:
1
class USART {
2
   ....
3
   void IntHandler();
4
};
5

6
class USART *usartObjects[];
7

8
extern "C" {
9
void USART1_IRQHandler(void) { usartObjects[0]->IntHandler(); }
10
void USART2_IRQHandler(void) { usartObjects[1]->IntHandler(); }
11
}
Andernfalls habe ich die Frage nicht verstanden.
#2117575
Lesenswert?

Vielleicht meinst du sowas:
1
class Base {
2
   virtual void IntHandler() = 0;
3
};
4
class Derived1 : Base {
5
   virtual void IntHandler();
6
};
7
class Derived2 : Base {
8
   virtual void IntHandler();
9
};
10

11
Base *baseObject;
12

13
extern "C" {
14
void Device_IRQHandler(void) { baseObject->IntHandler(); }
15
}
OP #2117588
Lesenswert?

Ich meinte eher so:
1
class usart_irgendwas
2
{
3
  extern "C" {
4
    void USART1_IRQHandler(void) { blabla(); }
5
  }
6
}
7

8
class usart_irgendwasAnderes
9
{
10
  extern "C" {
11
    void USART1_IRQHandler(void) { blabla();
12
                                   undNochMehrBlaBla();
13
                                 }
14
  }
15
}
16

17

18
int main()
19
{
20
if(irgendwasTrifftZu)
21
  {
22
    usart_irgendwas irgendwas;
23
  
24
  };
25

26
if(!irgendwasTrifftZu)
27
  {
28
    usart_irgendwasAnderes irgendwas;
29
  
30
  };
31

32
}

zugegeben, das beispiel ist sehr bizarr :D

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