Forum: Compiler & IDEs Interrupts AT91SAM7 / CrossStudio


von Ruuud (Gast)


Lesenswert?

Hallo,

ich bin ein Neuling bei den ARM-Controllern und komm jetzt bei den 
Interrupts nicht weiter, konnte auch im internet nichts finden :-(
Kann mir jemand Schritt für Schritt erklären wie ich da vorgehen muss.

Danke!

von mthomas (Gast)


Lesenswert?

Welcher Controller? Welche "Toolchain" (Realview/Keil, IAR, GNU,...)? 
Verfügbare Beispiel schon nachvollzogen? Bei konkreteren Fragen kann man 
besser helfen.

Martin Thomas

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Die Toolchain steht in der Überschrift - das ist "Rowley Crossworks for 
ARM", mit der IDE "CrossStudio". Das ist gcc für ARM, allerdings wohl 
mit Rowley-spezifischen Libraries.

von Ruuud (Gast)


Lesenswert?

Bei dem Controller handelt es sich um einen AT91SAM7S256 von ATMEL bei 
der IDE um CrossStudio von Rowley (steht in der Überschrift ;-))

Mein bisheriges Programm siet wie folgt aus:
1
#include <targets/AT91SAM7S256.h>
2
#include <libarm.h>
3
4
void isr_TIMER0 ( void ) __attribute__ ((interrupt ("IRQ")));
5
6
int main(void)
7
{
8
    PMC_PCER = 0xFFFF;    //Peripheral Clock enable
9
    PIOA_OER = 0xF;       //PA0,1,2,3 als Ausgang
10
    TC0_CMR = 0x4;        //Prescaller /1024
11
    TC0_IER = 0x1;        //Timer Interrupt enable
12
    TC0_CCR = 0x5;        //Timer Clock enable
13
    
14
    libarm_set_irq (1);   //Interrupts enable
15
  
16
    while(1)
17
    {
18
      if(~PIOA_PDSR & (1<<PIOA_PDSR_P14_BIT))
19
      PIOA_SODR = 0xF;      //PA0,1,2,3 auf high
20
    }
21
    return 0;
22
}
23
24
void isr_TIMER0 ( void )
25
{
26
  PIOA_CODR = 0xF;          //PA0,1,2,3 auf low
27
}

In der main() muss ich ja noch dem Timer0-Interrupt die ISR zuweißen, 
nur weiß ich nicht wie!

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Crossworks wird mit einigen Beispielprogrammen ausgeliefert, die sind im 
Verzeichnis samples\Shared zu finden.

Bei CWARM1.6 ist beispielsweise eine Datei namens timer_interrupt.c 
dabei, die Rowley-Tasking-Library-Funktionen (CTL) nutzt, um einen 
Timerinterrupt zu implementieren.

Ansonsten könnte Dir das hier weiterhelfen:

http://rowley.co.uk/documentation/arm_1_6/ctl_interrupts_ll.htm

von mthomas (Gast)


Lesenswert?

Hoppla, überschrift glatt überlesen. Sorry.

>In der main() muss ich ja noch dem Timer0-Interrupt die ISR zuweißen,
>nur weiß ich nicht wie!

Vgl. Manual Abschnitt AIC. In Kurzform: Mode setzen AIC_SMR[], Vektor 
auf ISR AIC_SVR[], aktivieren AIC_IECR.

Mit der von Atmel verfügbaren Sammlung von inline-Funktionen 
(lib_AT91SAM7*.h) kann man sich ein wenig Arbeit sparen. Keine Ahnung, 
ob diese Dateien bei Crossworks dabei sind. Kann man aber bei atmel.com 
runterladen (z.B. im USB-Framework enthalten). Bei Verwendung der 
GNU-Toolchain (also auch Rowley) sollte man vor dem #inlude der library 
ein #define __inline static inline einfügen.

Martin Thomas

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.