Я довольно новичок в 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;
}
У меня были плохие кабельные соединения. Контакт TX был подключен к земле.
Мой коллега говорит: Если не работает, проверьте кабели. Если с кабелями все в порядке, но он по-прежнему не работает, проверьте кабели еще раз.
аммар.cma
сонный
сонный