Expand description
Clocks (CLOCKS)
§Usage simple
use rp235x_hal::{self as hal, clocks::init_clocks_and_plls, watchdog::Watchdog};
let mut peripherals = hal::pac::Peripherals::take().unwrap();
let mut watchdog = Watchdog::new(peripherals.WATCHDOG);
const XOSC_CRYSTAL_FREQ: u32 = 12_000_000; // Typically found in BSP crates
let mut clocks = init_clocks_and_plls(
XOSC_CRYSTAL_FREQ,
peripherals.XOSC,
peripherals.CLOCKS,
peripherals.PLL_SYS,
peripherals.PLL_USB,
&mut peripherals.RESETS,
&mut watchdog,
)
.ok()
.unwrap();§Usage extended
use fugit::RateExtU32;
use rp235x_hal::{clocks::{Clock, ClocksManager, ClockSource, InitError}, gpio::Pins, self as hal, pll::{common_configs::{PLL_SYS_150MHZ, PLL_USB_48MHZ}, setup_pll_blocking}, Sio, watchdog::Watchdog, xosc::setup_xosc_blocking};
let mut peripherals = hal::pac::Peripherals::take().unwrap();
let mut watchdog = Watchdog::new(peripherals.WATCHDOG);
const XOSC_CRYSTAL_FREQ: u32 = 12_000_000; // Typically found in BSP crates
// Enable the xosc
let xosc = setup_xosc_blocking(peripherals.XOSC, XOSC_CRYSTAL_FREQ.Hz()).map_err(InitError::XoscErr)?;
// Start tick in watchdog
watchdog.enable_tick_generation((XOSC_CRYSTAL_FREQ / 1_000_000) as u16);
let mut clocks = ClocksManager::new(peripherals.CLOCKS);
// Configure PLLs
// REF FBDIV VCO POSTDIV
// PLL SYS: 12 / 1 = 12MHz * 125 = 1500MHZ / 5 / 2 = 150MHz
// PLL USB: 12 / 1 = 12MHz * 40 = 480 MHz / 5 / 2 = 48MHz
let pll_sys = setup_pll_blocking(peripherals.PLL_SYS, xosc.operating_frequency().into(), PLL_SYS_150MHZ, &mut clocks, &mut peripherals.RESETS).map_err(InitError::PllError)?;
let pll_usb = setup_pll_blocking(peripherals.PLL_USB, xosc.operating_frequency().into(), PLL_USB_48MHZ, &mut clocks, &mut peripherals.RESETS).map_err(InitError::PllError)?;
// Configure clocks
// CLK_REF = XOSC (12MHz) / 1 = 12MHz
clocks.reference_clock.configure_clock(&xosc, xosc.get_freq()).map_err(InitError::ClockError)?;
// CLK SYS = PLL SYS (150MHz) / 1 = 150MHz
clocks.system_clock.configure_clock(&pll_sys, pll_sys.get_freq()).map_err(InitError::ClockError)?;
// CLK USB = PLL USB (48MHz) / 1 = 48MHz
clocks.usb_clock.configure_clock(&pll_usb, pll_usb.get_freq()).map_err(InitError::ClockError)?;
// CLK ADC = PLL USB (48MHZ) / 1 = 48MHz
clocks.adc_clock.configure_clock(&pll_usb, pll_usb.get_freq()).map_err(InitError::ClockError)?;
// CLK HSTX = PLL SYS (150MHz) / 1 = 150MHz
clocks.hstx_clock.configure_clock(&pll_sys, pll_sys.get_freq()).map_err(InitError::ClockError)?;
// CLK PERI = clk_sys. Used as reference clock for Peripherals. No dividers so just select and enable
// Normally choose clk_sys or clk_usb
clocks.peripheral_clock.configure_clock(&clocks.system_clock, clocks.system_clock.freq()).map_err(InitError::ClockError)?;See Chapter 8 for more details.
Structs§
- AdcClock
- ADC reference clock.
- Changing
Clock Token - Token which can be used to await the glitchless switch
- Clock
Gate - Bit field mapping clock enable bits.
- Clocks
Manager - Abstraction layer providing Clock Management.
- Gpio
Output0 Clock - GPIO Output 0 Clock Generator
- Gpio
Output1 Clock - GPIO Output 1 Clock Generator
- Gpio
Output2 Clock - GPIO Output 2 Clock Generator
- Gpio
Output3 Clock - GPIO Output 3 Clock Generator
- Hstx
Clock - HSTX (High-Speed Transmitter) Clock
- Peripheral
Clock - Peripheral clock.
- Reference
Clock - Reference clock that is always running 6 - 12MHz unless in DORMANT mode.
- System
Clock - System clock that is always running unless in DORMANT mode.
- UsbClock
- USB reference clock.
Enums§
- ClkAdc
SrcType - Holds register value for ClockSource for
AdcClock - ClkGpout0
SrcType - Holds register value for ClockSource for
GpioOutput0Clock - ClkGpout1
SrcType - Holds register value for ClockSource for
GpioOutput1Clock - ClkGpout2
SrcType - Holds register value for ClockSource for
GpioOutput2Clock - ClkGpout3
SrcType - Holds register value for ClockSource for
GpioOutput3Clock - ClkHstx
SrcType - Holds register value for ClockSource for
HstxClock - ClkPeri
SrcType - Holds register value for ClockSource for
PeripheralClock - ClkRef
SrcType - Holds register value for ClockSource for
ReferenceClock - ClkSys
SrcType - Holds register value for ClockSource for
SystemClock - ClkUsb
SrcType - Holds register value for ClockSource for
UsbClock - Clock
Error - Something when wrong setting up the clock
- Init
Error - Possible init errors
Traits§
- Clock
- For clocks
- Clock
Source - Trait for things that can be used as clock source
- Stoppable
Clock - For clocks that can be disabled
- Valid
Src - Trait to contrain which ClockSource is valid for which Clock
Functions§
- init_
clocks_ and_ plls - Initialize the clocks and plls according to the reference implementation