Hallo! Ich kriege mit einem SAM9260 (Board von Olimex an ARM-USB-OCS und Rowley 1.7) die Interrupts nicht zum Laufen. Habe mittlerweile lange gesucht und diverse Tipps befolg, jedoch ohne Erfolg. Vielleicht findet einer von Euch etwas. Das Szenario: es ist ein einfaches Programm, das nichts macht, ausser einen Timer starten der beim Overflow einen Interrupt auslöst. Es wird zwar Interrupt Pending im AIC gesetzt und es sieht IMHO alles sehr gut aus, aber der Interrupt kommt nicht! Hier die Details: -beim Programdownload wird zusätzlich ein externer Reset ausgelöst und vorsorglich alle Interrupts durch Schreiben des Interrupt Clear Command Register (ICCR) quittiert sowie alle Interrupts gesperrt: RSTCT_CR=0xA500000004; AIC_ICCR=0xFFFFFFFF; AIC_IDCR=0xFFFFFFFF; Alle Caches und die MMU ist deaktiviert. -im main geht folgendes vor: main() { //Handler für spurious Register setzten (wird aber NIE aufgerufen) AT91C_BASE_AIC->AIC_SPU = (unsigned int) Spurious; //Protection Mode im AIC Debug Control Register setzten (folgende Werte //durchprobiert: 0x00, 0x01, 0x03) AT91C_BASE_AIC->AIC_DCR = 0x01; //Setup des Power Management Controllert für TC0 //System Clock (Programmable Clock 0) einschalten AT91C_BASE_PMC->PMC_SCER|=AT91C_PMC_PCK0; //Peripheral Clock für TC0 einschalten AT91C_BASE_PMC->PMC_PCER|=(1<<AT91C_ID_TC0); //Timer0 erzeugt Wave AT91C_BASE_TC0->TC_CMR = AT91C_TC_WAVE; //Beim Overflow Interrupt AT91C_BASE_TC0->TC_IER=AT91C_TC_COVFS; //Handler an AIC übergeben (wird nie angesprungen) AT91C_BASE_AIC->AIC_SVR[AT91C_ID_TC0] = (unsigned long) TC0_handler; //Priorität AT91C_BASE_AIC->AIC_SMR[AT91C_ID_TC0] = AT91C_AIC_SRCTYPE_INT_LEVEL_SENSITIVE | AT91C_AIC_PRIOR_HIGHEST; //Evtl. Int quittieren AT91C_BASE_AIC->AIC_ICCR = (1 << AT91C_ID_TC0); //TC0-Interrupt zulassen AT91C_BASE_AIC->AIC_IECR = (1 << AT91C_ID_TC0); //Timer starten AT91C_BASE_TC0->TC_CCR = AT91C_TC_CLKEN | AT91C_TC_SWTRG; for(;;); } Wie oben geschrieben, der Timer läuft auch korrekt! Die Werte der Register im AIC sehen auch gut aus: Alle AIC_SMRs und AIC_SVRs sind 0x00, ausser dem AIC_SMR17 und AIC_SVR17. AIC_IVR, AIC_FVR und AIC_CPU zeigen korrekt auf den Spurious-Handler. AIC_IMR ist 0x00020000, also NUR auf TC0 scharfgestellt. Und jetzt das eigenartige: der AIC_IPR (Interrupt Pending Register) hat den Flag für den TC0 gesetzt. Nun verstehe ich nicht, wieso dieser nicht angesprungen wird!! Das Programm werkelt fleissig im for(;;) vor sich hin :( Achso... das I-Flag der CPU ist natürlich gelöscht und die CPU läuft im Supervisor-Mode (System Mode habe ich auch schon versucht). Ich bin mit meinem Latein ziemlich am Ende und freue mich über jeden Hinweis! Gruss Thomas
Hallo nochmal, das gleiche Verhalten habe ich auf anderen Interrupts. z.B. PIT oder PIOx. Ich kann bei einem Button z.B. den Flag im Interrupt Pending Register durch Drücken setzten und von Hand mit dem ICCR wieder löschen. Obwohl die Maske auf den entsprechenden PIO scharfgestellt ist passiert nix :( Gruss Th
1 | //Protection Mode im AIC Debug Control Register setzten (folgende Werte |
2 | //durchprobiert: 0x00, 0x01, 0x03) |
3 | AT91C_BASE_AIC->AIC_DCR = 0x01; |
Bei 0x03 sind Interrupts immer aus. Ich würde das I-Flag nochmal überprüfen. Evtl ist nur das F-Flag gelöscht, verwechselt man gerne. Ansonsten wärs gut zu wissen, wie der Interrupt Handler aussieht, bzw ob die Interrupt-Vektoren an der richtigen Stelle stehen.
Hallo Lama! Danke fuer die Antwort! Da ich bisher schon gut 15-20Stunden an dem Problem sitze, bin ich mir sicher, dass der I gelöscht ist :) Die Einsprungadressen an die Handler stimmen auch. Habe es sowohl im Debugger (im mixwd mode) wie auch im .map-File überprüft. Gruss Th
Das Problem scheint u.U bei Rowley zu liegen! Mit IAR funktionieren die Interrupts wie sie sollen.
Es ist gelöst. Nachdem ich festgestellt habe, dass das Testprogramm mit IAR und Rowley auf einem anderen Rechner korrekt arbeiten, habe ich den Entwicklungsrecher neu aufgesetzt. Jetzt funktioniert es. Eine Erklärung habe ich aber nicht dafür (LPCs liefen anstandslos). Gruss Th
Jetzt kann ich die Erklärung nachliefern. Sobald im Register-Fenster des Debuggers die AIC-Register ausgewählt sind, funktionieren keine Interrupts mehr. Seltsamerweise darf es nicht mal beim Download des Codes aktiv sein! Und das hat mich eine knappe Woche gekostet.... Th
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.