Ich arbeite derzeit an einem Projekt, bei dem die Uhr zwischen dem primären Oszillator mit PLL (POSCPLL) und dem FRC und wieder zurück umgeschaltet werden muss.
Ich habe die Uhr als PRIPLL initialisiert, indem ich die Konfigurationsbits verwendet habe:
#pragma config FNOSC = PRIPLL
#pragma config POSCMOD = HS
#pragma config FPLLMUL = MUL_20
#pragma config FPLLIDIV = DIV_2
#pragma config FPLLODIV = DIV_1
#pragma config FPBDIV = DIV_1
#pragma config FCKSM = CSECME
was den OSCCON auf 0x01453360 setzt und ein 80-MHz-Taktsignal liefert. Mit dieser Funktion schalte ich dann auf den FRC um:
INTDisableInterrupts();
//Execute the System unlock sequence
SYSKEY = 0xAA996655;
SYSKEY = 0x556699AA;
OSCCONbits.NOSC = 000;
OSCConfig(OSC_FRC, 0, 0, OSC_FRC_POST_1);
mOSCSetPBDIV(OSC_PB_DIV_1);
//Initiate the clock switch
OSCCONbits.OSWEN = 1;
//Lock SYSKEY
SYSKEY = 0x33333333;
int k = 0;
//Wait until OSWEN = 0 and switch is complete
while (OSCCONbits.OSWEN == 1){
k++;
}
//Re-enable interrupts
INTEnableInterrupts();
SYSTEMConfig(GetStandbySystemClock(), SYS_CFG_ALL);
Um auf die POSC-PLL zurückzuschalten, verwende ich die gleiche Struktur, ändere aber den Wert von NOSC auf 011; und aktualisieren Sie die OSCConfig auf
OSCConfig(OSC_POSC_PLL, OSC_PLL_MULT_20, OSC_PLL_POST_1, 0);
Was mit der Reihenfolge in den Pragma-Konfigurationsbits übereinstimmt. Wenn ich es jedoch auf dem PIC32MX ausführe, kann der Debugger auf einem PICKIT3 mit diesen Setup-Bits nicht an der Funktion vorbeikommen, es ermöglicht jedoch, dass es auf die halbe Geschwindigkeit eingestellt wird (OSC_PLL_POST_2).
Wenn der Debugger jedoch angehalten wird, ist ersichtlich, dass der OSCCON derselbe ist, aber wenn er fortgesetzt wird, startet die Software neu.
Wenn mir jemand sagen könnte, ob ich ein Setup-Bit verpasst habe, um auf die ursprüngliche Uhr zurückzuschalten, oder ob es einen besseren Weg gibt, dies zu tun, wäre ich sehr dankbar!
Zusätzliche Informationen: PIC32MX775F256L, Custom Board, 8MHz Quarz (FOXSDLF/080-20), Der Quarz ist mit OSC1 und OSC2 (Pin 63 und Pin 64) verbunden, Ladekondensatoren 22pF
Vielen Dank im Voraus
EDIT Ich habe jetzt auch versucht, die neue Clock-Quelle einzustellen, ohne die OSCConfig-Funktion zu verwenden und stattdessen die harten Werte zu verwenden.
OSCCONbits.NOSC = 0b011;
OSCCONbits.PLLODIV = 0b000;
OSCCONbits.PLLMULT = 0b101;
OSCCONbits.PBDIV = 0b00;
Wenn PLLODIV 0b000 ist, passiert dasselbe. Wenn es jedoch auf 0b001 eingestellt ist, funktioniert es und das System ist mit halber Geschwindigkeit, da es durch zwei geteilt wird
BEARBEITEN 2
Ich habe jetzt versucht, zwischen den Uhren umzuschalten, ohne die #pragma-Konfigurationsbits zu verwenden, die ich entfernt habe
#pragma config FPLLMUL = MUL_20
#pragma config FPLLODIV = DIV_1
#pragma config FNOSC = PRIPLL
#pragma config FPBDIV = DIV_1
Ich verwende die gleichen Funktionen, um die Uhr überhaupt erst einzurichten, und erhalte das gewünschte Ergebnis ohne Probleme. Ich schalte dann auf die FRC-Uhr um, wieder keine Probleme. Nur wenn ich versuche, auf die ursprüngliche Uhr zurückzuschalten, stoße ich auf ein Problem. Es hilft auch nicht, wenn ich zuerst auf die gleiche Uhr mit anderen Parametern umschalte, bevor ich über den FRC wieder auf die richtigen zurückschalte. Aber es wird funktionieren, wenn ich zuerst auf die Uhr mit anderen Parametern umschalte und dann beim Start über die FRC auf die richtige umschalte.
Ich habe jetzt den Code isoliert, um zu vermeiden, dass ein anderer Code die Taktumschaltung beeinflusst, und es gibt immer noch keinen Unterschied.
Wenn Sie diese Bits als Binär festlegen wollten, müssen Sie dies ändern:
OSCCONbits.NOSC = 000;
dazu:
OSCCONbits.NOSC = 0b000;
Auch wo immer Sie zurücksetzen , sollte es nicht gerade NOSC
eingestellt sein .0b011
011
Ein Präfix von „0“ macht den Wert im XC32-Compiler tatsächlich oktal (wie von @Lundin in den Kommentaren hervorgehoben), was dezimal 9 ist, was == 0b1001 ist, also ist dies sicherlich ein Problem, das behoben werden muss.
Auch im PIC32 Peripheral Library Guide heißt es:
"Im Allgemeinen sollte beim Umschalten auf eine höhere CPU-Taktfrequenz der Peripheral Bus Divisor auf den neuen niedrigeren Wert gesetzt werden, bevor die CPU-Frequenz geändert wird."
Wenn Sie also die Geschwindigkeit erhöhen/verringern, sollten Sie die entsprechende Reihenfolge der folgenden Aufrufe verwenden:
OSCConfig(OSC_FRC, 0, 0, OSC_FRC_POST_1);
mOSCSetPBDIV(OSC_PB_DIV_1);
011
ist oktal (dec 9), also enthält diese Antwort einige Fehler.
Lundin
10
, Hexadezimalschreibweise:0xA
, Oktalschreibweise:012
. Es gibt keine binäre Notation in C, aber eine übliche Nicht-Standard-Erweiterung ist0b1010
.