Hallo,
hat jemand vielleicht einen Link auf eine "gut verständliche" Erklärung
in deutsch (ausnahmsweise..) wie die Interrupts des ARM7 zu benutzen
sind? Egal wieviel Beispielcode ich auch lese und durchs Manual schaue,
entweder bin ich zu blöde zu verstehen wie das funktioniert oder es ist
einfach nur schlecht erklärt. Viele Beispielcodes sind vor lauter
Benutzung von Zeigern und Zeigern auf Zeiger kaum mehr zu verstehen. De
facto nutze ich derzeit Code aus Beispielen ohne ihn wirklich zu
verstehen.
Den hier zB habe ich teilweise selbst geschrieben im unteren Teil um
eine Zeitbasis zu haben, teilweise aus einem Beispiel von Rowley
kopiert. Wa hat es mit diesen Slots auf sich und
1 | // Ruft einen IRQ alle Millisekunden auf
|
2 | void InitTimer0(unsigned int millisec)
|
3 | {
|
4 | #define TIMER0_IRQ 4
|
5 | #define TIMER1_IRQ 5
|
6 |
|
7 | // Timer 0 ist ein IRQ interrupt
|
8 | VICIntSelect&= ~(1<<TIMER0_IRQ);
|
9 | // Benutze slot 0 für timer 0 interrupt, Bit 5 = 1 => Slot aktivieren
|
10 | VICVectCntl0=(1<<5) | TIMER0_IRQ;
|
11 | // Enable timer 0 interrupt
|
12 | VICIntEnable = (1<<TIMER0_IRQ);
|
13 | // Setze die Adresse der ISR für slot 0
|
14 | VICVectAddr0 = (unsigned int)timer0ISR;
|
15 |
|
16 | // Setze Timermatch 0 auf 1 Millisekunde
|
17 | T0MR0 = PLL_GetAPBClock()/1000;
|
18 | // Setze den Timer 0 prescale counter auf den Wert der Parameterliste
|
19 | T0PR = millisec;
|
20 | // Reset timer 0
|
21 | T0TCR = 0;
|
22 | // Match = IRQ auslösen und Timer resetten
|
23 | T0MCR |= T0MCR_Interrupt_on_MR0_MASK | T0MCR_Reset_on_MR0_MASK;
|
24 | // Start timer 0
|
25 | T0TCR = T0TCR_Counter_Enable_MASK;
|
26 |
|
27 | // Enable Interrupts
|
28 | __ARMLIB_enableIRQ();
|