aboutsummaryrefslogtreecommitdiff
path: root/examples/stm32wba6/src/bin/adc.rs
diff options
context:
space:
mode:
Diffstat (limited to 'examples/stm32wba6/src/bin/adc.rs')
-rw-r--r--examples/stm32wba6/src/bin/adc.rs50
1 files changed, 39 insertions, 11 deletions
diff --git a/examples/stm32wba6/src/bin/adc.rs b/examples/stm32wba6/src/bin/adc.rs
index a9651d57e..51dcff57a 100644
--- a/examples/stm32wba6/src/bin/adc.rs
+++ b/examples/stm32wba6/src/bin/adc.rs
@@ -2,30 +2,55 @@
2#![no_main] 2#![no_main]
3 3
4use defmt::*; 4use defmt::*;
5use embassy_stm32::adc::{adc4, AdcChannel}; 5use embassy_stm32::Config;
6use embassy_stm32::adc::{Adc, AdcChannel, SampleTime, adc4};
7use embassy_stm32::rcc::{
8 AHB5Prescaler, AHBPrescaler, APBPrescaler, PllDiv, PllMul, PllPreDiv, PllSource, Sysclk, VoltageScale,
9};
6use {defmt_rtt as _, panic_probe as _}; 10use {defmt_rtt as _, panic_probe as _};
7 11
8#[embassy_executor::main] 12#[embassy_executor::main]
9async fn main(_spawner: embassy_executor::Spawner) { 13async fn main(_spawner: embassy_executor::Spawner) {
10 let config = embassy_stm32::Config::default(); 14 let mut config = Config::default();
15 // Fine-tune PLL1 dividers/multipliers
16 config.rcc.pll1 = Some(embassy_stm32::rcc::Pll {
17 source: PllSource::HSI,
18 prediv: PllPreDiv::DIV1, // PLLM = 1 → HSI / 1 = 16 MHz
19 mul: PllMul::MUL30, // PLLN = 30 → 16 MHz * 30 = 480 MHz VCO
20 divr: Some(PllDiv::DIV5), // PLLR = 5 → 96 MHz (Sysclk)
21 // divq: Some(PllDiv::DIV10), // PLLQ = 10 → 48 MHz (NOT USED)
22 divq: None,
23 divp: Some(PllDiv::DIV30), // PLLP = 30 → 16 MHz (USBOTG)
24 frac: Some(0), // Fractional part (enabled)
25 });
26
27 config.rcc.ahb_pre = AHBPrescaler::DIV1;
28 config.rcc.apb1_pre = APBPrescaler::DIV1;
29 config.rcc.apb2_pre = APBPrescaler::DIV1;
30 config.rcc.apb7_pre = APBPrescaler::DIV1;
31 config.rcc.ahb5_pre = AHB5Prescaler::DIV4;
32
33 // voltage scale for max performance
34 config.rcc.voltage_scale = VoltageScale::RANGE1;
35 // route PLL1_P into the USB‐OTG‐HS block
36 config.rcc.sys = Sysclk::PLL1_R;
11 37
12 let mut p = embassy_stm32::init(config); 38 let mut p = embassy_stm32::init(config);
13 39
14 // **** ADC4 init **** 40 // **** ADC4 init ****
15 let mut adc4 = adc4::Adc4::new(p.ADC4); 41 let mut adc4 = Adc::new_adc4(p.ADC4);
16 let mut adc4_pin1 = p.PA0; // A4 42 let mut adc4_pin1 = p.PA0; // A4
17 let mut adc4_pin2 = p.PA1; // A5 43 let mut adc4_pin2 = p.PA1; // A5
18 adc4.set_resolution(adc4::Resolution::BITS12); 44 adc4.set_resolution_adc4(adc4::Resolution::BITS12);
19 adc4.set_averaging(adc4::Averaging::Samples256); 45 adc4.set_averaging_adc4(adc4::Averaging::Samples256);
20 adc4.set_sample_time(adc4::SampleTime::CYCLES1_5);
21 let max4 = adc4::resolution_to_max_count(adc4::Resolution::BITS12); 46 let max4 = adc4::resolution_to_max_count(adc4::Resolution::BITS12);
22 47
23 // **** ADC4 blocking read **** 48 // **** ADC4 blocking read ****
24 let raw: u16 = adc4.blocking_read(&mut adc4_pin1); 49 let raw: u16 = adc4.blocking_read(&mut adc4_pin1, adc4::SampleTime::CYCLES1_5);
25 let volt: f32 = 3.0 * raw as f32 / max4 as f32; 50 let volt: f32 = 3.0 * raw as f32 / max4 as f32;
26 info!("Read adc4 pin 1 {}", volt); 51 info!("Read adc4 pin 1 {}", volt);
27 52
28 let raw: u16 = adc4.blocking_read(&mut adc4_pin2); 53 let raw: u16 = adc4.blocking_read(&mut adc4_pin2, adc4::SampleTime::CYCLES1_5);
29 let volt: f32 = 3.3 * raw as f32 / max4 as f32; 54 let volt: f32 = 3.3 * raw as f32 / max4 as f32;
30 info!("Read adc4 pin 2 {}", volt); 55 info!("Read adc4 pin 2 {}", volt);
31 56
@@ -37,11 +62,14 @@ async fn main(_spawner: embassy_executor::Spawner) {
37 // The channels must be in ascending order and can't repeat for ADC4 62 // The channels must be in ascending order and can't repeat for ADC4
38 adc4.read( 63 adc4.read(
39 p.GPDMA1_CH1.reborrow(), 64 p.GPDMA1_CH1.reborrow(),
40 [&mut degraded42, &mut degraded41].into_iter(), 65 [
66 (&mut degraded42, SampleTime::CYCLES12_5),
67 (&mut degraded41, SampleTime::CYCLES12_5),
68 ]
69 .into_iter(),
41 &mut measurements, 70 &mut measurements,
42 ) 71 )
43 .await 72 .await;
44 .unwrap();
45 let volt2: f32 = 3.3 * measurements[0] as f32 / max4 as f32; 73 let volt2: f32 = 3.3 * measurements[0] as f32 / max4 as f32;
46 let volt1: f32 = 3.0 * measurements[1] as f32 / max4 as f32; 74 let volt1: f32 = 3.0 * measurements[1] as f32 / max4 as f32;
47 info!("Async read 4 pin 1 {}", volt1); 75 info!("Async read 4 pin 1 {}", volt1);