SYSTEMConfigPerformance no se ejecuta en PIC32

4

Tengo PIC32MX795F512L MCU y estoy trabajando en su comunicación UART . He hecho el programa y está funcionando bien. Tenía curiosidad acerca de la frecuencia con la que se ejecuta mi PIC, por lo que busqué un poco y encontré este documento en línea 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 para usted:

  1. Habilitar el almacenamiento en caché de instrucciones y datos
  2. Habilitar búsqueda previa de instrucción
  3. Configure Flash y SRAM para estados de espera mínimos
  4. Maximice la frecuencia del reloj del bus periférico

Entonces, cuando incluí SYSTEMConfigPerformance(FCY) en mi código, mi comunicación UART se detiene y recibía algunos caracteres aleatorios. Cuando excluí SYSTEMConfigPerformance(FCY) estaba funcionando bien. No sé la razón detrás de este extraño comportamiento. Estoy usando 8MHZ crystal con PLL y finalmente ejecuto mi PIC en 72MHZ de frecuencia. A continuación está 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);
}
}
    
pregunta user007

2 respuestas

1

Tal vez sea tarde, pero cuando incluyas SYSTEMConfigPerformance(FCY); también tendrás que cambiar OpenUART1() . Intenta seguir:

int x;
x = SYSTEMConfigPerformance(FCY);
OpenUART1( UART_EN | UART_NO_PAR_8BIT | UART_1STOPBIT, UART_RX_ENABLE | UART_TX_ENABLE, (x/16/BAUDRATE)-1 );

Reemplaza FPB con x . Debería funcionar.!

    
respondido por el Aircraft
2

SYSTEMConfigPerformance () también establece el divisor de FPB (frecuencia de bus periférico) en el valor de rendimiento más alto, en este caso igual al reloj del sistema, por lo que se ejecuta a 72 MHz en lugar de los 36 MHz esperados, por lo tanto, su velocidad de transmisión las suposiciones 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 simplemente ejecutar el bus periférico a los 72 MHz, y simplemente cambiar su valor #define:

#define FPB (FCY)
    
respondido por el justing

Lea otras preguntas en las etiquetas