PRU Blinky código de ensamblaje no se ejecuta como se esperaba

0

Tengo un BeagleBone Blue y, utilizando la PRU integrada, estoy intentando controlar el LED_RED a bordo. Para PRUSS, estoy usando UIO PRUSS y am335x_pru_package a través de enlaces PyPRUSS .

Estoy accediendo al led rojo a través del puerto OCP, y mi código de ensamblaje es el siguiente:

.origin 0
.entrypoint SETUP

#define GPIO2 0x481ac000
#define GPIO_CLEARDATAOUT 0x190
#define GPIO_SETDATAOUT   0x194
#define GPIO_DATAOUT      0x138

#define LED_RED     (1<<2)
#define PAUSE_BTN   (1<<5)

#define INS_PER_US 200
#define INS_PER_DELAY_LOOP 2
#define ON_TIME  (200*1000*(INS_PER_US / INS_PER_DELAY_LOOP))
#define OFF_TIME (200*1000*(INS_PER_US / INS_PER_DELAY_LOOP))

#define PRU0_R31_VEC_VALID 32
#define PRU_EVTOUT_0 3

SETUP:
    // Enable the OCP master port
    LBCO r0, C4, 4, 4
    CLR  r0, r0, 4
    SBCO r0, C4, 4, 4

TURN_LED_ON:
    MOV r1, GPIO2 | GPIO_SETDATAOUT // for setting gpio bit
    MOV r2, LED_RED
    SBBO r2, r1, 0, 4 // sets led on
    MOV r0, ON_TIME

LED_ON:
    SUB r0, r0, 1
    QBNE LED_ON, r0, 0

TURN_LED_OFF:
   MOV r1, GPIO2 | GPIO_CLEARDATAOUT // for clearing gpio bit
   MOV r2, LED_RED
   SBBO r2, r1, 0, 4 // sets led off
   MOV r0, OFF_TIME

LED_OFF:
    SUB r0, r0, 1
    QBNE LED_OFF, r0, 0

CHECK_BUTTON:
    MOV r5, GPIO2 | GPIO_DATAOUT //for reading gpio bit
    LBBO r6, r5, 0, 4
    QBBS TURN_LED_ON, r6.t5

END:
    MOV R31.b0, PRU0_R31_VEC_VALID | PRU_EVTOUT_0
    HALT

Lo que hace el código es mantener parpadeando el led en un intervalo de tiempo configurable, hasta que Se presiona PAUSE_BUTTON , que si es así, el código sale.

Aquí está el script de python que se está utilizando:

import pypruss
pypruss.init()      # Init the PRU
pypruss.open(3)     # Open PRU event 0 which is PRU0_ARM_INTERRUPT
pypruss.pruintc_init(0)   # Init the interrupt controller
pypruss.exec_program(0, "./blinkled.bin")  # Load firmware "blinkled.bin" on PRU 0
pypruss.wait_for_event(3)  # Wait for event 0 which is connected to PRU0_ARM_INTERRUPT
print("DONE!")
pypruss.clear_event(3)  # Clear the event
pypruss.pru_disable(0)  # Disable PRU 0, this is already done by the firmware
pypruss.exit()           # Exit, don't know what this does.

El firmware no hace que el LED parpadee, ni sale del código enviando la interrupción para indicar el final del programa.

    
pregunta BabaYaga

0 respuestas

Lea otras preguntas en las etiquetas