1
6
7
16
17
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
43
44
45
55
56
/* ... */
#include "pico.h"
#include "hardware/clocks.h"
#include "hardware/platform_defs.h"
#include "hardware/regs/xosc.h"
#include "hardware/xosc.h"
5 includes
#if XOSC_HZ < (1 * MHZ) || XOSC_HZ > (50 * MHZ)
#error XOSC_HZ must be in the range 1,000,000-50,000,000 i.e. 1-50MHz XOSC frequency/* ... */
#endif
#define STARTUP_DELAY ((((XOSC_HZ / KHZ) + 128) / 256) * PICO_XOSC_STARTUP_DELAY_MULTIPLIER)
#if STARTUP_DELAY >= (1 << 13)
#error PICO_XOSC_STARTUP_DELAY_MULTIPLIER is too large: XOSC STARTUP.DELAY must be < 8192
#endif
void xosc_init(void) {
xosc_hw->ctrl = XOSC_CTRL_FREQ_RANGE_VALUE_1_15MHZ;
xosc_hw->startup = STARTUP_DELAY;
hw_set_bits(&xosc_hw->ctrl, XOSC_CTRL_ENABLE_VALUE_ENABLE << XOSC_CTRL_ENABLE_LSB);
while(!(xosc_hw->status & XOSC_STATUS_STABLE_BITS)) {
tight_loop_contents();
}while (!(xosc_hw->status & XOSC_STATUS_STABLE_BITS)) { ... }
}{ ... }
void xosc_disable(void) {
uint32_t tmp = xosc_hw->ctrl;
tmp &= (~XOSC_CTRL_ENABLE_BITS);
tmp |= (XOSC_CTRL_ENABLE_VALUE_DISABLE << XOSC_CTRL_ENABLE_LSB);
xosc_hw->ctrl = tmp;
while(xosc_hw->status & XOSC_STATUS_STABLE_BITS) {
tight_loop_contents();
}while (xosc_hw->status & XOSC_STATUS_STABLE_BITS) { ... }
}{ ... }
void xosc_dormant(void) {
xosc_hw->dormant = XOSC_DORMANT_VALUE_DORMANT;
while(!(xosc_hw->status & XOSC_STATUS_STABLE_BITS)) {
tight_loop_contents();
}while (!(xosc_hw->status & XOSC_STATUS_STABLE_BITS)) { ... }
}{ ... }