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

2

Soy bastante nuevo en PIC y MCU. Mi placa tiene PIC24FJ256GA410 MCU 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 el MCU con un código que llama a InitUART() , mi placa se convierte en no programable . Cada intento de programación me da el error Error al programar el 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 la programación. Si comento la llamada InitUART() , puedo programar el tablero nuevamente. ¿Cuál es el problema con mi código? Es casi idéntico al código de la hoja de datos de dsPIC33-PIC24 FRM - UART , excepto que no escribo los valores predeterminados. Además, he visto otros ejemplos en Internet y mi es bastante similar. Configuré solo el pin de salida.

EDITAR: Después de comentar la asignación a _RP11R en la función InitUART() , puedo programar con éxito el tablero cada vez. AFAIK, necesito seleccionar pin para el perferial UART1 también. Pero una vez que configuro el _RP11R , la placa se convierte en no programable (y UART1 no funciona de todos modos). Estoy bastante seguro de que RP11 es el pin de salida de 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;
}
    
pregunta woky

1 respuesta

0

Tuve malas conexiones de cable. El pin TX se conectó al suelo.

Mi colega dice: Si no funciona, compruebe los cables. Si los cables están bien y aún no funcionan, revíselos nuevamente.

    
respondido por el woky

Lea otras preguntas en las etiquetas