Cómo usar una interrupción en Cortex - M3

1

Estoy intentando configurar el chip para que detecte un flanco ascendente en un pin y luego comience a emitir una onda cuadrada en el siguiente pin más.

Tengo la interrupción activada pero no sé cómo decir "si la interrupción se activa, ejecuta el generador de ondas". He revisado la hoja de datos pero parece que no puedo entenderlo.

; New asm data section
    AREA square_func, CODE, READONLY
; Export back to C
    EXPORT square_wave
    ALIGN
square_wave
    LDR     R1,=0x2009c000      ; Pointer to base of port 0 
    LDR     R2,=0x00000001      ; To control pin 0
    LDR     R3,=0x00000001      ; For XOR to invert pin 0
    STR     R2,[R1,#0x00]       ; Set pin 0 to output (base+0x00)
    STR     R2,[R1,#0x14]       ; Turn on pin 0
    LDR     R4,=749             ; Set up timer
    LDR     R6,=0x40028090      ; Interupt pointer for port 0
    LDR     R7,=0x00000002      ; For pin 1
    STR     R7,[R6]             ; Set pin 1 to rising edge interrupt
loop
    SUB     R4, 1               ; Decrement timer
    CMP     R4, 0               ; Compare to 0
    BNE     loop                ; If !0, keep looping
    LDR     R4,=749             ; Reset timer
    EOR     R2,R3               ; Invert bits
    STR     R2,[R1,#0x14]       ; Invert pin
    MUL     R3,R3,R3            ; To waste cycles, ignore (1*1=1)
    B       loop                ; Restart loop
    ALIGN
    
pregunta user124757

1 respuesta

1

El mecanismo de interrupción se describe en el Manual de referencia arquitectónica ARM y / o en el Manual de referencia técnica, ambos disponibles en infocenter.arm.com. Luego hay algo de información que necesita de la hoja de datos de los proveedores de chips (el brazo no hace que los chips hagan los núcleos de los procesadores que los proveedores de chips compran y usan). así que, a diferencia del brazo tradicional con una entrada de irq y fiq, el cortex-m3 tiene un montón de entradas de interrupción y usted tiene que averiguar dónde conectó el cableado su proveedor la interrupción.

De la forma en que funciona Cortex-m, tiene una tabla de vectores de interrupción que incluye direcciones para las rutinas para cada una de las interrupciones / excepciones. (descrito en ARM ARM y / o ARM TRM) el restablecimiento es uno de esos, por lo que ya tiene implementado, los primeros cuatro bytes se cargan en el puntero de la pila, los siguientes cuatro son la dirección para restablecer y luego entran las excepciones e interrupciones que son específicas del núcleo (el córtex-m3 y córtex-m4 y córtex-m0 no necesariamente tienen la misma lista y ciertamente cada proveedor o modelo puede tener diferentes cosas conectadas).

Entonces, por supuesto, tiene que habilitar las interrupciones en el lado del proveedor, el periférico, tal vez un controlador de interrupción en el lado del brazo.

Lo bueno del diseño de cortex-m es que el hardware se ajusta a la convención de llamada de brazo (conserva los registros para usted en la pila, etc.), puede colocar la dirección en una función C directamente en la tabla vectorial, ya no es necesario envolver su controlador de interrupciones en C con el ensamblaje o usar directivas específicas del compilador para que el compilador incluya su código para manejar las interrupciones.

Por lo general, recomiendo que comience por sondear su camino hacia el núcleo; si es posible, sondee el estado de interrupción periférica para ver si se activó, luego habilite ese estado para pasar al siguiente nivel, encuestelo y luego habilítelo para el borde del núcleo donde normalmente se puede encuestar sin habilitarlo en el núcleo. YMMV, a algunas personas les gusta simplemente iluminar todo el árbol de Navidad a la vez y ver qué pasa (primero escriba el código finalizado y luego depure un montón de código sin saber por dónde empezar a buscar).

    
respondido por el old_timer

Lea otras preguntas en las etiquetas