diff --git a/embassy-rp/src/clocks.rs b/embassy-rp/src/clocks.rs index 743a3fd5..b919b98a 100644 --- a/embassy-rp/src/clocks.rs +++ b/embassy-rp/src/clocks.rs @@ -544,9 +544,9 @@ pub fn clk_rtc_freq() -> u32 { base / int } -pub fn clk_gpout_freq(num: usize) -> u32 { +pub fn clk_gpout_freq(gpout: &Gpout) -> u32 { let c = pac::CLOCKS; - let src = unsafe { c.clk_gpout_ctrl(num).read().auxsrc() }; + let src = unsafe { c.clk_gpout_ctrl(gpout.gpout.gpout_number()).read().auxsrc() }; let base = match src { ClkGpoutCtrlAuxsrc::CLKSRC_PLL_SYS => pll_sys_freq(), @@ -563,7 +563,7 @@ pub fn clk_gpout_freq(num: usize) -> u32 { _ => unreachable!(), }; - let div = unsafe { c.clk_gpout_div(num).read() }; + let div = unsafe { c.clk_gpout_div(gpout.gpout.gpout_number()).read() }; let int = if div.int() == 0 { 65536 } else { div.int() }; // TODO handle fractional clock div let _frac = div.frac(); @@ -759,7 +759,7 @@ impl<'d, T: GpoutPin> Gpout<'d, T> { unsafe { let c = pac::CLOCKS; c.clk_gpout_ctrl(self.gpout.gpout_number()).modify(|w| { - w.set_enable(true); + w.set_enable(false); }); } } diff --git a/examples/rp/Cargo.toml b/examples/rp/Cargo.toml index d2829df9..7d5473f2 100644 --- a/examples/rp/Cargo.toml +++ b/examples/rp/Cargo.toml @@ -48,3 +48,6 @@ pio = "0.2.1" [profile.release] debug = true + +[patch.crates-io] +rp-pac = {git = "https://github.com/CBJamo/rp-pac.git"} diff --git a/examples/rp/src/bin/gpout.rs b/examples/rp/src/bin/gpout.rs index 0503212e..ea0efb85 100644 --- a/examples/rp/src/bin/gpout.rs +++ b/examples/rp/src/bin/gpout.rs @@ -5,17 +5,30 @@ use defmt::*; use embassy_executor::Spawner; use embassy_rp::{clocks, pac}; +use embassy_time::{Duration, Timer}; use {defmt_rtt as _, panic_probe as _}; #[embassy_executor::main] async fn main(_spawner: Spawner) { let p = embassy_rp::init(Default::default()); - //let mut led = Output::new(p.PIN_25, Level::Low); - let gpout0 = clocks::Gpout0::new(p.PIN_21); - gpout0.set_src(pac::clocks::vals::ClkGpout0ctrlAuxsrc::CLK_SYS); - gpout0.set_div(1000, 0); - gpout0.enable(); + let gpout3 = clocks::Gpout::new(p.PIN_25); + gpout3.set_div(1000, 0); + gpout3.enable(); - info!("Pin 21 should be toggling at {} hz", clocks::clk_gpout0_freq()); + loop { + gpout3.set_src(pac::clocks::vals::ClkGpoutCtrlAuxsrc::CLK_SYS); + info!( + "Pin 25 is now outputing CLK_SYS/1000, should be toggling at {}", + clocks::clk_gpout_freq(&gpout3) + ); + Timer::after(Duration::from_secs(2)).await; + + gpout3.set_src(pac::clocks::vals::ClkGpoutCtrlAuxsrc::CLK_REF); + info!( + "Pin 25 is now outputing CLK_REF/1000, should be toggling at {}", + clocks::clk_gpout_freq(&gpout3) + ); + Timer::after(Duration::from_secs(2)).await; + } }