Tengo PIC32MX795F512L
MCU y estoy trabajando en su UART
comunicación. He hecho el programa y funciona bien. Tenía curiosidad acerca de la frecuencia con la que se ejecuta mi PIC, así que busqué un poco y encontré este documento en línea que dice que:
SYSTEMConfigPerformance() es una función de biblioteca muy útil que se utiliza para optimizar fácilmente el rendimiento del PIC32. Usted proporciona la frecuencia de reloj del sistema (instrucción) y esta función hará el resto. Realizará las siguientes tareas por usted:
Entonces, cuando incluí el SYSTEMConfigPerformance(FCY)
en mi código, mi comunicación UART se detiene y recibí algunos caracteres aleatorios. Cuando excluí el SYSTEMConfigPerformance(FCY)
wwas trabajando bien. No sé la razón detrás de este extraño comportamiento. Estoy usando 8MHZ
cristal con PLL y finalmente ejecuto mi PIC en 72MHZ
frecuencia. El siguiente es el código que estoy usando:
#define FCY 72000000UL
#define FPB (FCY/2)
#define BAUDRATE 9600
#pragma config POSCMOD=HS,FNOSC=PRIPLL
#pragma config FPLLIDIV=DIV_2, FPLLMUL=MUL_18, FPLLODIV=DIV_1
#pragma config FPBDIV=DIV_2, FWDTEN=OFF, CP=OFF, BWP=OFF
int main()
{
SYSTEMConfigPerformance(FCY); //<-- Problem is at this line.
OpenUART1( UART_EN | UART_NO_PAR_8BIT | UART_1STOPBIT, UART_RX_ENABLE | UART_TX_ENABLE, (FPB/16/BAUDRATE)-1 );
while(1)
{
putsUART1("Hello\n");
}
}
void DelayMs( unsigned t)
{
T1CON = 0x8000;
while (t--)
{
TMR1 = 0;
while (TMR1 < FPB/1000);
}
}
Tal vez esto sea tarde pero cuando estés incluyendo SYSTEMConfigPerformance(FCY);
también tendrás que cambiar OpenUART1()
. Intenta lo siguiente:
int x;
x = SYSTEMConfigPerformance(FCY);
OpenUART1( UART_EN | UART_NO_PAR_8BIT | UART_1STOPBIT, UART_RX_ENABLE | UART_TX_ENABLE, (x/16/BAUDRATE)-1 );
Reemplazar FPB
con x
. Deberia de funcionar.!
SYSTEMConfigPerformance() también establece el divisor FPB (frecuencia de bus periférico) en el valor de rendimiento más alto, en este caso el mismo que el reloj de su sistema, por lo que funciona a 72 MHz en lugar de los 36 MHz esperados, por lo que sus suposiciones de velocidad en baudios son incorrectas .
En su lugar, puede llamar a la siguiente función y omitir el indicador de configuración del bus PB:
SYSTEMConfig(FCY, SYS_CFG_WAIT_STATES | SYS_CFG_PCACHE);
La otra opción es ejecutar el bus periférico a 72 MHz y cambiar el valor de #define:
#define FPB (FCY)
FCY/2
y FPBDIV=DIV_2
en la configuración de fusibles?FPBDIV=DIV_2
FPBDIV=DIV_2
junto conSYSTEMConfigPerformance()
SoreDakeNoKoto