Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 8 additions & 0 deletions tests/mcxa/.cargo/config.toml
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
[target.'cfg(all(target_arch = "arm", target_os = "none"))']
runner = "teleprobe local run --chip MCXA276 --protocol swd --elf"

[build]
target = "thumbv8m.main-none-eabihf" # Cortex-M33

[env]
DEFMT_LOG = "trace"
62 changes: 62 additions & 0 deletions tests/mcxa/Cargo.toml
Original file line number Diff line number Diff line change
@@ -0,0 +1,62 @@
[package]
name = "embassy-mcxa-examples"
version = "0.1.0"
edition = "2024"
license = "MIT OR Apache-2.0"
publish = false

[dependencies]
teleprobe-meta = "1.1"

cortex-m = { version = "0.7", features = ["critical-section-single-core"] }
cortex-m-rt = { version = "0.7", features = ["set-sp", "set-vtor"] }
crc = "3.4.0"
critical-section = "1.2.0"
defmt = "1.0"
defmt-rtt = "1.0"

embassy-embedded-hal = { version = "0.5.0", path = "../../embassy-embedded-hal" }
embassy-executor = { version = "0.9.0", path = "../../embassy-executor", features = ["arch-cortex-m", "executor-interrupt", "executor-thread"], default-features = false }
embassy-mcxa = { version = "0.1.0", path = "../../embassy-mcxa", features = ["defmt", "unstable-pac"] }
embassy-sync = { version = "0.7.2", path = "../../embassy-sync" }
embassy-time = { version = "0.5.0", path = "../../embassy-time", features = ["defmt", "defmt-timestamp-uptime"] }
embassy-time-driver = { version = "0.2.1", path = "../../embassy-time-driver", optional = true }

embedded-io-async = "0.7.0"
panic-probe = { version = "1.0", features = ["print-defmt"] }
static_cell = "2.1.1"

[profile.dev]
debug = 2
debug-assertions = true
opt-level = 's'
overflow-checks = true

[profile.release]
codegen-units = 1
debug = 2
debug-assertions = false
incremental = false
lto = "fat"
opt-level = 's'
overflow-checks = false

# do not optimize proc-macro crates = faster builds from scratch
[profile.dev.build-override]
codegen-units = 8
debug = false
debug-assertions = false
opt-level = 0
overflow-checks = false

[profile.release.build-override]
codegen-units = 8
debug = false
debug-assertions = false
opt-level = 0
overflow-checks = false

[package.metadata.embassy]
build = [
{ target = "thumbv8m.main-none-eabihf", artifact-dir = "out/tests/frdm-mcx-a266" }
]
20 changes: 20 additions & 0 deletions tests/mcxa/build.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
use std::env;
use std::fs;
use std::path::PathBuf;

fn main() {
let out = PathBuf::from(env::var("OUT_DIR").unwrap());

let memory_x = include_bytes!("memory.x");
fs::write(out.join("memory.x"), memory_x).unwrap();

// copy main linker script.
fs::write(out.join("link_ram.x"), include_bytes!("../link_ram_cortex_m.x")).unwrap();
println!("cargo:rustc-link-search={}", out.display());
println!("cargo:rerun-if-changed=link_ram.x");

println!("cargo:rustc-link-arg-bins=--nmagic");
println!("cargo:rustc-link-arg-bins=-Tlink_ram.x");
println!("cargo:rustc-link-arg-bins=-Tdefmt.x");
println!("cargo:rustc-link-arg-bins=-Tteleprobe.x");
}
5 changes: 5 additions & 0 deletions tests/mcxa/memory.x
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
MEMORY
{
FLASH : ORIGIN = 0x00000000, LENGTH = 1M
RAM : ORIGIN = 0x20000000, LENGTH = 128K
}
76 changes: 76 additions & 0 deletions tests/mcxa/src/bin/adc.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,76 @@
#![no_std]
#![no_main]

teleprobe_meta::target!(b"frdm-mcx-a266");

use embassy_executor::Spawner;
use embassy_mcxa::bind_interrupts;
use embassy_mcxa::gpio::Output;
use hal::adc::{self, Adc, TriggerPriorityPolicy};
use hal::clocks::PoweredClock;
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::Mode;
use hal::pac::adc1::ctrl::CalAvgs;
use hal::peripherals::ADC0;
use {defmt_rtt as _, embassy_mcxa as hal, panic_probe as _};

bind_interrupts!(struct Irqs {
ADC0 => adc::InterruptHandler<ADC0>;
});

#[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);

let mut output = Output::new(
p.P1_8,
embassy_mcxa::gpio::Level::Low,
embassy_mcxa::gpio::DriveStrength::Normal,
embassy_mcxa::gpio::SlewRate::Slow,
);

let adc_config = adc::Config {
enable_in_doze_mode: true,
conversion_average_mode: CalAvgs::Average128,
enable_analog_preliminary: true,
power_up_delay: 0x80,
reference_voltage_source: Refsel::Option3,
power_level_mode: Pwrsel::Lowest,
trigger_priority_policy: TriggerPriorityPolicy::ConvPreemptImmediatelyNotAutoResumed,
enable_conv_pause: false,
conv_pause_delay: 0,
power: PoweredClock::NormalEnabledDeepSleepDisabled,
source: AdcClockSel::FroLfDiv,
div: Div4::no_div(),
};
let mut adc = Adc::new_async(p.ADC0, p.P2_4, Irqs, adc_config).unwrap();

adc.do_offset_calibration();
adc.do_auto_calibration();
adc.set_resolution(Mode::Data16Bits);

// Set output low. ADC should measure (close to) GND

output.set_low();
embassy_time::Timer::after_millis(10).await;

