Cortex M3 GPIO Interrupt no se dispara

0

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.

enlace

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
    
pregunta user124757

1 respuesta

1

Realmente no he hecho el ensamblaje con la corteza M3, pero por lo que puedo decir, no está habilitando el reloj periférico para cualquier periférico GPIO que esté usando, eso es lo que me sorprendió la primera vez que lo hice, y Lo que parece atrapar a mucha gente.

    
respondido por el Jonathan

Lea otras preguntas en las etiquetas