Forum: Mikrocontroller und Digitale Elektronik Interrupts beim AT91SAM9261


von Tim (Gast)


Lesenswert?

Hallo,

ich möchte bei meinem AT91SAM9261 die Interrupts ausprobieren. Hierzu 
habe ich mir aus den examples den PIT Interrupt "herausgepickt".

[c]
//---------------------------------------------------------------------- 
--------
/// Handler for PIT interrupt. Increments the timestamp counter.
//---------------------------------------------------------------------- 
--------
void ISR_Pit(void)
{
  unsigned int status;

  // Read the PIT status register
  status = PIT_GetStatus() & AT91C_PITC_PITS;
  dbg_Puts(AT91C_BASE_DBGU, "ISR\n\r");
  if (status != 0) {
    // Read the PIVR to acknowledge interrupt and get number of ticks
    //timestamp += (PIT_GetPIVR() >> 20);
  }
}

//---------------------------------------------------------------------- 
--------
/// Configure the periodic interval timer to generate an interrupt every
/// millisecond.
//---------------------------------------------------------------------- 
--------
void ConfigurePit(void)
{
  // Initialize the PIT to the desired frequency
  PIT_Init(1000, 96);

  // Configure interrupt on PIT
  AIC_DisableIT(AT91C_ID_SYS);
  AIC_ConfigureIT(AT91C_ID_SYS, AT91C_AIC_PRIOR_HIGHEST, ISR_Pit);
  AIC_EnableIT(AT91C_ID_SYS);
  PIT_EnableIT();

  // Enable the pit
  PIT_Enable();
}
[\c]

Den Code habe ich in mein IAR Projekt integriert und entsprechend in den 
internen SRAM (ab 0x300000, Vektoren ab 0x300000) gelinkt. Mein Problem 
ist jetzt, dass er die ISR nicht ausführt. Deshalb gehe ich davon aus, 
dass ich irgendwo in der Initialisierung nocht etwas vergessen habe. 
Deshalb jetzt meine Fragen:
Welche zusätzlichen Schritte sind erforderlich?
Muss eventuell im Startup-Teil noch etwas integriert werden? (Ich habe 
diesen Teil so belassen, wie IAR dies durch den Projekt-Wizard 
bereitstellt)

Danke Tim

von Alec (Gast)


Lesenswert?

Hi Tim,

was ich nicht sehe ist die Freigabe der IRQ/FIQ im ARM-Kern. Auf diese 
Leitungen arbeitet der AIC.
z.B.:

// IRQ handling function for the ARM core.
// Enable IRQ
void ARM_enable_irq (void)
{
  _asm__ __volatile_ ("MRS r1, CPSR");
  _asm__ __volatile_ ("BIC r1, r1, #0x80");
  _asm__ __volatile_ ("MSR CPSR_c, r1");
}

Kannst Du so etwas ähnliches im Rest vom Code finden?

Gruß Alec

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.