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.rs49
1 files changed, 19 insertions, 30 deletions
diff --git a/examples/mcxa/src/bin/adc_interrupt.rs b/examples/mcxa/src/bin/adc_interrupt.rs
index c88b1fe8d..5876923a1 100644
--- a/examples/mcxa/src/bin/adc_interrupt.rs
+++ b/examples/mcxa/src/bin/adc_interrupt.rs
@@ -2,34 +2,31 @@
2#![no_main] 2#![no_main]
3 3
4use embassy_executor::Spawner; 4use embassy_executor::Spawner;
5use embassy_mcxa_examples::init_adc_pins; 5use hal::adc::{Adc, InterruptHandler, LpadcConfig, TriggerPriorityPolicy};
6use hal::adc::{LpadcConfig, TriggerPriorityPolicy}; 6use hal::bind_interrupts;
7use hal::clocks::PoweredClock; 7use hal::clocks::PoweredClock;
8use hal::clocks::config::Div8;
8use hal::clocks::periph_helpers::{AdcClockSel, Div4}; 9use hal::clocks::periph_helpers::{AdcClockSel, Div4};
10use hal::config::Config;
9use hal::pac::adc1::cfg::{Pwrsel, Refsel}; 11use hal::pac::adc1::cfg::{Pwrsel, Refsel};
10use hal::pac::adc1::cmdl1::{Adch, Mode}; 12use hal::pac::adc1::cmdl1::{Adch, Mode};
11use hal::pac::adc1::ctrl::CalAvgs; 13use hal::pac::adc1::ctrl::CalAvgs;
12use hal::pac::adc1::tctrl::Tcmd; 14use hal::pac::adc1::tctrl::Tcmd;
13use hal::{InterruptExt, bind_interrupts}; 15use hal::peripherals::ADC1;
14use {defmt_rtt as _, embassy_mcxa as hal, panic_probe as _}; 16use {defmt_rtt as _, embassy_mcxa as hal, panic_probe as _};
15 17
16bind_interrupts!(struct Irqs { 18bind_interrupts!(struct Irqs {
17 ADC1 => hal::adc::AdcHandler; 19 ADC1 => InterruptHandler<ADC1>;
18}); 20});
19 21
20#[used]
21#[no_mangle]
22static KEEP_ADC: unsafe extern "C" fn() = ADC1;
23
24#[embassy_executor::main] 22#[embassy_executor::main]
25async fn main(_spawner: Spawner) { 23async fn main(_spawner: Spawner) {
26 let p = hal::init(hal::config::Config::default()); 24 let mut config = Config::default();
25 config.clock_cfg.sirc.fro_lf_div = Div8::from_divisor(1);
27 26
28 defmt::info!("ADC interrupt Example"); 27 let p = hal::init(config);
29 28
30 unsafe { 29 defmt::info!("ADC interrupt Example");
31 init_adc_pins();
32 }
33 30
34 let adc_config = LpadcConfig { 31 let adc_config = LpadcConfig {
35 enable_in_doze_mode: true, 32 enable_in_doze_mode: true,
@@ -46,7 +43,7 @@ async fn main(_spawner: Spawner) {
46 source: AdcClockSel::FroLfDiv, 43 source: AdcClockSel::FroLfDiv,
47 div: Div4::no_div(), 44 div: Div4::no_div(),
48 }; 45 };
49 let adc = hal::adc::Adc::<hal::adc::Adc1>::new(p.ADC1, adc_config); 46 let mut adc = Adc::new_async(p.ADC1, p.P1_10, Irqs, adc_config).unwrap();
50 47
51 adc.do_offset_calibration(); 48 adc.do_offset_calibration();
52 adc.do_auto_calibration(); 49 adc.do_auto_calibration();
@@ -54,7 +51,7 @@ async fn main(_spawner: Spawner) {
54 let mut conv_command_config = adc.get_default_conv_command_config(); 51 let mut conv_command_config = adc.get_default_conv_command_config();
55 conv_command_config.channel_number = Adch::SelectCorrespondingChannel8; 52 conv_command_config.channel_number = Adch::SelectCorrespondingChannel8;
56 conv_command_config.conversion_resolution_mode = Mode::Data16Bits; 53 conv_command_config.conversion_resolution_mode = Mode::Data16Bits;
57 adc.set_conv_command_config(1, &conv_command_config); 54 adc.set_conv_command_config(1, &conv_command_config).unwrap();
58 55
59 let mut conv_trigger_config = adc.get_default_conv_trigger_config(); 56 let mut conv_trigger_config = adc.get_default_conv_trigger_config();
60 conv_trigger_config.target_command_id = Tcmd::ExecuteCmd1; 57 conv_trigger_config.target_command_id = Tcmd::ExecuteCmd1;
@@ -63,22 +60,14 @@ async fn main(_spawner: Spawner) {
63 60
64 defmt::info!("ADC configuration done..."); 61 defmt::info!("ADC configuration done...");
65 62
66 adc.enable_interrupt(0x1);
67
68 unsafe {
69 hal::interrupt::ADC1.enable();
70 }
71
72 unsafe {
73 cortex_m::interrupt::enable();
74 }
75
76 loop { 63 loop {
77 adc.do_software_trigger(1); 64 match adc.read().await {
78 while !adc.is_interrupt_triggered() { 65 Ok(value) => {
79 // Wait until the interrupt is triggered 66 defmt::info!("*** ADC interrupt TRIGGERED! *** -- value: {}", value);
67 }
68 Err(e) => {
69 defmt::error!("ADC read error: {:?}", e);
70 }
80 } 71 }
81 defmt::info!("*** ADC interrupt TRIGGERED! ***");
82 //TBD need to print the value
83 } 72 }
84} 73}