Servus, ich versuche gerade den PIT meines at91sam7x zum Laufen zu überreden. Anbei der Code meiner main-Routine. Jedoch wird nie die Service-Routine aufgerufen. Ist der Code soweit in Ordnung, und falls ja, wo könnte ich weiter suchen? Gruß, Christophe
Kann es sein, dass man in main() der CPU sagen muss, dass sie Interupts berücksichtigen soll? Oder macht das schon der Startup-Code?
Ich verwende die beiden Startup-Skripte, die ich mit einer anderen Demo erhalten habe. Zur Sicherheit sind sie hier noch angehängt. Christophe
Kurz quergelesen sehe ich dort nichts, was die Interrupt-Bits im CPSR steuert. Wäre auch eher unüblich. Gängig ist, in main() bei abgeschalteten Interrupts loszulegen, um die erst nach der kompletten Initialisierung freizugeben.
du hast einiges beim init des PIT vergessen. Dieser Code funktioniert bei mir. void configure_pit(void) { volatile unsigned long pimr = 0; /* Configure a resolution of 10 ms */ //- Grundfrequenz 36,864000 MHz //- mck /16 /100Hz = 10ms //AT91C_BASE_PITC->PITC_PIMR = (MCK / (16 * 100)) - 1; //- 10ms - 100Hz /* Enable interrupts */ /* Disable the interrupt on the interrupt controller */ AT91C_BASE_AIC->AIC_IDCR = (1 << AT91C_ID_SYS); /* Save the interrupt handler routine pointer and the interrupt priority */ AT91C_BASE_AIC->AIC_SVR[AT91C_ID_SYS] = (unsigned long) cmx_irq; /* Store the Source Mode Register */ AT91C_BASE_AIC->AIC_SMR[AT91C_ID_SYS] = AT91C_AIC_SRCTYPE_INT_HIGH_LEVEL | AT91C_AIC_PRIOR_LOWEST; /* Clear the interrupt on the interrupt controller */ AT91C_BASE_AIC->AIC_ICCR = (1 << AT91C_ID_SYS); /* Enable the interrupt on the interrupt controller */ AT91C_BASE_AIC->AIC_IECR = (1 << AT91C_ID_SYS); /* Enable the interrupt on the pit */ pimr = AT91C_BASE_PITC->PITC_PIMR; AT91C_BASE_PITC->PITC_PIMR = pimr | AT91C_PITC_PITIEN; /* Enable the pit */ pimr = AT91C_BASE_PITC->PITC_PIMR; AT91C_BASE_PITC->PITC_PIMR = pimr | AT91C_PITC_PITEN; } Gruss Steffen
@Steffen: Genau das machen doch die ganzen AT91C/F-Kommandos. @A.K.: Das wars. Ich dachte, dass durch das Setzen des AIC_IECR die Interrupts auch aktiviert würden. Dem ist wohl nicht der Fall, eine kleine Assemblerroutine macht das jetzt. Merci! Christophe
Der Interrupt-Controller ist ein Periphieriebaustein, die beiden Interrupt-Flags sind hingegen Bestandteil des ARM7-Cores. Sind zwei völlig verschiedene Dinge.
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.