Interrupt Problem auf STM32 mit Display

#3595372
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!
#3595530
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   .
#3595696
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.
#3595736
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.

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