PIC32 no recibe interrupciones de RX de UART en el compilador xc32

1

Estoy intentando configurar un canal UART en mi MCU PIC32 (PIC32MX470F512). Pero el código no alcanza el ISR en absoluto.

He verificado que el PPS (selección de pin periférico) está configurado correctamente y la recepción de UART en el modo de sondeo funciona perfectamente bien. Además, la parte de transmisión funciona sin problemas desde el primer día. Pero necesito que UART rx funcione con interrupciones para mi aplicación.

Al principio intenté usar el plib (que tampoco funcionó) pero luego decidí codificarlo manualmente para eliminar cualquier problema causado por la biblioteca. Aquí está la configuración que he hecho.

void UART1Inint(unsigned long int baudRate) {
  ANSELDCLR = 0xFFFF;
  CFGCONbits.IOLOCK = 0;      // PPS Unlock
  RPD11Rbits.RPD11R = 3;        // Assign RPD11 as U1TX
  U1RXRbits.U1RXR = 3;      // Assign RPD10 as U1RX
  CFGCONbits.IOLOCK = 1;      // PPS Lock

  // Baud related stuffs.
  U1MODEbits.BRGH = 1;      // Setup High baud rates.
  unsigned long int baudRateDivider = ((GetSystemClock()/(4*baudRate))-1);
  U1BRG = baudRateDivider;  // set BRG

  // UART Configuration
  U1MODEbits.ON = 1;    // UART1 module is Enabled
  U1STAbits.UTXEN = 1;  // TX is enabled
  U1STAbits.URXEN = 1;  // RX is enabled

  // UART Rx interrupt configuration.
  IFS1bits.U1RXIF = 0;  // Clear the interrupt flag
  IFS1bits.U1TXIF = 0;  // Clear the interrupt flag

  INTCONbits.MVEC = 1;  // Multi vector interrupts.

  IEC1bits.U1RXIE = 1;  // Rx interrupt enable
  IEC1bits.U1EIE = 1;
  IPC7bits.U1IP = 7;    // Rx Interrurpt priority level
  IPC7bits.U1IS = 3;    // Rx Interrurpt sub priority level
}

Y aquí es cómo se ve mi ISR,

void __attribute__((vector(_UART_1_VECTOR), interrupt(IPL7SRS), nomips16)) UART1_ISR(void)
{
  PORTAbits.RA4 = 1;    // LED to indicate the ISR.
  char curChar = U1RXREG;
  U1TXREG=curChar;  // Echo back the same character.
  while(!U1STAbits.TRMT);
  IFS1bits.U1RXIF = 0;  // Clear the interrupt flag!
}

Estoy haciendo dos tipos de pruebas en el bucle principal. Uno sondeará los datos en rx y luego los devolverá al usuario. El otro monitoreará la bandera RILDE y encenderá un LED para mostrar cuando el pin rx está realmente activo. También alterna un grupo de LED para los indicadores de error (menos de 3 bits significativos en el registro U1STA) en el módulo UART1.

Ambas pruebas funcionan bien, lo que indica que el módulo UART está bien configurado. Sólo la parte de interrupción es defectuosa. Así que probé este código en la placa de desarrollo Explorer 16, la placa de desarrollo de audio Bluetooth y el kit de inicio de Ethernet. Hice esto para eliminar cualquier problema relacionado con el hardware, ya que las tres placas son certificadas por microchip.

No sé lo que me estoy perdiendo, ayúdame a solucionar este problema. Cualquier ayuda sería apreciada grandemente.

    
pregunta Siddharth

1 respuesta

1

Sería genial si dices cómo estás depurando o verificando si el UART está funcionando correctamente o no.

Pero sugeriría algunas cosas a las que debes mirar. Y te ayudará a Encuentra el problema por ti mismo.

  1. Compruebe si los pines RX y TX se configuraron correctamente desde la hoja de datos.

  2. Problema al disparar sus conexiones de h / w: Verifique si RX y TX se conectaron correctamente RX - Debería ir a TX de TX de chip de destino - Debería ir al RX del chip de destino que estaba comunicando.

  3. ¿Funciona bien tu UART?

Debería ver si las señales se transmiten en el modo TX.

main()
{
    while(1)
    {
        uart_send('a');  //Some function like this or as you can code.
    }
}
  1. Si 1,2 y 3 funcionan, intente la recepción a través del pin RX también. Puede probar aplicaciones de terminal en serie para ver si su UART funciona bien. El 90% del tiempo es error de conexión y velocidad de transmisión.
respondido por el Rookie91

Lea otras preguntas en las etiquetas