Ich habe PIC32MX795F512L
MCU und arbeite an seiner UART
Kommunikation. 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:
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 8MHZ
Kristall mit PLL und betreibe schließlich meinen PIC mit 72MHZ
Frequenz. 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);
}
}
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 FPB
durch x
. Es sollte funktionieren.!
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)
FCY/2
& setze?FPBDIV=DIV_2
FPBDIV=DIV_2
FPBDIV=DIV_2
zusammen mitSYSTEMConfigPerformance()
SoreDakeNoKoto