Manejo de interrupciones para un UART en PIC32 con el compilador C32 v2.00

Soy muy nuevo en los chips PIC32 (o cualquier chip PIC) y estoy tratando de crear un controlador de interrupciones para que se llame al UART cuando el UART reciba un byte. Estoy usando el procesador PIC32MX695F512L PIC32 con el compilador C32 2.00 en una placa de desarrollo.

Encontré este código de ejemplo en otro proyecto en línea. Los comentarios me llevaron a creer que esta interrupción se llamaría cada vez que el UART reciba un byte. Agregué un punto de interrupción a esta función y un contador estático para contar cuántas veces se ejecutó esta función.

En otras partes del código fuente, puedo enviar BYTES fuera del UART y mi PC los está reactivando. He intentado enviar BYTES a la UART desde mi PC pero esta función nunca se activa y el contador de funciones ( UART1Info_count) nunca aumenta.

Código fuente

static BYTE UART1Info_LastByteRXed ;
static UINT32 UART1Info_count ; // Init elsewhere 

BOOL Uart_Connect ( ) {

    UART1Info_count = 0 ; 
    UART1Init();

    UARTConfigure       (UART1, UART_ENABLE_PINS_TX_RX_ONLY);
    UARTSetFifoMode     (UART1, UART_INTERRUPT_ON_RX_NOT_EMPTY);
    UARTSetLineControl  (UART1, UART_DATA_SIZE_8_BITS | UART_PARITY_NONE | UART_STOP_BITS_1 );
    UARTSetDataRate     (UART1, GetPeripheralClock(), 9600) ;
    UARTEnable          (UART1, UART_ENABLE_FLAGS(UART_PERIPHERAL | UART_RX | UART_TX));

    INTEnable           (INT_SOURCE_UART_RX(UART1), INT_ENABLED);
    INTEnable           (INT_SOURCE_UART_TX(UART1), INT_ENABLED);


    // Set Interrupt priorities    
    INTSetVectorPriority    (INT_VECTOR_UART(UART1), INT_PRIORITY_LEVEL_2);
    INTSetVectorSubPriority (INT_VECTOR_UART(UART1), INT_SUB_PRIORITY_LEVEL_0);

    // configure for multi-vectored mode
    INTConfigureSystem      (INT_SYSTEM_CONFIG_MULT_VECTOR);
    INTEnableInterrupts     ();

    Rs485RxLineConfig();
    Rs485TxLineConfig();
    Rs485TxDisable();
    Rs485RxEnable();

    return TRUE ;
}

#define __UART_1_ISR    __ISR(_UART_1_VECTOR, ipl4)
void __UART_1_ISR  UART_1_InterruptRoutine(void)
{
    UART1Info_count++ ; 
    IFS0CLR = _IFS0_U1RXIF_MASK;
    UART1Info_LastByteRXed = UART1ReceivedValue();
    UART1TransmitTestASCIICharacters( (UART1Info_LastByteRXed+1), 1); //reflect back character, incremented by 1
}

Otra información

  • Procesador: PIC32MX695F512L
  • Compilador: C32 v2.00
  • IDE: MPLAB X IDE

Mi pregunta

¿Cómo creo un controlador de interrupciones al recibir BYTE a través de UART en PIC32 con el compilador C32 v2.00?

Nota: ejemplo de código fuente actualizado con UART init()

Respuestas (1)

Su código de ejemplo no muestra ninguna inicialización para el UART.

¿Está habilitando la interrupción de recepción para el UART? Necesitas hacer algo como esto:

#define BAUDRATE1       (115200)     // the desired BaudRate
#define BRATE1    (FPB/4/BAUDRATE1) 
#define UART1_CONFIG1   UART_EN|UART_BRGH_FOUR      // defaults to 8,N,1
#define UART1_CONFIG2   UART_RX_ENABLE|UART_TX_ENABLE|UART_INT_RX_CHAR              // only RX interrupts

void ConfigureUart1(void)
{
    OpenUART1(UART1_CONFIG1, UART1_CONFIG2, BRATE1); // approx 115200 baud
}

donde FPB se define como la frecuencia de su bus periférico, por ejemplo, 10000000L para 10 MHz.

Luego en main o en otro lugar:

ConfigureUart1();
INTEnableSystemMultiVectoredInt();         
INTEnableInterrupts();
Creo que estoy habilitando la interrupción de recepción para el UART. He actualizado mi pregunta con mi función de inicialización para UART
@Steven, para ver si su problema es con las interrupciones o si el UART está recibiendo caracteres, puede intentar hacer una llamada a UARTReceivedDataIsAvailable(UART1)) dentro de un bucle while(1), y un punto de interrupción en un retorno verdadero que indica un se ha recibido el carácter.
@tcroskey Tiene razón, la función UARTReceivedDataIsAvailable() nunca devuelve verdadero incluso cuando estoy enviando bytes por cable desde mi PC a mi dispositivo. Bien, ahora tengo que averiguar por qué sucede eso. Gracias
@tcroskey Creé una nueva pregunta sobre el tema. electronics.stackexchange.com/questions/21484/…