SYSTEMConfigPerformance no se ejecuta en PIC32

Tengo PIC32MX795F512LMCU y estoy trabajando en su UARTcomunicació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:

  1. Habilitar el almacenamiento en caché de instrucciones y datos
  2. Habilitar captura previa de instrucciones
  3. Configure Flash y SRAM para estados de espera mínimos
  4. Maximizar la frecuencia del reloj del bus periférico

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 8MHZcristal con PLL y finalmente ejecuto mi PIC en 72MHZfrecuencia. 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);
}
}
En una pregunta diferente, ¿el UART finalmente funcionó a 115200 baudios? ¿Qué cambiaste?

Respuestas (2)

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 FPBcon x. Deberia de funcionar.!

si esta funcionando Pero mi función DelayMs no funciona, el retraso de 1 segundo es como 500 ms.

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)
no te entendí ¿Cómo puede FPB ser igual que el reloj del sistema cuando lo configuro FCY/2y FPBDIV=DIV_2en la configuración de fusibles?
@user007 El valor se establece para dividir por 2 inicialmente en el código de inicio oculto de su pragma, pero luego la función SYSTEMConfigPerformance() lo modifica durante el tiempo de ejecución. Es solo otro valor de registro en la memoria como cualquier otra cosa.
@user007 El término "Fusible" no es muy preciso para estos procesadores. Son simplemente valores de registro que se pueden cambiar como cualquier otro código (en su mayoría). No se requieren altos voltajes extraños ni nada para ajustarlos. (algunos registros especiales requieren un código de desbloqueo, pero esa es la excepción)
En ese caso, FCY y FPB se convertirán en lo mismo, lo que creo que afectará otras cosas, como la función de retraso que he creado para proporcionar retraso. Además, entonces no servirá de nada incluirFPBDIV=DIV_2
@ user007 Solo si mantiene la función actual. Puede reemplazarlo con la función que sugerí, y no cambiará su reloj PB y todas sus cosas funcionarán igual.
Pero en todos los ejemplos de Microchip. incluyen este FPB y FPBDIV=DIV_2junto conSYSTEMConfigPerformance()
Supongo que es un copiar y pegar cosas que funcionaron, y luego llamar a una sola función para configurar el PIC32 con la configuración de rendimiento más alta. La función SYSTEMConfig puede ajustar individualmente partes del controlador 'correctamente'.