Forum: Compiler & IDEs Interrupt Problem auf STM32 mit Display


von Lukas O. (lobermann)


Lesenswert?

Hallo Zusammen,

ich hoffe hier kann mir bei einem kleinen Problem weitergeholfen werden.
Ich verwende ein HY Mini STM32 (STM32F103_VCT6) mit Display und bin 
gerade dabei einen der USART einzubinden.
Nun habe ich das Problem, dass seit dem Einbinden des NVIC nach etwa 
einer Sekunde das Programm bei
1
DMA2_Channel4_5_IRQHandler
2
                B       .
stehen bleibt (im Debugger startup_stm32f10x_hd.s:324). Leider habe ich 
nicht die geringste Ahnung was hier Schuld ist bzw. was ich tun kann um 
das zu verhindern.

Hab das ganze Projekt auf GitHub 
https://github.com/lobermann/HYMini_STM32_MediaControlSystem/blob/master/MDK-ARM/main.cpp

Ohne TIM, NVIC und USART funktioniert alles wie es soll (siehe main).

Bin für jede Hilfe / Tipp dankbar!

von Jim M. (turboj)


Lesenswert?

Du hast den Handler für den Interrupt einfach nicht korrekt definiert.

Der sollte irgendwo im Code stehen:
1
void DMA2_Channel4_5_IRQHandler(void){
2
//TODO Interrupt flag löschen und Interrupt bearbeiten
3
}

Die default Handler haben meistens eine Endlosschleife eingebaut, damit 
man genau diesen Fehler erkennen kann. Die sieht in ARM Assembler halt 
so aus:
1
 B   .

von Lukas O. (lobermann)


Lesenswert?

Danke für die Hilfe.

Hatte jedoch vorher schon das hier definiert
1
extern "C" void DMA2_Channel4_5_IRQHandler()
2
{
3
4
}

und habs nun auf das hier angepasst und direkt vor die main gegeben
1
void DMA2_Channel4_5_IRQHandler(void)
2
{
3
  if(DMA_GetITStatus(DMA2_IT_HT4)) 
4
  {
5
    DMA_ClearITPendingBit(DMA2_IT_GL4);    //clear all the interrupts
6
  }
7
  if(DMA_GetITStatus(DMA2_IT_HT5)) 
8
  {
9
    DMA_ClearITPendingBit(DMA2_IT_GL5);    //clear all the interrupts
10
  }
11
}

er geht jedoch immer noch in den Standard interrupt handler. Nachdem im 
Standard ja jede menge interrupts auf den gleichen Handler gehen, kann 
es denk ich sein dass das gar nicht der interrupt ist den ich suche. 
Einen Tipp wie ich herausfinden kann welcher interrupt ausgelöst wurde? 
Verwende die Keil MDK und einen STLink v2.

#UPDATE

Das hat man davon wenn man sich das ganze aus codebeispielen zusammen 
sucht. Folgender Handler hatte gefehlt (auch in den beispielen von st 
..)
1
extern "C" void TIM2_IRQHandler()
2
{
3
  if (TIM_GetITStatus(TIM2, TIM_IT_Update) != RESET)
4
  {
5
    TIM_ClearITPendingBit(TIM2, TIM_IT_Update);
6
  }
7
}

Es würde mich jedoch trotzdem interessieren, nachdem ich mich ja in 
diesen Bereich für ein paar private Projekte einarbeite, was der beste 
weg ist in so einem Fall herauszufinden was für ein Interrupt ausgelöst 
wurde.

von holger (Gast)


Lesenswert?

>Folgender Handler hatte gefehlt (auch in den beispielen von st
>..)
>
>extern "C" void TIM2_IRQHandler()

Das ist ja seltsam. Du hast doch den TIM7 IRQ aktiviert.

von Lukas O. (lobermann)


Lesenswert?

Sorry, nachdem das mit dem DMA Handler nicht funktioniert hat, habe ich 
nochmals alles so zurück gestellt wie es in den Beispielen war. Da war 
TIM2 in Verwendung. Ich dachte da zuerst dass das Display nicht 
funktioniert da der selbe Interrupt verwendet wird wie für den USART. 
Deshalb die Änderung auf TIM7. Habe dann bei diesem online Beispiel 
(http://visualgdb.com/tutorials/arm/stm32/timers/) den Handler gefunden, 
welcher leider in den offiziellen Beispielen die bei dem Board dabei 
waren, fehlte.

Habe gerade den, endlich funktionierenden, Code ins git repo gepushd.

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.