ADC
ADC 的 rust crate也提供了异步和阻塞两种接口方式,简化 ADC的配置和使用。
示例:examples/adc_block.rs
#![no_std] #![no_main] use hal::adc::{temperature, vrefence_internal, AdcChannel, AnyAdc, ChannelConfig, Config}; use hal::delay; use py32f030_hal::{self as hal, mode::Blocking}; // use panic_halt as _; use {defmt_rtt as _, panic_probe as _}; #[cortex_m_rt::entry] fn main() -> ! { let p = hal::init(Default::default()); let adc: AnyAdc<_, Blocking> = AnyAdc::new( p.ADC, Config::default(), ChannelConfig::new_multiple_channel_perferred(), &[AdcChannel::Channel11, AdcChannel::Channel12], ) .unwrap(); loop { // adc.start(); let temp = adc.read_block(1000000).unwrap(); // adc.start(); let vol = adc.read_block(1000000).unwrap(); defmt::info!( "temp: {}: {}, vol: {}: {}", temp, temperature(temp), vol, vrefence_internal(vol) ); delay::delay_s(1); } }
示例二:examples/embassy_adc.rs
#![no_std] #![no_main] use py32f030_hal::adc::{TemperatureChannel, VRrefChannel}; use py32f030_hal::mode::Async; use py32f030_hal::{self as hal}; use embassy_executor::Spawner; use embassy_time::Timer; use hal::adc::{AnyAdc, ChannelConfig, Config}; // use panic_halt as _; use {defmt_rtt as _, panic_probe as _}; #[embassy_executor::task] async fn run() { loop { Timer::after_secs(2).await; } } #[embassy_executor::main] async fn main(_spawner: Spawner) { let p = hal::init(Default::default()); let adc: AnyAdc<_, Async> = AnyAdc::new( p.ADC, Config::default(), ChannelConfig::new_exclusive_single(), &[], ) .unwrap(); _spawner.spawn(run()).unwrap(); loop { defmt::info!("temp {}", adc.read(TemperatureChannel).await,); defmt::info!("vref {}", adc.read(VRrefChannel).await); Timer::after_secs(2).await; } }
运行:cargo r --example embassy_adc --features embassy