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.