Forum: Mikrocontroller und Digitale Elektronik STM32 InterruptRoutine ausführen


von Matze T. (gruetzwurschd)


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 !

von Matze T. (gruetzwurschd)


Lesenswert?

Keiner ne Idee??

von (prx) A. K. (prx)


Lesenswert?

Mapfile? Der Linker müsste es dann ja geschafft haben, den exakt 
gleichen Namen zweimal mit zwei verschiedenen Adressen zu vergeben.

von Matze T. (gruetzwurschd)


Lesenswert?

Hi,

also keine ahnung, ich dachte das mit dem Mapfile etc. übernimmt 
komplett die IDE für mich oder? Ich benutze Rowley CrossWorks.

Gruß Tarkan

von Matze T. (gruetzwurschd)


Lesenswert?

Mag vielleicht eine dumme frage sein, aber kann es sein, dass man ISR 
garnihct debuggen kann?

von (prx) A. K. (prx)


Lesenswert?

Es geht darum, ein Mapfile zu produzieren und dort mal reinzusehen.

von (prx) A. K. (prx)


Lesenswert?

Tarkan D. schrieb:

> Mag vielleicht eine dumme frage sein, aber kann es sein, dass man ISR
> garnihct debuggen kann?

Man kann.

von Matze T. (gruetzwurschd)


Lesenswert?

Ich hab ein Mapfile gefunden, was genau müsste da dann drin stehen?

von (prx) A. K. (prx)


Lesenswert?

Die Liste der Daten und Funktionen, die der Linker für würdig erachtete, 
deiner Anwendung zuzuordnen, mitsamt Adressen. Schieb das hier mal rein.

von Matze T. (gruetzwurschd)


Angehängte Dateien:

Lesenswert?

mir ist ein kleiner fehler unterlaufen. hier nochmal die richtige datei 
:)

von (prx) A. K. (prx)


Lesenswert?

Wär besser, du übersetzt die Funktion als C-Funktion, nicht C++.
Wenn das nicht Absicht war: grosses ".C" ist C++.

Woran man das sieht:
                0x08000294                EXTI15_10_IRQHandler
                0x080003dc                EXTI15_10_IRQHandler()

von Matze T. (gruetzwurschd)


Lesenswert?

lässt sich das nihct als c++ datei bewekstelligen?

von (prx) A. K. (prx)


Lesenswert?

extern "C" {

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

}

von Matze T. (gruetzwurschd)


Lesenswert?

optimal, das geht. herzlichen dank. :)

das heißt aber im umkehrschluss, es gibt immer probleme mit interrupts 
und c++ oder?

von (prx) A. K. (prx)


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.

von Matze T. (gruetzwurschd)


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.

von (prx) A. K. (prx)


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.

von (prx) A. K. (prx)


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
}

von Matze T. (gruetzwurschd)


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

von (prx) A. K. (prx)


Lesenswert?

Geht in dieser Form nicht. Das müsste sich aber mit meinem zweiten 
Beispiel erledigen lassen.

von Matze T. (gruetzwurschd)


Lesenswert?

was hat das "virtual" zu sagen?

von (prx) A. K. (prx)


Lesenswert?

Tarkan D. schrieb:

> was hat das "virtual" zu sagen?

Schlag dein C++ Buch auf, steht im Index unter "V".
Sorry, aber einen C++ Kurs werde ich hier nicht halten.

von Matze T. (gruetzwurschd)


Lesenswert?

dachte nur das wäre etwas was wieder mal microcontroller-c++ ist :)

naja trotzdem danke für die viele Hilfe :)

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.