aboutsummaryrefslogtreecommitdiff
path: root/examples/mcxa/src/bin/adc_interrupt.rs
diff options
context:
space:
mode:
Diffstat (limited to 'examples/mcxa/src/bin/adc_interrupt.rs')
-rw-r--r--examples/mcxa/src/bin/adc_interrupt.rs73
1 files changed, 73 insertions, 0 deletions
diff --git a/examples/mcxa/src/bin/adc_interrupt.rs b/examples/mcxa/src/bin/adc_interrupt.rs
new file mode 100644
index 000000000..5876923a1
--- /dev/null
+++ b/examples/mcxa/src/bin/adc_interrupt.rs
@@ -0,0 +1,73 @@
1#![no_std]
2#![no_main]
3
4use embassy_executor::Spawner;
5use hal::adc::{Adc, InterruptHandler, LpadcConfig, TriggerPriorityPolicy};
6use hal::bind_interrupts;
7use hal::clocks::PoweredClock;
8use hal::clocks::config::Div8;
9use hal::clocks::periph_helpers::{AdcClockSel, Div4};
10use hal::config::Config;
11use hal::pac::adc1::cfg::{Pwrsel, Refsel};
12use hal::pac::adc1::cmdl1::{Adch, Mode};
13use hal::pac::adc1::ctrl::CalAvgs;
14use hal::pac::adc1::tctrl::Tcmd;
15use hal::peripherals::ADC1;
16use {defmt_rtt as _, embassy_mcxa as hal, panic_probe as _};
17
18bind_interrupts!(struct Irqs {
19 ADC1 => InterruptHandler<ADC1>;
20});
21
22#[embassy_executor::main]
23async fn main(_spawner: Spawner) {
24 let mut config = Config::default();
25 config.clock_cfg.sirc.fro_lf_div = Div8::from_divisor(1);
26
27 let p = hal::init(config);
28
29 defmt::info!("ADC interrupt Example");
30
31 let adc_config = LpadcConfig {
32 enable_in_doze_mode: true,
33 conversion_average_mode: CalAvgs::Average128,
34 enable_analog_preliminary: true,
35 power_up_delay: 0x80,
36 reference_voltage_source: Refsel::Option3,
37 power_level_mode: Pwrsel::Lowest,
38 trigger_priority_policy: TriggerPriorityPolicy::ConvPreemptImmediatelyNotAutoResumed,
39 enable_conv_pause: false,
40 conv_pause_delay: 0,
41 fifo_watermark: 0,
42 power: PoweredClock::NormalEnabledDeepSleepDisabled,
43 source: AdcClockSel::FroLfDiv,
44 div: Div4::no_div(),
45 };
46 let mut adc = Adc::new_async(p.ADC1, p.P1_10, Irqs, adc_config).unwrap();
47
48 adc.do_offset_calibration();
49 adc.do_auto_calibration();
50
51 let mut conv_command_config = adc.get_default_conv_command_config();
52 conv_command_config.channel_number = Adch::SelectCorrespondingChannel8;
53 conv_command_config.conversion_resolution_mode = Mode::Data16Bits;
54 adc.set_conv_command_config(1, &conv_command_config).unwrap();
55
56 let mut conv_trigger_config = adc.get_default_conv_trigger_config();
57 conv_trigger_config.target_command_id = Tcmd::ExecuteCmd1;
58 conv_trigger_config.enable_hardware_trigger = false;
59 adc.set_conv_trigger_config(0, &conv_trigger_config);
60
61 defmt::info!("ADC configuration done...");
62
63 loop {
64 match adc.read().await {
65 Ok(value) => {
66 defmt::info!("*** ADC interrupt TRIGGERED! *** -- value: {}", value);
67 }
68 Err(e) => {
69 defmt::error!("ADC read error: {:?}", e);
70 }
71 }
72 }
73}