PIC24FJ256GA410, прерывание UART, зависание после включения

Я довольно новичок в PIC и MCU. На моей плате установлен микроконтроллер PIC24FJ256GA410 с внешним кристаллом 3,6864 МГц. Я хотел бы использовать UART1 для целей отладки. Ниже мой main(), который просто инициализирует UART1. Однако, как только я запрограммирую микроконтроллер кодом, вызывающим InitUART(), моя плата становится непрограммируемой . Каждая попытка программирования выдает ошибку «Не удалось запрограммировать устройство» . Также иногда в консоль пишет что-то вроде этого:

Address: 278 Expected Value: eb0000 Received Value: a90000

или

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

Я использую Microchip ICD3 и MPLAB X IDE для программирования. Если я закомментирую вызов InitUART(), я смогу снова запрограммировать плату. В чем проблема с моим кодом? Он в основном идентичен коду из таблицы данных dsPIC33-PIC24 FRM — UART, за исключением того, что я не пишу значения по умолчанию. Кроме того, я видел другие примеры в Интернете, и мой очень похож. Я настроил только выходной пин.

РЕДАКТИРОВАТЬ: После того, как я прокомментирую назначение _RP11Rфункции InitUART(), я могу каждый раз успешно программировать доску. Насколько я знаю, мне также нужно выбрать контакт для периферийного устройства UART1. Но как только я устанавливаю _RP11R, плата становится непрограммируемой (и UART1 все равно не работает). Я почти уверен, что это RP11правильный выходной контакт UART.

#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;
}
Проверьте, не являются ли ваши выводы UART теми, которые вы используете для программирования платы, т. е. выводы PGEC/PGED не сконфигурированы как выводы UART1.
Неа. В коде я настраиваю только выходной пин. Если я правильно понимаю, по умолчанию периферийные выходные контакты отключены, а периферийные входные контакты привязаны к Vdd.
PGECx/PGEDx находятся на разных выводах RPx на моем MCU.

Ответы (1)

У меня были плохие кабельные соединения. Контакт TX был подключен к земле.

Мой коллега говорит: Если не работает, проверьте кабели. Если с кабелями все в порядке, но он по-прежнему не работает, проверьте кабели еще раз.