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

2

Soy muy nuevo en los chips PIC32 (o en cualquier chip PIC) y estoy tratando de crear un controlador de interrupciones para que se llame el UART cuando el UART recibe un byte. Estoy utilizando el procesador PIC32MX695F512L PIC32 con 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 recibe un byte. Agregué un punto de interrupción a esta función y un contador estático para contar cuántas veces se ha ejecutado esta función.

En otras partes del código fuente, puedo enviar BYTES fuera de la 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 manejador 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 ()

    
pregunta Steven smethurst

1 respuesta

1

Su código de ejemplo no muestra ninguna de las inicializaciones 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();
    
respondido por el tcrosley

Lea otras preguntas en las etiquetas