Skip to content

Commit 68eaf25

Browse files
committed
fix delay after vreg setting to use XOSC clocked CPU
1 parent aaae9cf commit 68eaf25

File tree

2 files changed

+10
-8
lines changed

2 files changed

+10
-8
lines changed

src/rp2_common/hardware_clocks/include/hardware/clocks.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -231,7 +231,7 @@ extern "C" {
231231
#endif
232232
#endif // PICO_RP2040 && SYS_CLK_KHZ == 200000 && XOSC_KHZ == 12000 && PLL_COMMON_REFDIV == 1
233233

234-
// PICO_CONFIG: SYS_CLK_VREG_VOLTAGE_AUTO_ADJUST_DELAY_US, Number of microseconds to wait after updating regular voltage due to SYS_CLK_VREG_VOLTAGE_MIN to allow voltage to settle, type=bool, default=1, advanced=true, group=hardware_clocks
234+
// PICO_CONFIG: SYS_CLK_VREG_VOLTAGE_AUTO_ADJUST_DELAY_US, Number of microseconds to wait after updating regulator voltage due to SYS_CLK_VREG_VOLTAGE_MIN to allow voltage to settle, type=bool, default=1, advanced=true, group=hardware_clocks
235235
#ifndef SYS_CLK_VREG_VOLTAGE_AUTO_ADJUST_DELAY_US
236236
#define SYS_CLK_VREG_VOLTAGE_AUTO_ADJUST_DELAY_US 1000
237237
#endif

src/rp2_common/pico_runtime_init/runtime_init_clocks.c

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -69,13 +69,6 @@ void __weak runtime_init_clocks(void) {
6969
pll_init(pll_usb, PLL_USB_REFDIV, PLL_USB_VCO_FREQ_HZ, PLL_USB_POSTDIV1, PLL_USB_POSTDIV2);
7070
/// \end::pll_init[]
7171

72-
#if SYS_CLK_VREG_VOLTAGE_AUTO_ADJUST && defined(SYS_CLK_VREG_VOLTAGE_MIN)
73-
if (vreg_get_voltage() < SYS_CLK_VREG_VOLTAGE_MIN) {
74-
vreg_set_voltage(SYS_CLK_VREG_VOLTAGE_MIN);
75-
// wait for voltage to settle
76-
busy_wait_us_32(SYS_CLK_VREG_VOLTAGE_AUTO_ADJUST_DELAY_US);
77-
}
78-
#endif
7972
// Configure clocks
8073

8174
// RP2040 CLK_REF = XOSC (usually) 12MHz / 1 = 12MHz
@@ -94,6 +87,15 @@ void __weak runtime_init_clocks(void) {
9487
0,
9588
XOSC_HZ);
9689

90+
// This must be done after we've configured CLK_REF to XOSC due to the need to time a delay
91+
#if SYS_CLK_VREG_VOLTAGE_AUTO_ADJUST && defined(SYS_CLK_VREG_VOLTAGE_MIN)
92+
if (vreg_get_voltage() < SYS_CLK_VREG_VOLTAGE_MIN) {
93+
vreg_set_voltage(SYS_CLK_VREG_VOLTAGE_MIN);
94+
// wait for voltage to settle; must use CPU cycles as TIMER is not yet clocked correctly
95+
busy_wait_at_least_cycles((uint32_t)((SYS_CLK_VREG_VOLTAGE_AUTO_ADJUST_DELAY_US * (uint64_t)XOSC_HZ) / 1000000));
96+
}
97+
#endif
98+
9799
/// \tag::configure_clk_sys[]
98100
// CLK SYS = PLL SYS (usually) 125MHz / 1 = 125MHz
99101
clock_configure_undivided(clk_sys,

0 commit comments

Comments
 (0)