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!
Welcher Controller? Welche "Toolchain" (Realview/Keil, IAR, GNU,...)? Verfügbare Beispiel schon nachvollzogen? Bei konkreteren Fragen kann man besser helfen. Martin Thomas
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.
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!
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.