Interrupts mit AT91SAM7x256 (Olimex Board SAM7-EX256)

Gast #1479865
Lesenswert?

Hallo zusammen,

ich habe das Olimex Board SAM7-EX256 aus dem Shop hier 
(http://shop.embedded-projects.net/product_info.php/info/p16_AT91SAM7X256---TFT--Ethernet--SAM7-EX256-.html). 
Als Mikrocontroller sitzt da ein AT91SAM7x256 drauf.


Ein kleines Beispielprojekt läuft auch schon. Nun möchte ich Interrupts 
verwenden und bin echt ratlos was ich falsch mache. Für den Anfang 
wollte ich mit SWI einen Software Interrupt auslösen und etwas in der 
Handler-Routine machen. Aber ich kann tun und lassen was ich will: Es 
funktioniert einfach nicht. Die SWI Anweisung scheint nicht 
zurückzukehren, aber der Sprungbefehl an Adresse 0x08 scheint auch nicht 
ausgeführt zu werden.


Den Code habe ich angehängt.


Hat jemand eine Idee?
Angehängte Dateien:
Gast #1480498
Lesenswert?

Ich habe das ganze mal auf folgendes Minimalbeispiel runtergebrochen.

Die SWI Anweisung scheint einfach "durchzulaufen", d.h. die 
Ausgangsleitung PB21 wird auf 0 gesetzt. Erwartet hätte man, dass PA30 
auf 0 gezogen wird. Ich bin echt ratlos, warum funktioniert das nicht ?


1
.section .vectors
2
.arm
3

4
reset:
5
      ldr  pc, .Lvector_reset
6
      b exit
7
      ldr  pc, .Lvector_swi
8
      b exit
9
      b exit
10
      nop
11
      b exit
12
      b exit
13

14
.Lvector_reset:     .word  .Lstartup
15
.Lvector_undef:     .word  0
16
.Lvector_swi:       .word  .Lswi_isr
17
.Lvector_pref_abt:  .word  0
18
.Lvector_data_abt:  .word  0
19
                    .word  0
20
.Lvector_fiq:       .word  0
21
                    .word  0
22

23

24
.section .text
25
.arm
26

27
.equ  PSR_MODE_SVC,  0x13  /* (10011) Supervisor Mode (SVC) */
28
.equ  PSR_I_BIT,     0x80  /* IRQ disable bit */
29
.equ  PSR_F_BIT,     0x40  /* FIQ disable bit */
30

31
.Lstartup:
32

33
  /* switch to SVC mode and setup stack */
34
  msr cpsr_c, #(PSR_MODE_SVC|PSR_I_BIT|PSR_F_BIT)
35

36
  /* strange behavior */
37
  swi 0x80
38

39
  /* PIOB_PIO_PER = (1 << 21) */
40
  ldr r0, =0xFFFFF600
41
  mov r1, #(1 << 21)
42
  str r1, [r0]
43
  /* PIOB_PIO_OER = (1 << 21) */
44
  ldr r0, =0xFFFFF610
45
  mov r1, #(1 << 21)
46
  str r1, [r0]
47
  /* PIOB_PIO_CODR = (1 << 21) */
48
  ldr r0, =0xFFFFF634
49
  mov r1, #(1 << 21)
50
  str r1, [r0]
51

52
  b .Lexit
53

54
.Lswi_isr:
55
  /* PIOA_PIO_PER = (1 << 30) */
56
  ldr r0, =0xFFFFF400
57
  mov r1, #(1 << 30)
58
  str r1, [r0]
59
  /* PIOA_PIO_OER = (1 << 30) */
60
  ldr r0, =0xFFFFF410
61
  mov r1, #(1 << 30)
62
  str r1, [r0]
63
  /* PIOA_PIO_CODR = (1 << 30) */
64
  ldr r0, =0xFFFFF434
65
  mov r1, #(1 << 30)
66
  str r1, [r0]
67

68
exit:
69
.Lexit:  b .Lexit

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren