Hallo Leute,
folgendes Problem.
Ich habe einen funktionierenden IRQHandler in der main.c definiert.
Der Ordnung halber möchte ich diesen aber in die stm32f4xx_it.c
verfrachten.
Wenn ich ihn dorthin kopiere und in der stm32f4xx_it.h deklariere,
dann funktioniert es nicht mehr. Der Interrupt wird nicht mehr
ausgelöst.
Im Debug-Modus finde ich keinen Hinweis darauf warum.
Meine Entwicklungsumgebung ist Keil.
Hat einer von eine Idee was dahinterstecken könnte?
Stephan K. schrieb:> Ich würde doch mal bei Keil nachfragen. Bei den Preisen ist denen> sicher an Kundenbindung gelegen.
Die können auch nichts dafür, wenn er den kram nicht richtig zusammen
packt. Es wird bestimmt aus einem anderen Verzeichnis etwas eingebunden.
Er hat nur den Überblick verloren.
Stephan K. schrieb:
> Ich würde doch mal bei Keil nachfragen.> Bei den Preisen ist denen sicher an Kundenbindung gelegen.
Bis 32kb Code ist Keil kostenlos, wenn man es nicht kommerziell
nutzen möchte.
???????? schrieb:
> Stephan K. schrieb:>> Ich würde doch mal bei Keil nachfragen. Bei den Preisen ist denen>> sicher an Kundenbindung gelegen.>> Die können auch nichts dafür, wenn er den kram nicht richtig zusammen> packt. Es wird bestimmt aus einem anderen Verzeichnis etwas eingebunden.> Er hat nur den Überblick verloren.
Erstaunlich, wie man einen Beitrag wieder sinnlos aufblähen kann.
Gerade wegen solcher sinnlosen Kommentare ist es immer schwer eine
Lösung zu finden, weil man sich erst durch Kommentare durcharbeiten
muss, die mit dem Thema nichts zu tun haben.
Zurück zum Thema:
Ich habe das Standalone-TCP-Ethernet-Example des STM32F4 Discoverys
genommen,
dort einen USART hinzugefügt, der beim Empfang einen Interrupt auslöst.
Wie gesagt, funktioniert prima, wenn der IRQHandler in der main.c
definiert wird. Aber eben nicht mehr, wenn er in der stm32f4xx_it.c
und .h definiert/deklariert wird.
Ich habe nix "falsch eingebunden", denn ich habe dafür nichts
eingebunden.
???????? schrieb:> Da du nichts falsch gemacht hast ist ja alles gut. Ist bestimmt> ein> Compiler bug. :-D :-D :-D>> Deine Selbstüberschätzung steht dir im weg.
Hör gefälligst auf beleidigend zu werden.
Wenn Du keine Ahnung hast woran es liegen könnte,
das schreibe einfach nichts.
Vielleicht liegt es auch an Deiner Selbstüberschätzung, dass,
wenn Dir keine Lösung zum Thema einfällt, alle anderen
bescheuert sein müssen.
Aber, wenn Du so schlau bist und ich mich selbst überschätze
kannst Du mir ja sicherlich sagen was man alles falsch einbinden
kann, wenn man gar nichts eingebunden hat.
Wenn Du darauf keine Antwort hast, brauchst Du nicht zu antworten.
Da du nichts zeigt, wird dir keiner helfen können. Aber glaube, du bist
nicht der einzige, der c code in mehrere Module teilt und per header
veröffentlicht. Und glaube auch, dass du bei deiner Projekt Verwaltung
ein paar Dateien durcheinander würfelst.
So einfach ist das. Also komm runter von deinem hohen Ross. Ach ja, ich
habe nicht das Problem, sondern du. Ein bisschen mehr Freundlichkeit
kann nicht schaden.
Gehen andere interrupts?
Es hat mich mal fast 2h gekostet herauszufinden, dass ich die Datei in
der der Interrupt stand nicht mit in meinen Makefile hatte. Nun hast du
wahrscheinlich ja kein Makefile, sondern musst das ganze irgendwie zu
deinem Projekt hinzufügen. Hast du dabei vielleicht irgendetwas falsch
gemacht?
Detlef Kunz schrieb:> Dein Fehler ist, das die IRQHandler bereits speziell deklariert> sind.> Die darfst Du nicht nochmal deklarieren.
Aber in der stm32f4xx_it.h werden doch auch die anderen Handler
deklariert.
Wie muss ich es denn sonst machen?
Wenn ich die Deklaration aus der .h nehme geht es aber auch nicht.
nfet schrieb:> Gehen andere interrupts?>> Es hat mich mal fast 2h gekostet herauszufinden, dass ich die Datei in> der der Interrupt stand nicht mit in meinen Makefile hatte. Nun hast du> wahrscheinlich ja kein Makefile, sondern musst das ganze irgendwie zu> deinem Projekt hinzufügen. Hast du dabei vielleicht irgendetwas falsch> gemacht?
Wie gesagt, ich benutze Keil.
Ich habe das Ethernet Example genommen und in der Main.c
die Funktionen:
void GPIO_Configuration(void);
void USART_Configuration(void);
void NVIC_Configuration(void);
void DMA_Configuration(void);
sowie den IRGHandler hinzugefügt.
Ich habe an den Projekteinstellungen nichts angefasst oder verändert.
Nur die main.c erweitert.
Kann es denn sein daß jetzt einfach die Reihenfolge in der die
Deklarationen abgearbeitet werden eine andere ist, und deshalb Deine
extern verschobene an anderer Stelle wieder neu deklariert wird?
Ich habe das mit Keil übrigen nicht böse gemeint, ich denke die würden
sich auch gut um potentielle Kunden kümmern.
Detlef Kunz schrieb:> Wo initalisierst Du USART6 und DMA2?
Mach ich nicht, ich benutze USART3 und DMA1
Philipp schrieb:> wenn du den IRQHandler auslagerst, musst du doch auch die> stm32f4xx_it.h> einbinden oder?> In deinem Code oben finde ich davon zumindest nichts.
Du hast Recht. Hab ich nun eingefügt.
Hat aber auch nicht zur Lösung geführt.
Johann L. schrieb:> Olli schrieb:>> Ich habe an den Projekteinstellungen nichts angefasst oder verändert.>> Das neue Modul muss natürlich auch hinzugefügt werden.
Was denn für ein neues Modul?
Falls Du die stm32f4xx_it.c/.h meinst, die war schon im Projekt mit
drin.
Olli schrieb:> Detlef Kunz schrieb:>> Wo initalisierst Du USART6 und DMA2?> Mach ich nicht, ich benutze USART3 und DMA1
Ahja, und was soll dann das:
Olli schrieb:> Ach entschuldigt der IRQHandler heißt bei mir:> void DMA2_Stream1_IRQHandler(void)
und das:
Olli schrieb:> void DMA2_Stream1_IRQHandler(void)> {> int i = 0;> if(DMA_GetITStatus(DMA2_Stream1, DMA_IT_TCIF1))> {> DMA_ClearITPendingBit(DMA2_Stream1, DMA_IT_TCIF1);> tcp_server_send(tcp_debug_pcb, (uint8_t*)USART6_RX_Buffer, 13);> }> }>
Und wo ist der Handler für DMA1?
Detlef Kunz schrieb:> Olli schrieb:>> Detlef Kunz schrieb:>>> Wo initalisierst Du USART6 und DMA2?>> Mach ich nicht, ich benutze USART3 und DMA1>> Ahja, und was soll dann das:>> Olli schrieb:>> Ach entschuldigt der IRQHandler heißt bei mir:>> void DMA2_Stream1_IRQHandler(void)>> und das:>> Olli schrieb:>> void DMA2_Stream1_IRQHandler(void)>> {>> int i = 0;>> if(DMA_GetITStatus(DMA2_Stream1, DMA_IT_TCIF1))>> {>> DMA_ClearITPendingBit(DMA2_Stream1, DMA_IT_TCIF1);>> tcp_server_send(tcp_debug_pcb, (uint8_t*)USART6_RX_Buffer, 13);>> }>> }>>>> Und wo ist der Handler für DMA1?
Tut mir leid, war ein Fehler beim kopieren.
Dieser Handler ist nicht in Benutzung.
Das ist leider nicht der Fehler.
Hier ist der korrekte Handler:
void DMA1_Stream1_IRQHandler(void)
{
if(DMA_GetITStatus(DMA1_Stream1, DMA_IT_TCIF1))
{
DMA_ClearITPendingBit(DMA1_Stream1, DMA_IT_TCIF1);
while (USART_GetFlagStatus(USART3, USART_FLAG_TC) == RESET);
USART_SendData(USART3, (uint16_t)USART3_RX_Buffer[i]);
}
}
}
Olli schrieb:> Tut mir leid, war ein Fehler beim kopieren.Olli schrieb:> Ach entschuldigt der IRQHandler heißt bei mir:> void DMA2_Stream1_IRQHandler(void)> Das ist aber nicht der Fehler, habs nur eben falsch rauskopiert.
Na klar doch.
Das übliche "Ich sehe was, was Du nicht siehst"-Spiel.
Olli schrieb:> Ich habe an den Projekteinstellungen nichts angefasst oder verändert.> Nur die main.c erweitert.
Nur etwas nicht ändern reicht nicht. Man sollte schon wissen, was
abgeht.
Die Datei stm32f4xx_it.c gibt es bestimmt mehrfach auf deiner
Festplatte. Welche davon ist in das Projekt eingebunden?
Speicher die Datei unter einem anderen Namen, entferne die alte aus dem
Projekt und binde die neue ein. Was passiert dann?