Forum: Mikrocontroller und Digitale Elektronik rp2040 Initialisierung pll_sys


von Schorsch X. (bastelschorsch)


Lesenswert?

Hallo zusammen,
ich versuche inzwischen seit Stunden meinem RP2040 den Takt der PLL_SYS 
zu verpassen. Irgendwie bleibt der Takt immer auf der clock_ref hängen, 
egal in welcher Reihenfolge und Versuchen ich das probiere. IDE ist 
Segger Embedded Studio. Das funktioniert eigentlich sehr ordentlich 
zusammen mit einem JLINK Ultra.
Fertige Beispiele anderer IDEs laufen mit der pll_sys.
Ich initialisiere die PLL, dann den clock_sys, aber ich kann immer nur 
zwischen rosc und xosc umschalten auf der clock_ref. Ein Umschalten des 
Taktes auf die clock_sys klappt einfach nicht.

Hat vielleicht jemand eine Idee dazu, welche Abhägigkeiten dabei zu 
beachten sind. Die anderen clock Teile werden nicht verwendet, ebenso 
die pll_usb.

besten Dank an die Leser meines Textes

Schorsch

von Mi N. (msx)


Lesenswert?

Schorsch X. schrieb:
> aber ich kann immer nur
> zwischen rosc und xosc umschalten auf der clock_ref.

Als 3. Quelle gibt es nur noch eine AUXSRC.
Was schreibst Du ins CLOCK_REF_CTRL Register?

Es gehen nicht unbedingt immer die Sachen so, wie man es erwarten 
könnte.

von Schorsch X. (bastelschorsch)


Lesenswert?

Das CLR_REF_CTRL kann ich nur noch auf die pll_usb schalten (nach 
Datenblatt). Nach Datenblatt soll aber doch der CLK_SYS die CPUs 
versorgen ???


Ich stell mir das bei clk_sys so vor

das src Feld kann den Takt auf
0x0 → clk_ref
0x1 → clksrc_clk_sys_aux

legen. Und das clksrc_clk_sys_aux kann mit dem Feld AUXSRC auf
0x0 → clksrc_pll_sys
0x1 → clksrc_pll_usb
0x2 → rosc_clksrc
0x3 → xosc_clksrc
0x4 → clksrc_gpin0
0x5 → clksrc_gpin1
gestellt werden. Ich hab daher folgendes gemacht:

  CLOCKS->CLK_SYS_CTRL = 0x41; // aux=rosc, aux
  CLOCKS->CLK_SYS_DIV  = 0x100;
  CLOCKS->CLK_SYS_CTRL = 0x01; // aux=pllsys, aux

Der Takt wird aber immer noch vom CLK_REF an die CPU geliefert. Diese 
kann ich zwischen rosc und xosc umschalten. Imm Datenblatt wird 
irgendwas von einem Enable gefaselt, aber im SYS_CTRL Register ist davon 
nicht angegeben. Und irgendwie wird immer mal wieder das CLK_GPOUT0 
erwähnt. Mir ist nicht klar, was das damit zu tun haben soll ???

: Bearbeitet durch User
von Gustl B. (gustl_b)


Lesenswert?

Schorsch X. schrieb:
> Der Takt wird aber immer noch vom CLK_REF an die CPU geliefert.

Das siehst du woran? Wenn die PLL auf Faktor 1 steht kommt da exakt die 
gleiche Taktfrequenz raus.

von Schorsch X. (bastelschorsch)


Lesenswert?

Wenn ich das CLK_SYS_DIV Register verstelle passiert nix, aber wenn ich 
CLK_REF_DIV verstelle. Muss ich denn auf irgendetwas warten beim 
umschalten , z.B. dass das CLK_SYS_SELECTED Register verstellt ist. Ich 
vermute, dass die Zeit reichen sollte, wenn ich im single step durch 
mein Programm laufe ???

von Mi N. (msx)


Lesenswert?

Die betreffenden Register kann zur Laufzeit verändern, auch ohne 
Einzelschrittbetrieb.
Was willst Du überhaupt erreichen?

von Schorsch X. (bastelschorsch)


Lesenswert?

Hallo Mi N.,
ich hab deine Initialisierung mal angesehen und nachvollzogen. Damit 
klappt es offenbar. Jetzt ist der CLK_SYS der Versorger der CPU und 
ensprechend einstellbar. Ich bin nicht sicher, ob alles andere passt, 
aber das sieht schon gut aus. Vielen, vielen Dank für deine Hilfe.

Ich hab nur immer noch keine Idee, was ich anders mache. Evtl. ist es 
einfach die Reihenfolge.

Besten Dank für Eure Anregungen und Hilfe. Mal sehen, ob das so weiter 
funktioniert. :-)

Schorsch

von C-hater (c-hater)


Lesenswert?

Schorsch X. schrieb:

> Wenn ich das CLK_SYS_DIV Register verstelle passiert nix, aber wenn ich
> CLK_REF_DIV verstelle.

Die PLLs haben mehr als nur zwei einstellbare Größen. Es sind insgesamt 
im Wesentlichen fünf. Und alle fünf müssen sinnvoll eingestellt werden. 
Und man kann sie nur dann umkonfigurieren, wenn die PLL gerade nicht 
aktiv ist (insbesondere natürlich nicht als Quelle for CLK_SYS).

Vielleicht liest du einfach mal die Datenblätter, bevor du sinnlos 
rumhackst.

von Mi N. (msx)


Lesenswert?

C-hater schrieb:
> Und man kann sie nur dann umkonfigurieren, wenn die PLL gerade nicht
> aktiv ist

Das FBDIC_INT Register von PLL_SYS kann man zur Laufzeit prima 
verstellen. Und POSTDIV1 und POSTDIV2 natürlich auch, solange man nicht 
zu hoch übertaktet.
RP2040 ist eben kein STM32.

C-hater schrieb:
> Vielleicht liest du einfach mal die Datenblätter,

Das gilt auch für Dich.

von C-hater (c-hater)


Lesenswert?

Mi N. schrieb:

> Das FBDIC_INT Register von PLL_SYS kann man zur Laufzeit prima
> verstellen. Und POSTDIV1 und POSTDIV2 natürlich auch, solange man nicht
> zu hoch übertaktet.

Ja, machen kann man eine Menge, was durch die Hardware nicht explizit 
verhindert wird. Aber ob das auch sinnvoll ist, steht auf einem ganz 
anderen Blatt.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.