enable PLL for ADC

This commit is contained in:
Joe Ardent 2026-07-03 18:10:53 -07:00
parent 57c3eb9944
commit dbe40d8b59

View file

@ -4,10 +4,10 @@
use defmt::unwrap; use defmt::unwrap;
use embassy_executor::Spawner; use embassy_executor::Spawner;
use embassy_stm32::{ use embassy_stm32::{
Config, Peri,
adc::{Adc, SampleTime}, adc::{Adc, SampleTime},
gpio::{AnyPin, Level, Output, Speed}, gpio::{AnyPin, Level, Output, Speed},
peripherals::{ADC1, PA0}, peripherals::{ADC1, PA0},
Config, Peri,
}; };
use embassy_time::Timer; use embassy_time::Timer;
use {defmt_rtt as _, panic_probe as _}; use {defmt_rtt as _, panic_probe as _};
@ -16,32 +16,49 @@ use {defmt_rtt as _, panic_probe as _};
async fn main(spawner: Spawner) { async fn main(spawner: Spawner) {
let mut config = Config::default(); let mut config = Config::default();
config.rcc.mux.adc12sel = embassy_stm32::rcc::mux::Adcsel::SYS; {
use embassy_stm32::rcc::{Pll, PllMul, PllPreDiv, PllRDiv, PllSource, Sysclk, mux};
config.rcc.pll = Some(Pll {
source: PllSource::HSI,
prediv: PllPreDiv::DIV4,
mul: PllMul::MUL85,
divp: None,
divq: None,
// Main system clock at 170 MHz
divr: Some(PllRDiv::DIV2),
});
config.rcc.mux.adc12sel = mux::Adcsel::SYS;
config.rcc.sys = Sysclk::PLL1_R;
}
let p = embassy_stm32::init(config); let p = embassy_stm32::init(config);
let mut a = Adc::new(p.ADC1, Default::default()); let a = Adc::new(p.ADC1, Default::default());
let mut temp = a.enable_temperature(); // let mut temp = a.enable_temperature();
let t = a.blocking_read(&mut temp, SampleTime::CYCLES247_5); // let t = a.blocking_read(&mut temp, SampleTime::CYCLES247_5);
defmt::info!("got temp: {}", t); // defmt::info!("got temp: {}", t);
let channel = p.PA0.into(); let channel = p.PA0.into();
spawner.spawn(unwrap!(read_adc1_pa0(a, channel))); spawner.spawn(unwrap!(read_adc1_pa0(a, channel)));
spawner.spawn(unwrap!(blinky(p.PA5.into()))); // spawner.spawn(unwrap!(blinky(p.PA5.into())));
Timer::after_secs(5).await; Timer::after_secs(60).await;
treatbot_5k::exit() treatbot_5k::exit()
} }
#[embassy_executor::task] #[embassy_executor::task]
async fn read_adc1_pa0(mut a: Adc<'static, ADC1>, mut channel: Peri<'static, PA0>) { async fn read_adc1_pa0(mut a: Adc<'static, ADC1>, mut channel: Peri<'static, PA0>) {
loop { loop {
let val = a.blocking_read(&mut channel, SampleTime::CYCLES12_5); let val = a.blocking_read(&mut channel.reborrow(), SampleTime::CYCLES640_5);
defmt::info!("read {}", val); if val < 20 {
Timer::after_secs(1).await; defmt::info!("low: {}", val);
} else {
defmt::info!("high {}", val);
}
Timer::after_millis(100).await;
} }
} }