Die Uhrumschaltung bleibt beim Zurückschalten auf die ursprüngliche Quelle hängen

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.

Für die Dezimalzahl 10 lautet die Dezimalschreibweise: 10, Hexadezimalschreibweise: 0xA, Oktalschreibweise: 012. Es gibt keine binäre Notation in C, aber eine übliche Nicht-Standard-Erweiterung ist 0b1010.

Antworten (1)

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 NOSCeingestellt sein .0b011011

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);
Danke, ich habe das hinzugefügt, aber keine Änderungen am Ergebnis für mein Problem. Es scheint, dass es durch Ändern des PLLODIV auf 0b001 nicht hängen bleibt, aber dann offensichtlich die halbe Geschwindigkeit gibt. Irgendwelche Ideen, warum es hängen bleiben würde, wenn PLLODIV auf 0b000 gesetzt wird?
@MattWinstanley Ich kann im Datenblatt kein offensichtliches Problem damit erkennen. Es ist nicht so, dass das PICKit einen Reset erzwingt oder etwas Dummes, oder?
Ich habe es jetzt mit einem ICD3-Programmierer versucht und wenn es nicht im Debugging-Modus ist, passiert das gleiche wieder. Diesmal wird es nicht zurückgesetzt, aber MPLAB erlaubt Ihnen nicht, das Programm fortzusetzen. Es ist wahrscheinlich etwas lächerlich Dummes, aber nur das eine bisschen zu finden, um es zu ändern, damit es funktioniert, erweist sich als immer schwieriger!
@MattWinstanley Siehe aktualisierte Antwort, könnte sie relevant sein?
Danke, ich habe versucht, es in alle möglichen Positionen zu verschieben, aber kein Glück. Ich denke, mein nächster Schritt besteht darin, zu versuchen, den Oszillator mit einem ähnlichen Prozess am Anfang des Codes zu starten, und die Verwendung der #pragma-Konfiguration zu vermeiden, um zu sehen, ob das einen Unterschied macht. Im Moment nur an einem Ansatz von "Probieren Sie alles aus und sehen Sie, was sich ändert".
011ist oktal (dec 9), also enthält diese Antwort einige Fehler.
@Lundin Danke, gut entdeckt - ich habe meine Antwort aktualisiert, mit Anerkennung Ihres Kommentars.
@Lundin Wenn also im Datenblatt angegeben ist, dass das NOSC-Bit auf 011 gesetzt werden soll, auf welchen Wert ist es korrekt? sollen es nur 3 sein? Datenblatt sagt folgendes: Bit 10-8 NOSC<2:0>: New Oscillator Selection Bits 111 = Internal Fast RC Oscillator (FRC) dividiert durch OSCCON<FRCDIV> Bits 110 = Internal Fast RC Oscillator (FRC) dividiert durch 16 101 = Interner Low-Power RC (LPRC) Oszillator 100 = Sekundäroszillator (SOSC) 011 = Primäroszillator mit PLL-Modul (XTPLL, HSPLL oder ECPLL) - Entschuldigung für den horrenden Abstand
@MattWinstanley Das Datenblatt verwendet offensichtlich die binäre Notation.
@RogerRowland Ich habe gerade die Frage mit einigen weiteren Testfällen bearbeitet, wenn Sie irgendwelche Ideen haben?
@Lundin Ich habe die Werte aktualisiert, um 0b11 zu lesen, und es auch mit 3 versucht, und beides macht keinen Unterschied. Der Compiler scheint die Befehle zu erkennen, da er anfangs umschalten kann (siehe Bearbeiten 2), kann dann aber nicht mit Parametern, die ich verwenden möchte, zurück zur Uhr wechseln.
@RogerRowland Danke für all deine Hilfe. Habe jetzt dort gepostet