Hallo, ich habe mal folgende FIQ-Interrupt Geschichte ausprobieren wollen und nichts passiert Hardware: Olimex EK Board mit AT91SAm7S256 main.c: #include "Board.h" #include "delay.h" #define __inline static inline #include "lib_AT91SAM7S256.h" void fiqisr (void); extern void LowLevelInit(void); extern void AT91F_Fiq_Handler (void); extern unsigned enableIRQ(void); extern unsigned enableFIQ(void); unsigned int FiqCount = 0; // global uninitialized variable #define FIQ_INTERRUPT_LEVEL 0 int main (void) { volatile AT91PS_AIC pAic = AT91C_BASE_AIC; volatile AT91PS_PIO pPIO = AT91C_BASE_PIOA; // pointer to PIO data structure pPIO->PIO_PER = LED_MASK | Button1; // PIO Enable Register - allow PIO to control pins P0 - P3 and pin 19 pPIO->PIO_OER = LED_MASK; // PIO Output Enable Register - sets pins P0 - P3 to outputs pPIO->PIO_SODR = LED_MASK; // PIO Set Output Data Register - turns off the four LEDs // Select PA19 (pushbutton) to be FIQ function (Peripheral B) pPIO->PIO_BSR = Button1; //* open FIQ interrupt AT91F_PIO_CfgPeriph (AT91C_BASE_PIOA,Button1,0); AT91F_AIC_DisableIt (pAic, AT91C_ID_FIQ); AT91F_AIC_ConfigureIt ( pAic, AT91C_ID_FIQ, FIQ_INTERRUPT_LEVEL,AT91C_AIC_SRCTYPE_EXT_NEGATIVE_EDGE, AT91F_Fiq_Handler); AT91F_AIC_ClearIt (pAic, AT91C_ID_FIQ); AT91F_AIC_EnableIt (pAic, AT91C_ID_FIQ); enableFIQ(); while (1) { Delay(1000); if ((pPIO->PIO_ODSR & LED1) == LED1) { // read previous state of LED1 pPIO->PIO_CODR = LED1; } else { pPIO->PIO_SODR = LED1; } } } die passende fiqisr.c mit der Funktion AT91F_Fiq_Handler: // ************************************************************************ ***** // AT91F_Fiq_Handler // // IRQ 0 Interrupt Service Routine // // // // // Author: // ************************************************************************ ***** #include "Board.h" #define __inline static inline #include "lib_AT91SAM7S256.h" volatile AT91PS_AIC pAic = AT91C_BASE_AIC; void AT91F_Fiq_Handler(void) { //* Read the output state if ( (AT91F_PIO_GetInput(AT91C_BASE_PIOA) & LED2 ) == LED2 ) { AT91F_PIO_ClearOutput( AT91C_BASE_PIOA, LED2 ); } else { AT91F_PIO_SetOutput( AT91C_BASE_PIOA, LED2 ); } AT91F_AIC_ClearIt (pAic, AT91C_ID_FIQ); } Enableirq tut folgendes: unsigned enableIRQ(void) { unsigned _cpsr; _cpsr = __get_cpsr(); __set_cpsr(_cpsr & ~IRQ_MASK); return _cpsr; } ------------------------------------------------------------------------ - Da ich keinen Fehler find, frage ich mich inweiweit man de nFIQ noch woanders definieren muß? In meiner lowlevelinit.c werden PLL, Watchdog und unter anderem auch die Interruptvetoren handler gesetzt Hat jemand vielleicht eine Idee? Gruß Tobias
>Enableirq tut folgendes und was tut EnableFIQ? Sind FIQ-exceptions auf Core-Level freigegeben? (FIQ-Bit in Status des aktiven Modes gelöscht)? Wie sieht der Assembler-Wrapper für FIQ aus? Wir der FIQ auf Core-Ebene ausgelöst? (z.B per Debugger nachsehen oder LED im FIQ-Wrapper blinken lassen) Martin Thomas
Guten Morgen, na klar... die FIQenable() tut folgendes: #define FIQ_MASK 0x00000040 unsigned enableFIQ(void) { unsigned _cpsr; _cpsr = __get_cpsr(); __set_cpsr(_cpsr & ~FIQ_MASK); return _cpsr; } Muß ich den nauch das AIC_FFER Bit setzen? Das Thema "exceptions" habe ich mir noch nicht angenommen? Aber das was du siehst ist alles was ich zum Thema FIQ ausprobiert habe! Dein Beipsiel habe ich mit meinem verglichen und bis auf die startup unterschiede habe ich nichts gefunden? Habe einfach mal das ganze Projekt angehängt, falls Interesse besteht. Gruß Tobias Eckhardt
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.