let val = adc.read().await.unwrap();
assert!(val < 0x1000);

// Set output high, so ADC should measure (close to) VDD

output.set_high();
embassy_time::Timer::after_millis(10).await;

let val = adc.read().await.unwrap();
assert!(val > 0xE000);

defmt::info!("Test OK");
cortex_m::asm::bkpt();
}
157 changes: 157 additions & 0 deletions tests/mcxa/src/bin/crc.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,157 @@
#![no_std]
#![no_main]

teleprobe_meta::target!(b"frdm-mcx-a266");

use embassy_executor::Spawner;
use hal::config::Config;
use hal::crc::Crc;
use {defmt_rtt as _, embassy_mcxa as hal, panic_probe as _};

const CCITT_FALSE: crc::Algorithm<u16> = crc::Algorithm {
width: 16,
poly: 0x1021,
init: 0xffff,
refin: false,
refout: false,
xorout: 0,
check: 0x29b1,
residue: 0x0000,
};

const POSIX: crc::Algorithm<u32> = crc::Algorithm {
width: 32,
poly: 0x04c1_1db7,
init: 0,
refin: false,
refout: false,
xorout: 0xffff_ffff,
check: 0x765e_7680,
residue: 0x0000,
};

#[embassy_executor::main]
async fn main(_spawner: Spawner) {
let config = Config::default();
let mut p = hal::init(config);

defmt::info!("CRC example");

let buf_u8 = [0x00u8, 0x11, 0x22, 0x33];
let buf_u16 = [0x0000u16, 0x1111, 0x2222, 0x3333];
let buf_u32 = [0x0000_0000u32, 0x1111_1111, 0x2222_2222, 0x3333_3333];

// CCITT False

let sw_crc = crc::Crc::<u16>::new(&CCITT_FALSE);
let mut digest = sw_crc.digest();
digest.update(&buf_u8);
let sw_sum = digest.finalize();

let mut crc = Crc::new_ccitt_false(p.CRC0.reborrow());
crc.feed(&buf_u8);
let sum = crc.finalize();
assert_eq!(sum, sw_sum);

let mut crc = Crc::new_ccitt_false(p.CRC0.reborrow());
crc.feed(&buf_u16);
let sum = crc.finalize();
assert_eq!(sum, 0xa467);

let mut crc = Crc::new_ccitt_false(p.CRC0.reborrow());
crc.feed(&buf_u32);
let sum = crc.finalize();
assert_eq!(sum, 0xe5c7);

// Maxim

let sw_crc = crc::Crc::<u16>::new(&crc::CRC_16_MAXIM_DOW);
let mut digest = sw_crc.digest();
digest.update(&buf_u8);
let sw_sum = digest.finalize();

let mut crc = Crc::new_maxim(p.CRC0.reborrow());
crc.feed(&buf_u8);
let sum = crc.finalize();
assert_eq!(sum, sw_sum);

let mut crc = Crc::new_maxim(p.CRC0.reborrow());
crc.feed(&buf_u16);
let sum = crc.finalize();
assert_eq!(sum, 0x2afe);

let mut crc = Crc::new_maxim(p.CRC0.reborrow());
crc.feed(&buf_u32);
let sum = crc.finalize();
assert_eq!(sum, 0x17d7);

// Kermit

let sw_crc = crc::Crc::<u16>::new(&crc::CRC_16_KERMIT);
let mut digest = sw_crc.digest();
digest.update(&buf_u8);
let sw_sum = digest.finalize();

let mut crc = Crc::new_kermit(p.CRC0.reborrow());
crc.feed(&buf_u8);
let sum = crc.finalize();
assert_eq!(sum, sw_sum);

let mut crc = Crc::new_kermit(p.CRC0.reborrow());
crc.feed(&buf_u16);
let sum = crc.finalize();
assert_eq!(sum, 0x66eb);

let mut crc = Crc::new_kermit(p.CRC0.reborrow());
crc.feed(&buf_u32);
let sum = crc.finalize();
assert_eq!(sum, 0x75ea);

// ISO HDLC

let sw_crc = crc::Crc::<u32>::new(&crc::CRC_32_ISO_HDLC);
let mut digest = sw_crc.digest();
digest.update(&buf_u8);
let sw_sum = digest.finalize();

let mut crc = Crc::new_iso_hdlc(p.CRC0.reborrow());
crc.feed(&buf_u8);
let sum = crc.finalize();
assert_eq!(sum, sw_sum);

let mut crc = Crc::new_iso_hdlc(p.CRC0.reborrow());
crc.feed(&buf_u16);
let sum = crc.finalize();
assert_eq!(sum, 0x8a61_4178);

let mut crc = Crc::new_iso_hdlc(p.CRC0.reborrow());
crc.feed(&buf_u32);
let sum = crc.finalize();
assert_eq!(sum, 0xfab5_d04e);

// POSIX

let sw_crc = crc::Crc::<u32>::new(&POSIX);
let mut digest = sw_crc.digest();
digest.update(&buf_u8);
let sw_sum = digest.finalize();

let mut crc = Crc::new_posix(p.CRC0.reborrow());
crc.feed(&buf_u8);
let sum = crc.finalize();

assert_eq!(sum, sw_sum);

let mut crc = Crc::new_posix(p.CRC0.reborrow());
crc.feed(&buf_u16);
let sum = crc.finalize();
assert_eq!(sum, 0x6d76_4f58);

let mut crc = Crc::new_posix(p.CRC0.reborrow());
crc.feed(&buf_u32);
let sum = crc.finalize();
assert_eq!(sum, 0x2a5b_cb90);

defmt::info!("Test OK");
cortex_m::asm::bkpt();
}
Loading