www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik STM32 InterruptRoutine ausführen


Autor: Tarkan D. (gruetzwurschd)
Datum:

Bewertung
0 lesenswert
nicht 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!).
void externalInterruptInit()
{
 GPIO_InitTypeDef GPIO_InitStructure;
 EXTI_InitTypeDef EXTI_InitStructure;
 NVIC_InitTypeDef NVIC_InitStructure;

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

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


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

   /* Configure Button EXTI line */
   EXTI_InitStructure.EXTI_Line = EXTI_Line15;
   EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;

    EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;  

    EXTI_InitStructure.EXTI_LineCmd = ENABLE;
    EXTI_Init(&EXTI_InitStructure);

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

     NVIC_Init(&NVIC_InitStructure); 
  }


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



Leider Springt das programm hier her und bleibt dort stehen wenn ich die 
taste drücke:
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 !

Autor: Tarkan D. (gruetzwurschd)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Keiner ne Idee??

Autor: A. K. (prx)
Datum:

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

Autor: Tarkan D. (gruetzwurschd)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Tarkan D. (gruetzwurschd)
Datum:

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

Autor: A. K. (prx)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Es geht darum, ein Mapfile zu produzieren und dort mal reinzusehen.

Autor: A. K. (prx)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Tarkan D. schrieb:

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

Man kann.

Autor: Tarkan D. (gruetzwurschd)
Datum:

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

Autor: A. K. (prx)
Datum:

Bewertung
0 lesenswert
nicht 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.

Beitrag #2117457 wurde vom Autor gelöscht.
Autor: Tarkan D. (gruetzwurschd)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
mir ist ein kleiner fehler unterlaufen. hier nochmal die richtige datei 
:)

Autor: A. K. (prx)
Datum:

Bewertung
0 lesenswert
nicht 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()

Autor: Tarkan D. (gruetzwurschd)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
lässt sich das nihct als c++ datei bewekstelligen?

Autor: A. K. (prx)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
extern "C" {

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

}

Autor: Tarkan D. (gruetzwurschd)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
optimal, das geht. herzlichen dank. :)

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

Autor: A. K. (prx)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Tarkan D. (gruetzwurschd)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: A. K. (prx)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wenn du ein einziges Interface für 2 gleiche Hardwaremodule meinst, dann 
ungefähr so:
class USART {
   ....
   void IntHandler();
};

class USART *usartObjects[];

extern "C" {
void USART1_IRQHandler(void) { usartObjects[0]->IntHandler(); }
void USART2_IRQHandler(void) { usartObjects[1]->IntHandler(); }
}
Andernfalls habe ich die Frage nicht verstanden.

Autor: A. K. (prx)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Vielleicht meinst du sowas:
class Base {
   virtual void IntHandler() = 0;
};
class Derived1 : Base {
   virtual void IntHandler();
};
class Derived2 : Base {
   virtual void IntHandler();
};

Base *baseObject;

extern "C" {
void Device_IRQHandler(void) { baseObject->IntHandler(); }
}

Autor: Tarkan D. (gruetzwurschd)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich meinte eher so:

class usart_irgendwas
{
  extern "C" {
    void USART1_IRQHandler(void) { blabla(); }
  }
}

class usart_irgendwasAnderes
{
  extern "C" {
    void USART1_IRQHandler(void) { blabla();
                                   undNochMehrBlaBla();
                                 }
  }
}


int main()
{
if(irgendwasTrifftZu)
  {
    usart_irgendwas irgendwas;
  
  };

if(!irgendwasTrifftZu)
  {
    usart_irgendwasAnderes irgendwas;
  
  };

}


zugegeben, das beispiel ist sehr bizarr :D

Autor: A. K. (prx)
Datum:

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

Autor: Tarkan D. (gruetzwurschd)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
was hat das "virtual" zu sagen?

Autor: A. K. (prx)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Tarkan D. (gruetzwurschd)
Datum:

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

naja trotzdem danke für die viele Hilfe :)

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.