Estoy usando un PIC24. Después de resolver el problema con el PLL ( el módulo PIC24 PLL siempre está fuera de bloqueo ) Estoy luchando con una gran variación en la frecuencia del sistema. Escribí un pequeño código que se usa para medir la frecuencia del sistema usando el temporizador LPRC interno. El oscilador primario FOSC es de 8 MHZ y con PLL se empuja a 32 MHz. El FCY es FOSC / 2 (16MHZ). Mi código está leyendo un FCY de 15.522 MHz, que es un 3 por ciento de la frecuencia real esperada. Como resultado, no puedo conectar mi PC a la UART que funciona a 38400 bps para la depuración.
Creo que el puerto serie de mi computadora no puede tolerar una desviación tan alta en la velocidad en baudios y, por lo tanto, causa un error de trama del puerto serie. Por favor sugiera una manera de mejorar mi frecuencia.
Aquí está mi función uartInit
#define peripheralPinSelectUnLock() do { OSCCON = 0x46; OSCCON = 0x57; OSCCONbits.IOLOCK = 0; } while(0)
#define peripheralPinSelectLock() do { OSCCON = 0x46; OSCCON = 0x57; OSCCONbits.IOLOCK = 1; } while(0)
#define UART1_BAUD_RATE (38400ul)
uint32_t ui32Fcy=16000000;
unsigned long int baudRateDivider = ((ui32Fcy/(4*UART1_BAUD_RATE))-1);
peripheralPinSelectUnLock(); // PPS Unlock
PPSInput(PPS_U1RX, PPS_RP30); // RF2/RP30 as U1RX
PPSOutput(PPS_RP16, PPS_U1TX); // RF3/RP16 as U1TX
TRISFbits.TRISF2 = 1; // RF2/RP30 is set for input (RX)
TRISFbits.TRISF3 = 0; // RF3/RP16 is set for output (TX)
peripheralPinSelectLock(); // PPS Lock
U1BRG = baudRateDivider; // Divides to UART_BAUD_RATE
U1MODEbits.UARTEN = 1; // UART2 is Enabled
U1MODEbits.ABAUD = 0; // auto baud is disabled
U1MODEbits.BRGH = 1; // Low baud rate ?
U1STAbits.UTXEN = 1;
IFS0bits.U1RXIF = 0; // clear interrupt flag of rx
IEC0bits.U1RXIE = 1;
IPC2bits.U1RXIP = 7; // enable rx recieved data interrupt
El valor de U1BRG (variable de observación) es 103 para una tasa de baudios de 38400. Gracias por cualquier ayuda.