Skip to content

Commit b1905bc

Browse files
Cor Petersluctius
authored andcommitted
Added ADC support + examples
1 parent 3a5ed7c commit b1905bc

File tree

4 files changed

+2527
-1
lines changed

4 files changed

+2527
-1
lines changed

examples/adc-continious.rs

Lines changed: 70 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,70 @@
1+
#![no_main]
2+
#![no_std]
3+
4+
use crate::hal::{
5+
adc::{
6+
config::{Continuous, SampleTime, Sequence},
7+
AdcClaim, ClockSource, Temperature, Vref,
8+
},
9+
gpio::GpioExt,
10+
rcc::{Config, RccExt},
11+
stm32::Peripherals,
12+
};
13+
use stm32g4xx_hal as hal;
14+
15+
use cortex_m_rt::entry;
16+
17+
use log::info;
18+
19+
#[macro_use]
20+
mod utils;
21+
22+
#[entry]
23+
fn main() -> ! {
24+
utils::logger::init();
25+
26+
info!("start");
27+
28+
let dp = Peripherals::take().unwrap();
29+
let mut cp = cortex_m::Peripherals::take().expect("cannot take core peripherals");
30+
31+
info!("rcc");
32+
33+
let rcc = dp.RCC.constrain();
34+
let mut rcc = rcc.freeze(Config::hsi());
35+
36+
info!("Setup Gpio");
37+
let gpioa = dp.GPIOA.split(&mut rcc);
38+
let pa0 = gpioa.pa0.into_analog();
39+
40+
info!("Setup Adc1");
41+
let (mut adc, syst) = dp.ADC1.claim(ClockSource::SystemClock, &rcc, cp.SYST);
42+
cp.SYST = syst;
43+
44+
adc.enable_temperature(&dp.ADC12_COMMON);
45+
adc.enable_vref(&dp.ADC12_COMMON);
46+
adc.set_auto_delay(true);
47+
adc.set_continuous(Continuous::Continuous);
48+
adc.reset_sequence();
49+
adc.configure_channel(&pa0, Sequence::One, SampleTime::Cycles_640_5);
50+
adc.configure_channel(&Vref, Sequence::Two, SampleTime::Cycles_640_5);
51+
adc.configure_channel(&Temperature, Sequence::Three, SampleTime::Cycles_640_5);
52+
let adc = adc.enable();
53+
54+
info!("Enter Loop");
55+
let mut adc = adc.start_conversion();
56+
57+
loop {
58+
adc = adc.wait_for_conversion_sequence().unwrap_active();
59+
let millivolts = adc.sample_to_millivolts(adc.current_sample());
60+
info!("pa3: {}mV", millivolts);
61+
62+
adc = adc.wait_for_conversion_sequence().unwrap_active();
63+
let millivolts = Vref::sample_to_millivolts(adc.current_sample());
64+
info!("vref: {}mV", millivolts);
65+
66+
adc = adc.wait_for_conversion_sequence().unwrap_active();
67+
let millivolts = Temperature::temperature_to_degrees_centigrade(adc.current_sample());
68+
info!("temp: {}℃C", millivolts); // Note: Temperature seems quite low...
69+
}
70+
}

examples/adc-one-shot.rs

Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
#![no_main]
2+
#![no_std]
3+
4+
use crate::hal::{
5+
adc::{config::SampleTime, AdcClaim, ClockSource},
6+
rcc::Config,
7+
stm32::Peripherals,
8+
};
9+
use hal::prelude::*;
10+
use stm32g4xx_hal as hal;
11+
12+
use cortex_m_rt::entry;
13+
14+
use log::info;
15+
16+
#[macro_use]
17+
mod utils;
18+
19+
#[entry]
20+
fn main() -> ! {
21+
utils::logger::init();
22+
23+
info!("start");
24+
25+
let dp = Peripherals::take().unwrap();
26+
let mut cp = cortex_m::Peripherals::take().expect("cannot take core peripherals");
27+
28+
info!("rcc");
29+
30+
let rcc = dp.RCC.constrain();
31+
let mut rcc = rcc.freeze(Config::hsi());
32+
33+
info!("Setup Adc1");
34+
35+
let (mut adc, syst) = dp.ADC1.claim(ClockSource::SystemClock, &rcc, cp.SYST);
36+
cp.SYST = syst;
37+
38+
info!("Setup Gpio");
39+
40+
let gpioa = dp.GPIOA.split(&mut rcc);
41+
let pa0 = gpioa.pa0.into_analog();
42+
43+
info!("Enter Loop");
44+
45+
loop {
46+
info!("Convert");
47+
let sample = adc.convert(&pa0, SampleTime::Cycles_640_5);
48+
info!("sample to mv");
49+
let millivolts = adc.sample_to_millivolts(sample);
50+
info!("pa3: {}mV", millivolts);
51+
}
52+
}

0 commit comments

Comments
 (0)