PIC24FJ256GA410, interrupción de UART, congelación después de habilitar

Soy bastante nuevo en PIC y MCU. Mi placa tiene MCU PIC24FJ256GA410 con cristal externo de 3.6864 MHz. Me gustaría usar UART1 para fines de depuración. A continuación se muestra mi main()que solo inicializa UART1. Sin embargo, una vez que programo la MCU con un código que llama InitUART(), mi placa se vuelve no programable . Cada intento de programación me da Error al programar el error del dispositivo. Además, a veces, escribe algo como esto en la consola:

Address: 278 Expected Value: eb0000 Received Value: a90000

o

The programmer could not be started: Could not connect to tool hardware: ICD3PlatformTool, com.microchip.mplab.mdbcore.ICD3Tool.ICD3DbgToolManager

Estoy usando Microchip ICD3 y MPLAB X IDE para programar. Si comento la InitUART()llamada, puedo volver a programar la placa. ¿Cuál es el problema con mi código? Es casi idéntico al código de dsPIC33-PIC24 FRM - hoja de datos UART excepto que no escribo valores predeterminados. Además, he visto otros ejemplos en Internet y el mío es bastante similar. Configuré solo el pin de salida.

EDITAR: después de comentar la asignación en _RP11Rfunción InitUART(), puedo programar con éxito el tablero cada vez. AFAIK, también necesito seleccionar el pin para el periférico UART1. Pero una vez que configuro el _RP11R, la placa se vuelve no programable (y UART1 no funciona de todos modos). Estoy bastante seguro de que RP11es el pin de salida UART correcto.

#include <xc.h>

#define FOSC 3686400
#define FCY (FOSC/2)

#include <libpic30.h>

#pragma config JTAGEN = OFF
#pragma config GWRP = OFF
#pragma config FWDTEN = OFF
#pragma config ICS = PGx3
#pragma config FWPSA = PR128
#pragma config WDTPS = PS2048
#pragma config FCKSM = CSECMD
#pragma config OSCIOFCN = OFF
#pragma config POSCMOD = XT
#pragma config FNOSC = PRI

#define BAUDRATE 115200

static void InitUART(void)
{
    __builtin_write_OSCCONL(OSCCON & 0xbf);
    _RP11R = _RPOUT_U1TX;
    __builtin_write_OSCCONL(OSCCON | 0x40);
    U1BRG = (int) (FCY/(16 * BAUDRATE) - 1);
    _U1TXIE = 1;
    U1MODEbits.UARTEN = 1;
    U1STAbits.UTXEN = 1;
}


void __attribute__((__interrupt__, auto_psv)) _U1TXInterrupt(void)
{
    _U1TXIF = 0;
}

int main(void)
{
    TRISBbits.TRISB3 = 0;
    LATBbits.LATB3 = 0;

    InitUART();

    int i = 0;
    while (1) {
        LATBbits.LATB3 = i;
        i = !i;
        __delay_ms(500);
    }

    return 0;
}
Compruebe si sus pines UART no son los que está utilizando para programar la placa, es decir, los pines PGEC/PGED no están configurados como pines UART1.
No. En el código, configuro solo el pin de salida. Si entiendo correctamente, por defecto, los pines de salida periféricos están desconectados y los pines de entrada periféricos están vinculados a Vdd.
PGECx/PGEDx están en diferentes pines RPx en mi MCU.

Respuestas (1)

Tenía malas conexiones de cable. El pin TX estaba conectado a tierra.

Mi colega dice: Si no funciona revisa los cables. Si los cables están bien y aún no funciona, verifique los cables nuevamente.