Forum: Mikrocontroller und Digitale Elektronik FIQ Interrupt will nicht!


von Tobias E. (doenges2)


Lesenswert?

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

von mthomas (Gast)


Lesenswert?

>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

von Tobias E. (doenges2)


Angehängte Dateien:

Lesenswert?

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
Noch kein Account? Hier anmelden.