Gast
#990927
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