SYSTEMConfigPerformance wird in PIC32 nicht ausgeführt

Ich habe PIC32MX795F512LMCU und arbeite an seiner UARTKommunikation. Ich habe das Programm erstellt und es funktioniert einwandfrei. Ich war neugierig auf die Frequenz, mit der mein PIC läuft, also habe ich ein wenig gesucht und dieses Online- Dokument gefunden , in dem Folgendes steht:

SYSTEMConfigPerformance() ist eine sehr hilfreiche Bibliotheksfunktion, die verwendet wird, um die Leistung des PIC32 einfach zu optimieren. Sie geben die Taktfrequenz des Systems (Anweisung) an und diese Funktion erledigt den Rest. Folgende Aufgaben übernimmt er für Sie:

  1. Aktivieren Sie das Zwischenspeichern von Anweisungen und Daten
  2. Befehlsvorabruf aktivieren
  3. Konfigurieren Sie Flash und SRAM für minimale Wartezustände
  4. Maximieren Sie die Taktfrequenz des peripheren Busses

Als ich das SYSTEMConfigPerformance(FCY)in meinen Code einfügte, stoppte meine UART-Kommunikation und ich erhielt einige zufällige Zeichen. Als ich das ausschloss, SYSTEMConfigPerformance(FCY)funktionierte es einwandfrei. Ich kenne den Grund für dieses seltsame Verhalten nicht. Ich verwende 8MHZKristall mit PLL und betreibe schließlich meinen PIC mit 72MHZFrequenz. Folgendes ist der Code, den ich verwende:

#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);
}
}
Bei einer anderen Frage, hat der UART endlich bei 115200 Baud funktioniert? Was hast du geändert?

Antworten (2)

Vielleicht ist das spät, aber wenn Sie dazugehören, SYSTEMConfigPerformance(FCY);müssen Sie sich auch umziehen OpenUART1(). Versuchen Sie Folgendes:

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

Ersetzen Sie FPBdurch x. Es sollte funktionieren.!

ja es funktioniert. Aber meine DelayMs-Funktion funktioniert nicht, Verzögerung 1 Sekunde ist wie 500 ms.??

SYSTEMConfigPerformance() setzt auch den FPB-Teiler (Peripheral Bus Frequency) auf den höchsten Leistungswert, in diesem Fall den gleichen wie Ihre Systemuhr, sodass er mit 72 MHz statt mit Ihren erwarteten 36 MHz läuft, daher sind Ihre Baudraten-Annahmen falsch .

Sie können stattdessen die folgende Funktion aufrufen und das PB-Bus-Konfigurationsflag weglassen:

SYSTEMConfig(FCY, SYS_CFG_WAIT_STATES | SYS_CFG_PCACHE);

Die andere Möglichkeit besteht darin, den Peripheriebus stattdessen einfach mit 72 MHz zu betreiben und einfach Ihren #define-Wert zu ändern:

#define FPB (FCY)
Ich habe dich nicht verstanden. Wie kann FPB mit der Systemuhr identisch sein, wenn ich sie in den Sicherungseinstellungen auf FCY/2& setze?FPBDIV=DIV_2
@user007 Der Wert wird zunächst im versteckten Startcode Ihres Pragmas auf eine Division durch 2 gesetzt, aber dann wird er während der Laufzeit von der Funktion SYSTEMConfigPerformance() geändert. Es ist nur ein weiterer Registerwert im Speicher wie alles andere.
@ user007 Der Begriff "Sicherung" ist für diese Prozessoren nicht sehr genau. Sie sind einfach Registerwerte, die wie jeder andere Code (meistens) geändert werden können. Es sind keine seltsamen Hochspannungen oder ähnliches erforderlich, um sie einzustellen. (Einige spezielle Register erfordern einen Freischaltcode, aber das ist die Ausnahme)
In diesem Fall werden FCY und FPB gleich, was meiner Meinung nach andere Dinge beeinflussen wird, wie die Verzögerungsfunktion, die ich erstellt habe, um eine Verzögerung bereitzustellen. Auch dann nützt das Einschließen nichtsFPBDIV=DIV_2
@user007 Nur wenn Sie die aktuelle Funktion beibehalten. Sie können es durch die von mir vorgeschlagene Funktion ersetzen, und es wird Ihre PB-Uhr nicht ändern, und Sie werden alle gleich funktionieren.
Aber in allen Beispielen von Microchip. Sie beinhalten dieses FPB und FPBDIV=DIV_2zusammen mitSYSTEMConfigPerformance()
Ich denke, das ist ein Kopieren und Einfügen von Dingen, die funktioniert haben, und dann eine einzelne Funktion aufrufen, um den PIC32 mit den höchsten Leistungseinstellungen zu konfigurieren. Die SYSTEMConfig-Funktion kann einzelne Teile des Controllers „richtig“ abstimmen.