Hallo zusammen.
Ich hab ein Problem mit den PIO-Interrupts eines AT91SAM7S256:
Ich habe alles soweit konfiguriert, dass beim Betätigen einer der Taste
sich das entsprechende Register AIC_IPR verändert. ( Wert z.B.
0x40000005)
Der Code für den Interrupteinsprung entstammt eines Beispielprojekts (
crt.s von /* Author: James P Lynch May 12, 2007 ) und wurde von
mir ein wenig angepasst:
1 | AT91F_Irq_Handler:
|
2 | sub lr, lr, #4
|
3 | stmfd sp!, {lr}
|
4 | /* Hole Addresse des Counters */
|
5 | ldr r10,=INTERRUPTCNT
|
6 | /* Hole Wert */
|
7 | ldr r11,[r10]
|
8 | /* Addiere 1 */
|
9 | add r11,r11,#1
|
10 | / Speichere neuen Wert */
|
11 | str r11,[r10]
|
12 | /* Sollte in C INTERRUPTCNT = INTERRUPTCNT + 1 representieren */
|
13 | mrs r14, SPSR
|
14 | stmfd sp!, {r0,r14}
|
15 | ldr r14, =AT91C_BASE_AIC
|
16 | ldr r0 , [r14, #AIC_IVR]
|
17 | str r14, [r14, #AIC_IVR]
|
18 | msr CPSR_c, #ARM_MODE_SVC
|
19 | stmfd sp!, { r1-r3, r12, r14}
|
20 | mov r14, pc
|
21 | bx r0
|
22 | ldmia sp!, { r1-r3, r12, r14}
|
23 | msr CPSR_c, #I_BIT | ARM_MODE_IRQ
|
24 | ldr r14, =AT91C_BASE_AIC
|
25 | str r14, [r14, #AIC_EOICR]
|
26 | ldmia sp!, {r0,r14}
|
27 | msr SPSR_cxsf, r14
|
28 | ldmia sp!, {pc}^
|
Der Interruptcounter bleibt aber immer auf 0. Wird die Funktion
AT91F_Irq_Handler somit garnicht angesprungen? Oder habe ich einen
Fehler gemacht?
Ich habe die kompletten Dateien unter:
http://www.xplod.de/media/archive1/crt.s
http://www.xplod.de/media/archive1/lowlevelinit.c
http://www.xplod.de/media/archive1/main.c
http://www.xplod.de/media/archive1/makefile
abgelegt...