PIC24FJ256GA410, UART-Interrupt, Einfrieren nach Aktivierung

Ich bin ziemlich neu in PIC und MCUs. Mein Board hat eine PIC24FJ256GA410 MCU mit externem 3,6864-MHz-Quarz. Ich möchte UART1 für Debugging-Zwecke verwenden. Unten ist meine main(), die nur UART1 initialisiert. Sobald ich jedoch die MCU mit Code programmiere, der aufruft InitUART(), wird mein Board unprogrammierbar . Bei jedem Programmierversuch kommt es zu einem Fehler beim Programmieren des Geräts . Manchmal schreibt es auch so etwas in die Konsole:

Address: 278 Expected Value: eb0000 Received Value: a90000

oder

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

Ich verwende Microchip ICD3 und MPLAB X IDE zum Programmieren. Wenn ich den Aufruf auskommentiere InitUART(), kann ich das Board neu programmieren. Was ist das Problem mit meinem Code? Es ist größtenteils identisch mit dem Code aus dem dsPIC33-PIC24 FRM - UART- Datenblatt, außer dass ich keine Standardwerte schreibe. Außerdem habe ich andere Beispiele im Internet gesehen und meine ist ziemlich ähnlich. Ich habe nur den Ausgangspin konfiguriert.

EDIT: Nachdem ich die Zuweisung zu _RP11Rin InitUART()Funktion kommentiert habe, kann ich das Board jedes Mal erfolgreich programmieren. AFAIK, ich muss auch den Pin für das UART1-Peripheriegerät auswählen. Aber sobald ich das setze _RP11R, wird das Board unprogrammierbar (und UART1 funktioniert sowieso nicht). Ich bin mir ziemlich sicher, dass dies RP11der richtige UART-Ausgangspin ist.

#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;
}
Überprüfen Sie, ob Ihre UART-Pins nicht diejenigen sind, die Sie zum Programmieren der Karte verwenden, dh PGEC/PGED-Pins sind nicht als UART1-Pins konfiguriert.
Nö. Im Code konfiguriere ich nur den Ausgangspin. Wenn ich das richtig verstehe, sind die Ausgangspins der Peripheriegeräte standardmäßig getrennt und die Eingangspins der Peripheriegeräte mit Vdd verbunden.
PGECx/PGEDx befinden sich auf verschiedenen RPx-Pins auf meiner MCU.

Antworten (1)

Ich hatte schlechte Kabelverbindungen. Der TX-Pin wurde mit Masse verbunden.

Mein Kollege sagt: Wenn es nicht funktioniert, Kabel überprüfen. Wenn die Kabel in Ordnung sind und es immer noch nicht funktioniert, überprüfen Sie die Kabel erneut.