He puesto un pin en un Cortex M3 para que actúe como una interrupción activada por el flanco ascendente y no se dispara por alguna razón. Lo que debería hacer es recibir un pulso de 1Hz, desencadenar una interrupción y comenzar una onda cuadrada de 12.8 KHz.
__main y EINT3_IRQHandler están definidos en el código de inicio creado por el programa, Keil uVision 5. Las interrupciones GPIO comparten el vector de interrupción EINT3 con una interrupción externa diferente. Pensé que solo sería cuestión de activar las interrupciones GPIO y EINT3 y luego colocar el controlador dentro de la etiqueta EINT3_IRQHandler.
Las interrupciones de GPIO se describen en la página 129 de esta hoja de datos.
También intenté configurarlo para que lea el estado de la interrupción utilizando
check
CMP [status_register], #1 ; Check interrupt status
BEQ wave_gen ; If triggered, start square wave
BNE check ; else keep checking
y úsalo como disparador, pero tampoco funcionó.
Este es mi código.
AREA main, CODE, READONLY
EXPORT __main
EXPORT EINT3_IRQHandler
ALIGN
__main
LDR R1,=0x2009c000 ; Pointer to base of port 0
LDR R2,=0x00000001 ; To control pin 0 for square wave
LDR R3,=0x00000001 ; For XOR to invert pin 0
STR R2,[R1,#0x00] ; Set pin 0 to output mode (base+0x00)
STR R2,[R1,#0x14] ; Pin 0 HIGH
LDR R4,=780 ; Set up timer
LDR R5,=0x40028080 ; GPIO Rising Edge Interrupt
LDR R7,=0xE000E100 ; Set EINT3-enable register
LDR R6,=0x00000002 ; For pin 0:1
STR R6,[R5,#10] ; Activate 0:1 as rising edge interrupt
LDR R6,=0x00200000 ; To enable ENINT3
STR R6,[R7] ; Enables EINT3
WFI
wave_gen
SUB R4, #1 ; Decrement timer
CMP R4, #0 ; Compare to 0
BNE wave_gen ; If !0, keep looping
LDR R4,=975 ; Reset timer
EOR R2,R3 ; Invert bits
STR R2,[R1,#0x14] ; Invert pin
MUL R3,R3,R3 ; To waste cycles, ignore (1*1=1)
MUL R3,R3,R3
B wave_gen ; Restart loop
EINT3_IRQHandler
B wave_gen ; Start square wave
ALIGN