From 1ccf45058db4e77ac2c59357cab196b659201b63 Mon Sep 17 00:00:00 2001 From: Mathis Deroo Date: Fri, 5 Dec 2025 14:37:19 -0800 Subject: ADC driver improvement Signed-off-by: Mathis Deroo --- examples/mcxa/src/bin/adc_interrupt.rs | 42 +++++++++++----------------------- examples/mcxa/src/bin/adc_polling.rs | 18 +++++++-------- examples/mcxa/src/lib.rs | 16 ------------- 3 files changed, 22 insertions(+), 54 deletions(-) delete mode 100644 examples/mcxa/src/lib.rs (limited to 'examples') diff --git a/examples/mcxa/src/bin/adc_interrupt.rs b/examples/mcxa/src/bin/adc_interrupt.rs index c88b1fe8d..9db1173e3 100644 --- a/examples/mcxa/src/bin/adc_interrupt.rs +++ b/examples/mcxa/src/bin/adc_interrupt.rs @@ -2,35 +2,33 @@ #![no_main] use embassy_executor::Spawner; -use embassy_mcxa_examples::init_adc_pins; -use hal::adc::{LpadcConfig, TriggerPriorityPolicy}; +use hal::adc::{Adc, LpadcConfig, TriggerPriorityPolicy, InterruptHandler}; use hal::clocks::PoweredClock; +use hal::config::Config; +use hal::clocks::config::Div8; use hal::clocks::periph_helpers::{AdcClockSel, Div4}; use hal::pac::adc1::cfg::{Pwrsel, Refsel}; use hal::pac::adc1::cmdl1::{Adch, Mode}; use hal::pac::adc1::ctrl::CalAvgs; use hal::pac::adc1::tctrl::Tcmd; -use hal::{InterruptExt, bind_interrupts}; +use hal::bind_interrupts; +use hal::peripherals::ADC1; use {defmt_rtt as _, embassy_mcxa as hal, panic_probe as _}; bind_interrupts!(struct Irqs { - ADC1 => hal::adc::AdcHandler; + ADC1 => InterruptHandler; }); -#[used] -#[no_mangle] -static KEEP_ADC: unsafe extern "C" fn() = ADC1; #[embassy_executor::main] async fn main(_spawner: Spawner) { - let p = hal::init(hal::config::Config::default()); + let mut config = Config::default(); + config.clock_cfg.sirc.fro_lf_div = Div8::from_divisor(1); + + let p = hal::init(config); defmt::info!("ADC interrupt Example"); - unsafe { - init_adc_pins(); - } - let adc_config = LpadcConfig { enable_in_doze_mode: true, conversion_average_mode: CalAvgs::Average128, @@ -46,7 +44,7 @@ async fn main(_spawner: Spawner) { source: AdcClockSel::FroLfDiv, div: Div4::no_div(), }; - let adc = hal::adc::Adc::::new(p.ADC1, adc_config); + let mut adc = Adc::new(p.ADC1, p.P1_10, Irqs, adc_config); adc.do_offset_calibration(); adc.do_auto_calibration(); @@ -63,22 +61,8 @@ async fn main(_spawner: Spawner) { defmt::info!("ADC configuration done..."); - adc.enable_interrupt(0x1); - - unsafe { - hal::interrupt::ADC1.enable(); - } - - unsafe { - cortex_m::interrupt::enable(); - } - loop { - adc.do_software_trigger(1); - while !adc.is_interrupt_triggered() { - // Wait until the interrupt is triggered - } - defmt::info!("*** ADC interrupt TRIGGERED! ***"); - //TBD need to print the value + let value = adc.read().await; + defmt::info!("*** ADC interrupt TRIGGERED! *** -- value: {}", value); } } diff --git a/examples/mcxa/src/bin/adc_polling.rs b/examples/mcxa/src/bin/adc_polling.rs index 07c50f224..65b66c8dd 100644 --- a/examples/mcxa/src/bin/adc_polling.rs +++ b/examples/mcxa/src/bin/adc_polling.rs @@ -2,9 +2,10 @@ #![no_main] use embassy_executor::Spawner; -use embassy_mcxa_examples::init_adc_pins; -use hal::adc::{ConvResult, LpadcConfig, TriggerPriorityPolicy}; +use hal::adc::{Adc, ConvResult, LpadcConfig, TriggerPriorityPolicy}; use hal::clocks::PoweredClock; +use hal::config::Config; +use hal::clocks::config::Div8; use hal::clocks::periph_helpers::{AdcClockSel, Div4}; use hal::pac::adc1::cfg::{Pwrsel, Refsel}; use hal::pac::adc1::cmdl1::{Adch, Mode}; @@ -16,11 +17,10 @@ const G_LPADC_RESULT_SHIFT: u32 = 0; #[embassy_executor::main] async fn main(_spawner: Spawner) { - let p = hal::init(hal::config::Config::default()); - - unsafe { - init_adc_pins(); - } + let mut config = Config::default(); + config.clock_cfg.sirc.fro_lf_div = Div8::from_divisor(1); + + let p = hal::init(config); defmt::info!("=== ADC polling Example ==="); @@ -39,7 +39,7 @@ async fn main(_spawner: Spawner) { source: AdcClockSel::FroLfDiv, div: Div4::no_div(), }; - let adc = hal::adc::Adc::::new(p.ADC1, adc_config); + let adc = Adc::new_polling(p.ADC1, p.P1_10, adc_config); adc.do_offset_calibration(); adc.do_auto_calibration(); @@ -60,7 +60,7 @@ async fn main(_spawner: Spawner) { adc.do_software_trigger(1); let mut result: Option = None; while result.is_none() { - result = hal::adc::get_conv_result(); + result = adc.get_conv_result(); } let value = result.unwrap().conv_value >> G_LPADC_RESULT_SHIFT; defmt::info!("value: {=u16}", value); diff --git a/examples/mcxa/src/lib.rs b/examples/mcxa/src/lib.rs deleted file mode 100644 index 2573a6adc..000000000 --- a/examples/mcxa/src/lib.rs +++ /dev/null @@ -1,16 +0,0 @@ -#![no_std] -#![allow(clippy::missing_safety_doc)] - -//! Shared board-specific helpers for the FRDM-MCXA276 examples. -//! These live with the examples so the HAL stays generic. - -use hal::{clocks, pins}; -use {defmt_rtt as _, embassy_mcxa as hal, panic_probe as _}; - -/// Initialize clocks and pin muxing for ADC. -pub unsafe fn init_adc_pins() { - // NOTE: Lpuart has been updated to properly enable + reset its own clocks. - // GPIO has not. - _ = clocks::enable_and_reset::(&clocks::periph_helpers::NoConfig); - pins::configure_adc_pins(); -} -- cgit From b9bb7c0ebdbe19832ed9e9d75b12df86523c5fd2 Mon Sep 17 00:00:00 2001 From: Mathis Deroo Date: Mon, 8 Dec 2025 11:12:33 -0800 Subject: Modify set_conv_command_config to support command index from 1 to 7 Signed-off-by: Mathis Deroo --- examples/mcxa/src/bin/adc_interrupt.rs | 4 ++-- examples/mcxa/src/bin/adc_polling.rs | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) (limited to 'examples') diff --git a/examples/mcxa/src/bin/adc_interrupt.rs b/examples/mcxa/src/bin/adc_interrupt.rs index 9db1173e3..125e37690 100644 --- a/examples/mcxa/src/bin/adc_interrupt.rs +++ b/examples/mcxa/src/bin/adc_interrupt.rs @@ -50,8 +50,8 @@ async fn main(_spawner: Spawner) { adc.do_auto_calibration(); let mut conv_command_config = adc.get_default_conv_command_config(); - conv_command_config.channel_number = Adch::SelectCorrespondingChannel8; - conv_command_config.conversion_resolution_mode = Mode::Data16Bits; + conv_command_config.channel_number = Adch::SelectCorrespondingChannel8 as u8; + conv_command_config.conversion_resolution_mode = Mode::Data16Bits as u8; adc.set_conv_command_config(1, &conv_command_config); let mut conv_trigger_config = adc.get_default_conv_trigger_config(); diff --git a/examples/mcxa/src/bin/adc_polling.rs b/examples/mcxa/src/bin/adc_polling.rs index 65b66c8dd..523035e0f 100644 --- a/examples/mcxa/src/bin/adc_polling.rs +++ b/examples/mcxa/src/bin/adc_polling.rs @@ -45,8 +45,8 @@ async fn main(_spawner: Spawner) { adc.do_auto_calibration(); let mut conv_command_config = adc.get_default_conv_command_config(); - conv_command_config.channel_number = Adch::SelectCorrespondingChannel8; - conv_command_config.conversion_resolution_mode = Mode::Data16Bits; + conv_command_config.channel_number = Adch::SelectCorrespondingChannel8 as u8; + conv_command_config.conversion_resolution_mode = Mode::Data16Bits as u8; adc.set_conv_command_config(1, &conv_command_config); let mut conv_trigger_config = adc.get_default_conv_trigger_config(); -- cgit From ff068148fcbc7ea148454cffa81921cc0e0da3e9 Mon Sep 17 00:00:00 2001 From: Mathis Deroo Date: Mon, 8 Dec 2025 13:56:31 -0800 Subject: Modify ConvCommandConfig struct Signed-off-by: Mathis Deroo --- examples/mcxa/src/bin/adc_interrupt.rs | 4 ++-- examples/mcxa/src/bin/adc_polling.rs | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) (limited to 'examples') diff --git a/examples/mcxa/src/bin/adc_interrupt.rs b/examples/mcxa/src/bin/adc_interrupt.rs index 125e37690..9db1173e3 100644 --- a/examples/mcxa/src/bin/adc_interrupt.rs +++ b/examples/mcxa/src/bin/adc_interrupt.rs @@ -50,8 +50,8 @@ async fn main(_spawner: Spawner) { adc.do_auto_calibration(); let mut conv_command_config = adc.get_default_conv_command_config(); - conv_command_config.channel_number = Adch::SelectCorrespondingChannel8 as u8; - conv_command_config.conversion_resolution_mode = Mode::Data16Bits as u8; + conv_command_config.channel_number = Adch::SelectCorrespondingChannel8; + conv_command_config.conversion_resolution_mode = Mode::Data16Bits; adc.set_conv_command_config(1, &conv_command_config); let mut conv_trigger_config = adc.get_default_conv_trigger_config(); diff --git a/examples/mcxa/src/bin/adc_polling.rs b/examples/mcxa/src/bin/adc_polling.rs index 523035e0f..65b66c8dd 100644 --- a/examples/mcxa/src/bin/adc_polling.rs +++ b/examples/mcxa/src/bin/adc_polling.rs @@ -45,8 +45,8 @@ async fn main(_spawner: Spawner) { adc.do_auto_calibration(); let mut conv_command_config = adc.get_default_conv_command_config(); - conv_command_config.channel_number = Adch::SelectCorrespondingChannel8 as u8; - conv_command_config.conversion_resolution_mode = Mode::Data16Bits as u8; + conv_command_config.channel_number = Adch::SelectCorrespondingChannel8; + conv_command_config.conversion_resolution_mode = Mode::Data16Bits; adc.set_conv_command_config(1, &conv_command_config); let mut conv_trigger_config = adc.get_default_conv_trigger_config(); -- cgit From 93b0f0308abee5607efae799039e0f4ccf2914b6 Mon Sep 17 00:00:00 2001 From: Mathis Deroo Date: Mon, 8 Dec 2025 14:08:34 -0800 Subject: Use Result enum for ConvResult structure and read function Signed-off-by: Mathis Deroo --- examples/mcxa/src/bin/adc_interrupt.rs | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) (limited to 'examples') diff --git a/examples/mcxa/src/bin/adc_interrupt.rs b/examples/mcxa/src/bin/adc_interrupt.rs index 9db1173e3..a0e392634 100644 --- a/examples/mcxa/src/bin/adc_interrupt.rs +++ b/examples/mcxa/src/bin/adc_interrupt.rs @@ -62,7 +62,13 @@ async fn main(_spawner: Spawner) { defmt::info!("ADC configuration done..."); loop { - let value = adc.read().await; - defmt::info!("*** ADC interrupt TRIGGERED! *** -- value: {}", value); + match adc.read().await { + Ok(value) => { + defmt::info!("*** ADC interrupt TRIGGERED! *** -- value: {}", value); + } + Err(e) => { + defmt::error!("ADC read error: {:?}", e); + } + } } } -- cgit From 759ab109806f447a1193954a453828b860104c3a Mon Sep 17 00:00:00 2001 From: Mathis Deroo Date: Mon, 8 Dec 2025 15:09:05 -0800 Subject: Add Mode trait for Async and Blocking behavior Signed-off-by: Mathis Deroo --- examples/mcxa/src/bin/adc_interrupt.rs | 2 +- examples/mcxa/src/bin/adc_polling.rs | 20 ++++++++++++-------- 2 files changed, 13 insertions(+), 9 deletions(-) (limited to 'examples') diff --git a/examples/mcxa/src/bin/adc_interrupt.rs b/examples/mcxa/src/bin/adc_interrupt.rs index a0e392634..67fcf6361 100644 --- a/examples/mcxa/src/bin/adc_interrupt.rs +++ b/examples/mcxa/src/bin/adc_interrupt.rs @@ -44,7 +44,7 @@ async fn main(_spawner: Spawner) { source: AdcClockSel::FroLfDiv, div: Div4::no_div(), }; - let mut adc = Adc::new(p.ADC1, p.P1_10, Irqs, adc_config); + let mut adc = Adc::new_async(p.ADC1, p.P1_10, Irqs, adc_config).unwrap(); adc.do_offset_calibration(); adc.do_auto_calibration(); diff --git a/examples/mcxa/src/bin/adc_polling.rs b/examples/mcxa/src/bin/adc_polling.rs index 65b66c8dd..14d47329a 100644 --- a/examples/mcxa/src/bin/adc_polling.rs +++ b/examples/mcxa/src/bin/adc_polling.rs @@ -2,7 +2,7 @@ #![no_main] use embassy_executor::Spawner; -use hal::adc::{Adc, ConvResult, LpadcConfig, TriggerPriorityPolicy}; +use hal::adc::{Adc, LpadcConfig, TriggerPriorityPolicy}; use hal::clocks::PoweredClock; use hal::config::Config; use hal::clocks::config::Div8; @@ -39,7 +39,7 @@ async fn main(_spawner: Spawner) { source: AdcClockSel::FroLfDiv, div: Div4::no_div(), }; - let adc = Adc::new_polling(p.ADC1, p.P1_10, adc_config); + let adc = Adc::new_blocking(p.ADC1, p.P1_10, adc_config).unwrap(); adc.do_offset_calibration(); adc.do_auto_calibration(); @@ -58,11 +58,15 @@ async fn main(_spawner: Spawner) { loop { adc.do_software_trigger(1); - let mut result: Option = None; - while result.is_none() { - result = adc.get_conv_result(); - } - let value = result.unwrap().conv_value >> G_LPADC_RESULT_SHIFT; - defmt::info!("value: {=u16}", value); + let result = loop { + match adc.get_conv_result() { + Ok(res) => break res, + Err(_) => { + // Conversion not ready, continue polling + } + } + }; + let value = result.conv_value >> G_LPADC_RESULT_SHIFT; + defmt::info!("ADC value: {=u16}", value); } } -- cgit From 20ed25fbad4e7651316b4841aefdf62ee197ea31 Mon Sep 17 00:00:00 2001 From: Mathis Deroo Date: Mon, 8 Dec 2025 15:17:54 -0800 Subject: set_conv_command_config returns Result instead of panic if index > 7 Signed-off-by: Mathis Deroo --- examples/mcxa/src/bin/adc_interrupt.rs | 2 +- examples/mcxa/src/bin/adc_polling.rs | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) (limited to 'examples') diff --git a/examples/mcxa/src/bin/adc_interrupt.rs b/examples/mcxa/src/bin/adc_interrupt.rs index 67fcf6361..257e04491 100644 --- a/examples/mcxa/src/bin/adc_interrupt.rs +++ b/examples/mcxa/src/bin/adc_interrupt.rs @@ -52,7 +52,7 @@ async fn main(_spawner: Spawner) { let mut conv_command_config = adc.get_default_conv_command_config(); conv_command_config.channel_number = Adch::SelectCorrespondingChannel8; conv_command_config.conversion_resolution_mode = Mode::Data16Bits; - adc.set_conv_command_config(1, &conv_command_config); + adc.set_conv_command_config(1, &conv_command_config).unwrap(); let mut conv_trigger_config = adc.get_default_conv_trigger_config(); conv_trigger_config.target_command_id = Tcmd::ExecuteCmd1; diff --git a/examples/mcxa/src/bin/adc_polling.rs b/examples/mcxa/src/bin/adc_polling.rs index 14d47329a..b11b8957f 100644 --- a/examples/mcxa/src/bin/adc_polling.rs +++ b/examples/mcxa/src/bin/adc_polling.rs @@ -47,7 +47,7 @@ async fn main(_spawner: Spawner) { let mut conv_command_config = adc.get_default_conv_command_config(); conv_command_config.channel_number = Adch::SelectCorrespondingChannel8; conv_command_config.conversion_resolution_mode = Mode::Data16Bits; - adc.set_conv_command_config(1, &conv_command_config); + adc.set_conv_command_config(1, &conv_command_config).unwrap(); let mut conv_trigger_config = adc.get_default_conv_trigger_config(); conv_trigger_config.target_command_id = Tcmd::ExecuteCmd1; -- cgit From 4f0eb421de9e08bbbf7f9a58f8b29c451de59894 Mon Sep 17 00:00:00 2001 From: Mathis Deroo Date: Tue, 9 Dec 2025 15:13:07 -0800 Subject: run rustfmt Signed-off-by: Mathis Deroo --- examples/mcxa/src/bin/adc_interrupt.rs | 11 +++++------ examples/mcxa/src/bin/adc_polling.rs | 4 ++-- 2 files changed, 7 insertions(+), 8 deletions(-) (limited to 'examples') diff --git a/examples/mcxa/src/bin/adc_interrupt.rs b/examples/mcxa/src/bin/adc_interrupt.rs index 257e04491..5876923a1 100644 --- a/examples/mcxa/src/bin/adc_interrupt.rs +++ b/examples/mcxa/src/bin/adc_interrupt.rs @@ -2,16 +2,16 @@ #![no_main] use embassy_executor::Spawner; -use hal::adc::{Adc, LpadcConfig, TriggerPriorityPolicy, InterruptHandler}; +use hal::adc::{Adc, InterruptHandler, LpadcConfig, TriggerPriorityPolicy}; +use hal::bind_interrupts; use hal::clocks::PoweredClock; -use hal::config::Config; use hal::clocks::config::Div8; use hal::clocks::periph_helpers::{AdcClockSel, Div4}; +use hal::config::Config; use hal::pac::adc1::cfg::{Pwrsel, Refsel}; use hal::pac::adc1::cmdl1::{Adch, Mode}; use hal::pac::adc1::ctrl::CalAvgs; use hal::pac::adc1::tctrl::Tcmd; -use hal::bind_interrupts; use hal::peripherals::ADC1; use {defmt_rtt as _, embassy_mcxa as hal, panic_probe as _}; @@ -19,12 +19,11 @@ bind_interrupts!(struct Irqs { ADC1 => InterruptHandler; }); - #[embassy_executor::main] async fn main(_spawner: Spawner) { let mut config = Config::default(); config.clock_cfg.sirc.fro_lf_div = Div8::from_divisor(1); - + let p = hal::init(config); defmt::info!("ADC interrupt Example"); @@ -62,7 +61,7 @@ async fn main(_spawner: Spawner) { defmt::info!("ADC configuration done..."); loop { - match adc.read().await { + match adc.read().await { Ok(value) => { defmt::info!("*** ADC interrupt TRIGGERED! *** -- value: {}", value); } diff --git a/examples/mcxa/src/bin/adc_polling.rs b/examples/mcxa/src/bin/adc_polling.rs index b11b8957f..d048bb56f 100644 --- a/examples/mcxa/src/bin/adc_polling.rs +++ b/examples/mcxa/src/bin/adc_polling.rs @@ -4,9 +4,9 @@ use embassy_executor::Spawner; use hal::adc::{Adc, LpadcConfig, TriggerPriorityPolicy}; use hal::clocks::PoweredClock; -use hal::config::Config; use hal::clocks::config::Div8; use hal::clocks::periph_helpers::{AdcClockSel, Div4}; +use hal::config::Config; use hal::pac::adc1::cfg::{Pwrsel, Refsel}; use hal::pac::adc1::cmdl1::{Adch, Mode}; use hal::pac::adc1::ctrl::CalAvgs; @@ -19,7 +19,7 @@ const G_LPADC_RESULT_SHIFT: u32 = 0; async fn main(_spawner: Spawner) { let mut config = Config::default(); config.clock_cfg.sirc.fro_lf_div = Div8::from_divisor(1); - + let p = hal::init(config); defmt::info!("=== ADC polling Example ==="); -- cgit