diff options
| author | chemicstry <[email protected]> | 2023-07-31 10:29:20 +0300 |
|---|---|---|
| committer | chemicstry <[email protected]> | 2023-07-31 10:29:20 +0300 |
| commit | 780569c08ab089dae67c5d57dd1852d5419d4577 (patch) | |
| tree | 021965b7c9ac34fb33507c3998b3a6b6e7cecae7 /tests | |
| parent | a56ef685f3bfd9148a79c9dbbdde83a2c1642ba5 (diff) | |
| parent | 6c6bd11c1a28eb8985518a10bd723c622d82f4b6 (diff) | |
Merge remote-tracking branch 'origin/main' into bxcan_timestamp
Diffstat (limited to 'tests')
| -rw-r--r-- | tests/nrf/src/bin/wifi_esp_hosted_perf.rs | 6 | ||||
| -rw-r--r-- | tests/rp/src/bin/cyw43-perf.rs | 4 | ||||
| -rw-r--r-- | tests/rp/src/bin/flash.rs | 14 | ||||
| -rw-r--r-- | tests/rp/src/bin/pio_irq.rs | 4 | ||||
| -rw-r--r-- | tests/rp/src/bin/pio_multi_load.rs | 126 | ||||
| -rw-r--r-- | tests/stm32/Cargo.toml | 13 | ||||
| -rw-r--r-- | tests/stm32/src/bin/dac.rs | 81 | ||||
| -rw-r--r-- | tests/stm32/src/bin/spi.rs | 11 | ||||
| -rw-r--r-- | tests/stm32/src/bin/spi_dma.rs | 11 | ||||
| -rw-r--r-- | tests/stm32/src/common.rs | 1 |
10 files changed, 245 insertions, 26 deletions
diff --git a/tests/nrf/src/bin/wifi_esp_hosted_perf.rs b/tests/nrf/src/bin/wifi_esp_hosted_perf.rs index 398ab9d27..e2adfe0be 100644 --- a/tests/nrf/src/bin/wifi_esp_hosted_perf.rs +++ b/tests/nrf/src/bin/wifi_esp_hosted_perf.rs | |||
| @@ -118,9 +118,9 @@ const WIFI_NETWORK: &str = "EmbassyTest"; | |||
| 118 | const WIFI_PASSWORD: &str = "V8YxhKt5CdIAJFud"; | 118 | const WIFI_PASSWORD: &str = "V8YxhKt5CdIAJFud"; |
| 119 | 119 | ||
| 120 | const TEST_DURATION: usize = 10; | 120 | const TEST_DURATION: usize = 10; |
| 121 | const TEST_EXPECTED_DOWNLOAD_KBPS: usize = 150; | 121 | const TEST_EXPECTED_DOWNLOAD_KBPS: usize = 50; |
| 122 | const TEST_EXPECTED_UPLOAD_KBPS: usize = 150; | 122 | const TEST_EXPECTED_UPLOAD_KBPS: usize = 50; |
| 123 | const TEST_EXPECTED_UPLOAD_DOWNLOAD_KBPS: usize = 150; | 123 | const TEST_EXPECTED_UPLOAD_DOWNLOAD_KBPS: usize = 50; |
| 124 | const RX_BUFFER_SIZE: usize = 4096; | 124 | const RX_BUFFER_SIZE: usize = 4096; |
| 125 | const TX_BUFFER_SIZE: usize = 4096; | 125 | const TX_BUFFER_SIZE: usize = 4096; |
| 126 | const SERVER_ADDRESS: Ipv4Address = Ipv4Address::new(192, 168, 2, 2); | 126 | const SERVER_ADDRESS: Ipv4Address = Ipv4Address::new(192, 168, 2, 2); |
diff --git a/tests/rp/src/bin/cyw43-perf.rs b/tests/rp/src/bin/cyw43-perf.rs index bc127e2e5..fffdabc9b 100644 --- a/tests/rp/src/bin/cyw43-perf.rs +++ b/tests/rp/src/bin/cyw43-perf.rs | |||
| @@ -48,9 +48,9 @@ async fn main(spawner: Spawner) { | |||
| 48 | } | 48 | } |
| 49 | 49 | ||
| 50 | // cyw43 firmware needs to be flashed manually: | 50 | // cyw43 firmware needs to be flashed manually: |
| 51 | // probe-rs download 43439A0.bin --format bin --chip RP2040 --base-address 0x101c0000 | 51 | // probe-rs download 43439A0.bin --format bin --chip RP2040 --base-address 0x101b0000 |
| 52 | // probe-rs download 43439A0_clm.bin --format bin --chip RP2040 --base-address 0x101f8000 | 52 | // probe-rs download 43439A0_clm.bin --format bin --chip RP2040 --base-address 0x101f8000 |
| 53 | let fw = unsafe { core::slice::from_raw_parts(0x101c0000 as *const u8, 224190) }; | 53 | let fw = unsafe { core::slice::from_raw_parts(0x101b0000 as *const u8, 230321) }; |
| 54 | let clm = unsafe { core::slice::from_raw_parts(0x101f8000 as *const u8, 4752) }; | 54 | let clm = unsafe { core::slice::from_raw_parts(0x101f8000 as *const u8, 4752) }; |
| 55 | 55 | ||
| 56 | let pwr = Output::new(p.PIN_23, Level::Low); | 56 | let pwr = Output::new(p.PIN_23, Level::Low); |
diff --git a/tests/rp/src/bin/flash.rs b/tests/rp/src/bin/flash.rs index cf9b86df5..c31d6decf 100644 --- a/tests/rp/src/bin/flash.rs +++ b/tests/rp/src/bin/flash.rs | |||
| @@ -6,11 +6,11 @@ mod common; | |||
| 6 | 6 | ||
| 7 | use defmt::*; | 7 | use defmt::*; |
| 8 | use embassy_executor::Spawner; | 8 | use embassy_executor::Spawner; |
| 9 | use embassy_rp::flash::{ERASE_SIZE, FLASH_BASE}; | 9 | use embassy_rp::flash::{Async, ERASE_SIZE, FLASH_BASE}; |
| 10 | use embassy_time::{Duration, Timer}; | 10 | use embassy_time::{Duration, Timer}; |
| 11 | use {defmt_rtt as _, panic_probe as _}; | 11 | use {defmt_rtt as _, panic_probe as _}; |
| 12 | 12 | ||
| 13 | const ADDR_OFFSET: u32 = 0x4000; | 13 | const ADDR_OFFSET: u32 = 0x8000; |
| 14 | 14 | ||
| 15 | #[embassy_executor::main] | 15 | #[embassy_executor::main] |
| 16 | async fn main(_spawner: Spawner) { | 16 | async fn main(_spawner: Spawner) { |
| @@ -23,7 +23,7 @@ async fn main(_spawner: Spawner) { | |||
| 23 | // https://github.com/knurling-rs/defmt/pull/683 | 23 | // https://github.com/knurling-rs/defmt/pull/683 |
| 24 | Timer::after(Duration::from_millis(10)).await; | 24 | Timer::after(Duration::from_millis(10)).await; |
| 25 | 25 | ||
| 26 | let mut flash = embassy_rp::flash::Flash::<_, { 2 * 1024 * 1024 }>::new(p.FLASH); | 26 | let mut flash = embassy_rp::flash::Flash::<_, Async, { 2 * 1024 * 1024 }>::new(p.FLASH, p.DMA_CH0); |
| 27 | 27 | ||
| 28 | // Get JEDEC id | 28 | // Get JEDEC id |
| 29 | let jedec = defmt::unwrap!(flash.jedec_id()); | 29 | let jedec = defmt::unwrap!(flash.jedec_id()); |
| @@ -60,6 +60,14 @@ async fn main(_spawner: Spawner) { | |||
| 60 | defmt::panic!("unexpected"); | 60 | defmt::panic!("unexpected"); |
| 61 | } | 61 | } |
| 62 | 62 | ||
| 63 | let mut buf = [0u32; ERASE_SIZE / 4]; | ||
| 64 | |||
| 65 | defmt::unwrap!(flash.background_read(ADDR_OFFSET, &mut buf)).await; | ||
| 66 | info!("Contents after write starts with {=u32:x}", buf[0]); | ||
| 67 | if buf.iter().any(|x| *x != 0xDADADADA) { | ||
| 68 | defmt::panic!("unexpected"); | ||
| 69 | } | ||
| 70 | |||
| 63 | info!("Test OK"); | 71 | info!("Test OK"); |
| 64 | cortex_m::asm::bkpt(); | 72 | cortex_m::asm::bkpt(); |
| 65 | } | 73 | } |
diff --git a/tests/rp/src/bin/pio_irq.rs b/tests/rp/src/bin/pio_irq.rs index 45004424a..bdea63eaa 100644 --- a/tests/rp/src/bin/pio_irq.rs +++ b/tests/rp/src/bin/pio_irq.rs | |||
| @@ -9,7 +9,6 @@ use embassy_executor::Spawner; | |||
| 9 | use embassy_rp::bind_interrupts; | 9 | use embassy_rp::bind_interrupts; |
| 10 | use embassy_rp::peripherals::PIO0; | 10 | use embassy_rp::peripherals::PIO0; |
| 11 | use embassy_rp::pio::{Config, InterruptHandler, Pio}; | 11 | use embassy_rp::pio::{Config, InterruptHandler, Pio}; |
| 12 | use embassy_rp::relocate::RelocatedProgram; | ||
| 13 | use {defmt_rtt as _, panic_probe as _}; | 12 | use {defmt_rtt as _, panic_probe as _}; |
| 14 | 13 | ||
| 15 | bind_interrupts!(struct Irqs { | 14 | bind_interrupts!(struct Irqs { |
| @@ -35,9 +34,8 @@ async fn main(_spawner: Spawner) { | |||
| 35 | "irq wait 1", | 34 | "irq wait 1", |
| 36 | ); | 35 | ); |
| 37 | 36 | ||
| 38 | let relocated = RelocatedProgram::new(&prg.program); | ||
| 39 | let mut cfg = Config::default(); | 37 | let mut cfg = Config::default(); |
| 40 | cfg.use_program(&common.load_program(&relocated), &[]); | 38 | cfg.use_program(&common.load_program(&prg.program), &[]); |
| 41 | sm.set_config(&cfg); | 39 | sm.set_config(&cfg); |
| 42 | sm.set_enable(true); | 40 | sm.set_enable(true); |
| 43 | 41 | ||
diff --git a/tests/rp/src/bin/pio_multi_load.rs b/tests/rp/src/bin/pio_multi_load.rs new file mode 100644 index 000000000..356f16795 --- /dev/null +++ b/tests/rp/src/bin/pio_multi_load.rs | |||
| @@ -0,0 +1,126 @@ | |||
| 1 | #![no_std] | ||
| 2 | #![no_main] | ||
| 3 | #![feature(type_alias_impl_trait)] | ||
| 4 | #[path = "../common.rs"] | ||
| 5 | mod common; | ||
| 6 | |||
| 7 | use defmt::info; | ||
| 8 | use embassy_executor::Spawner; | ||
| 9 | use embassy_rp::bind_interrupts; | ||
| 10 | use embassy_rp::peripherals::PIO0; | ||
| 11 | use embassy_rp::pio::{Config, InterruptHandler, LoadError, Pio}; | ||
| 12 | use {defmt_rtt as _, panic_probe as _}; | ||
| 13 | |||
| 14 | bind_interrupts!(struct Irqs { | ||
| 15 | PIO0_IRQ_0 => InterruptHandler<PIO0>; | ||
| 16 | }); | ||
| 17 | |||
| 18 | #[embassy_executor::main] | ||
| 19 | async fn main(_spawner: Spawner) { | ||
| 20 | let p = embassy_rp::init(Default::default()); | ||
| 21 | let pio = p.PIO0; | ||
| 22 | let Pio { | ||
| 23 | mut common, | ||
| 24 | mut sm0, | ||
| 25 | mut sm1, | ||
| 26 | mut sm2, | ||
| 27 | irq_flags, | ||
| 28 | .. | ||
| 29 | } = Pio::new(pio, Irqs); | ||
| 30 | |||
| 31 | // load with explicit origin works | ||
| 32 | let prg1 = pio_proc::pio_asm!( | ||
| 33 | ".origin 4" | ||
| 34 | "nop", | ||
| 35 | "nop", | ||
| 36 | "nop", | ||
| 37 | "nop", | ||
| 38 | "nop", | ||
| 39 | "nop", | ||
| 40 | "nop", | ||
| 41 | "irq 0", | ||
| 42 | "nop", | ||
| 43 | "nop", | ||
| 44 | ); | ||
| 45 | let loaded1 = common.load_program(&prg1.program); | ||
| 46 | assert_eq!(loaded1.origin, 4); | ||
| 47 | assert_eq!(loaded1.wrap.source, 13); | ||
| 48 | assert_eq!(loaded1.wrap.target, 4); | ||
| 49 | |||
| 50 | // load without origin chooses a free space | ||
| 51 | let prg2 = pio_proc::pio_asm!("nop", "nop", "nop", "nop", "nop", "nop", "nop", "irq 1", "nop", "nop",); | ||
| 52 | let loaded2 = common.load_program(&prg2.program); | ||
| 53 | assert_eq!(loaded2.origin, 14); | ||
| 54 | assert_eq!(loaded2.wrap.source, 23); | ||
| 55 | assert_eq!(loaded2.wrap.target, 14); | ||
| 56 | |||
| 57 | // wrapping around the end of program space automatically works | ||
| 58 | let prg3 = | ||
| 59 | pio_proc::pio_asm!("nop", "nop", "nop", "nop", "nop", "nop", "nop", "nop", "nop", "nop", "nop", "irq 2",); | ||
| 60 | let loaded3 = common.load_program(&prg3.program); | ||
| 61 | assert_eq!(loaded3.origin, 24); | ||
| 62 | assert_eq!(loaded3.wrap.source, 3); | ||
| 63 | assert_eq!(loaded3.wrap.target, 24); | ||
| 64 | |||
| 65 | // check that the programs actually work | ||
| 66 | { | ||
| 67 | let mut cfg = Config::default(); | ||
| 68 | cfg.use_program(&loaded1, &[]); | ||
| 69 | sm0.set_config(&cfg); | ||
| 70 | sm0.set_enable(true); | ||
| 71 | while !irq_flags.check(0) {} | ||
| 72 | sm0.set_enable(false); | ||
| 73 | } | ||
| 74 | { | ||
| 75 | let mut cfg = Config::default(); | ||
| 76 | cfg.use_program(&loaded2, &[]); | ||
| 77 | sm1.set_config(&cfg); | ||
| 78 | sm1.set_enable(true); | ||
| 79 | while !irq_flags.check(1) {} | ||
| 80 | sm1.set_enable(false); | ||
| 81 | } | ||
| 82 | { | ||
| 83 | let mut cfg = Config::default(); | ||
| 84 | cfg.use_program(&loaded3, &[]); | ||
| 85 | sm2.set_config(&cfg); | ||
| 86 | sm2.set_enable(true); | ||
| 87 | while !irq_flags.check(2) {} | ||
| 88 | sm2.set_enable(false); | ||
| 89 | } | ||
| 90 | |||
| 91 | // instruction memory is full now. all loads should fail. | ||
| 92 | { | ||
| 93 | let prg = pio_proc::pio_asm!(".origin 0", "nop"); | ||
| 94 | match common.try_load_program(&prg.program) { | ||
| 95 | Err(LoadError::AddressInUse(0)) => (), | ||
| 96 | _ => panic!("program loaded when it shouldn't"), | ||
| 97 | }; | ||
| 98 | |||
| 99 | let prg = pio_proc::pio_asm!("nop"); | ||
| 100 | match common.try_load_program(&prg.program) { | ||
| 101 | Err(LoadError::InsufficientSpace) => (), | ||
| 102 | _ => panic!("program loaded when it shouldn't"), | ||
| 103 | }; | ||
| 104 | } | ||
| 105 | |||
| 106 | // freeing some memory should allow further loads though. | ||
| 107 | unsafe { | ||
| 108 | common.free_instr(loaded3.used_memory); | ||
| 109 | } | ||
| 110 | { | ||
| 111 | let prg = pio_proc::pio_asm!(".origin 0", "nop"); | ||
| 112 | match common.try_load_program(&prg.program) { | ||
| 113 | Ok(_) => (), | ||
| 114 | _ => panic!("program didn't loaded when it shouldn"), | ||
| 115 | }; | ||
| 116 | |||
| 117 | let prg = pio_proc::pio_asm!("nop"); | ||
| 118 | match common.try_load_program(&prg.program) { | ||
| 119 | Ok(_) => (), | ||
| 120 | _ => panic!("program didn't loaded when it shouldn"), | ||
| 121 | }; | ||
| 122 | } | ||
| 123 | |||
| 124 | info!("Test OK"); | ||
| 125 | cortex_m::asm::bkpt(); | ||
| 126 | } | ||
diff --git a/tests/stm32/Cargo.toml b/tests/stm32/Cargo.toml index 3007cd1e6..17320649e 100644 --- a/tests/stm32/Cargo.toml +++ b/tests/stm32/Cargo.toml | |||
| @@ -7,11 +7,11 @@ autobins = false | |||
| 7 | 7 | ||
| 8 | [features] | 8 | [features] |
| 9 | stm32f103c8 = ["embassy-stm32/stm32f103c8", "not-gpdma"] # Blue Pill | 9 | stm32f103c8 = ["embassy-stm32/stm32f103c8", "not-gpdma"] # Blue Pill |
| 10 | stm32f429zi = ["embassy-stm32/stm32f429zi", "chrono", "can", "not-gpdma"] # Nucleo "sdmmc" | 10 | stm32f429zi = ["embassy-stm32/stm32f429zi", "chrono", "can", "not-gpdma", "dac-adc-pin"] # Nucleo "sdmmc" |
| 11 | stm32g071rb = ["embassy-stm32/stm32g071rb", "not-gpdma"] # Nucleo | 11 | stm32g071rb = ["embassy-stm32/stm32g071rb", "not-gpdma", "dac-adc-pin"] # Nucleo |
| 12 | stm32c031c6 = ["embassy-stm32/stm32c031c6", "not-gpdma"] # Nucleo | 12 | stm32c031c6 = ["embassy-stm32/stm32c031c6", "not-gpdma"] # Nucleo |
| 13 | stm32g491re = ["embassy-stm32/stm32g491re", "not-gpdma"] # Nucleo | 13 | stm32g491re = ["embassy-stm32/stm32g491re", "not-gpdma"] # Nucleo |
| 14 | stm32h755zi = ["embassy-stm32/stm32h755zi-cm7", "not-gpdma"] # Nucleo | 14 | stm32h755zi = ["embassy-stm32/stm32h755zi-cm7", "not-gpdma", "dac-adc-pin"] # Nucleo |
| 15 | stm32wb55rg = ["embassy-stm32/stm32wb55rg", "not-gpdma", "ble", "mac" ] # Nucleo | 15 | stm32wb55rg = ["embassy-stm32/stm32wb55rg", "not-gpdma", "ble", "mac" ] # Nucleo |
| 16 | stm32h563zi = ["embassy-stm32/stm32h563zi"] # Nucleo | 16 | stm32h563zi = ["embassy-stm32/stm32h563zi"] # Nucleo |
| 17 | stm32u585ai = ["embassy-stm32/stm32u585ai"] # IoT board | 17 | stm32u585ai = ["embassy-stm32/stm32u585ai"] # IoT board |
| @@ -23,6 +23,7 @@ ble = ["dep:embassy-stm32-wpan", "embassy-stm32-wpan/ble"] | |||
| 23 | mac = ["dep:embassy-stm32-wpan", "embassy-stm32-wpan/mac"] | 23 | mac = ["dep:embassy-stm32-wpan", "embassy-stm32-wpan/mac"] |
| 24 | embassy-stm32-wpan = [] | 24 | embassy-stm32-wpan = [] |
| 25 | not-gpdma = [] | 25 | not-gpdma = [] |
| 26 | dac-adc-pin = [] | ||
| 26 | 27 | ||
| 27 | [dependencies] | 28 | [dependencies] |
| 28 | teleprobe-meta = "1" | 29 | teleprobe-meta = "1" |
| @@ -42,6 +43,7 @@ cortex-m-rt = "0.7.0" | |||
| 42 | embedded-hal = "0.2.6" | 43 | embedded-hal = "0.2.6" |
| 43 | embedded-hal-1 = { package = "embedded-hal", version = "=1.0.0-alpha.11" } | 44 | embedded-hal-1 = { package = "embedded-hal", version = "=1.0.0-alpha.11" } |
| 44 | embedded-hal-async = { version = "=0.2.0-alpha.2" } | 45 | embedded-hal-async = { version = "=0.2.0-alpha.2" } |
| 46 | micromath = "2.0.0" | ||
| 45 | panic-probe = { version = "0.3.0", features = ["print-defmt"] } | 47 | panic-probe = { version = "0.3.0", features = ["print-defmt"] } |
| 46 | rand_core = { version = "0.6", default-features = false } | 48 | rand_core = { version = "0.6", default-features = false } |
| 47 | rand_chacha = { version = "0.3", default-features = false } | 49 | rand_chacha = { version = "0.3", default-features = false } |
| @@ -56,6 +58,11 @@ path = "src/bin/can.rs" | |||
| 56 | required-features = [ "can",] | 58 | required-features = [ "can",] |
| 57 | 59 | ||
| 58 | [[bin]] | 60 | [[bin]] |
| 61 | name = "dac" | ||
| 62 | path = "src/bin/dac.rs" | ||
| 63 | required-features = [ "dac-adc-pin",] | ||
| 64 | |||
| 65 | [[bin]] | ||
| 59 | name = "gpio" | 66 | name = "gpio" |
| 60 | path = "src/bin/gpio.rs" | 67 | path = "src/bin/gpio.rs" |
| 61 | required-features = [] | 68 | required-features = [] |
diff --git a/tests/stm32/src/bin/dac.rs b/tests/stm32/src/bin/dac.rs new file mode 100644 index 000000000..67a7d5b59 --- /dev/null +++ b/tests/stm32/src/bin/dac.rs | |||
| @@ -0,0 +1,81 @@ | |||
| 1 | #![no_std] | ||
| 2 | #![no_main] | ||
| 3 | #![feature(type_alias_impl_trait)] | ||
| 4 | |||
| 5 | // required-features: dac-adc-pin | ||
| 6 | |||
| 7 | #[path = "../common.rs"] | ||
| 8 | mod common; | ||
| 9 | use common::*; | ||
| 10 | use defmt::assert; | ||
| 11 | use embassy_executor::Spawner; | ||
| 12 | use embassy_stm32::adc::Adc; | ||
| 13 | use embassy_stm32::dac::{DacCh1, DacChannel, Value}; | ||
| 14 | use embassy_stm32::dma::NoDma; | ||
| 15 | use embassy_time::{Delay, Duration, Timer}; | ||
| 16 | use {defmt_rtt as _, panic_probe as _}; | ||
| 17 | |||
| 18 | #[embassy_executor::main] | ||
| 19 | async fn main(_spawner: Spawner) { | ||
| 20 | // Initialize the board and obtain a Peripherals instance | ||
| 21 | let p: embassy_stm32::Peripherals = embassy_stm32::init(config()); | ||
| 22 | |||
| 23 | #[cfg(feature = "stm32f429zi")] | ||
| 24 | let dac_peripheral = p.DAC; | ||
| 25 | |||
| 26 | #[cfg(any(feature = "stm32h755zi", feature = "stm32g071rb"))] | ||
| 27 | let dac_peripheral = p.DAC1; | ||
| 28 | |||
| 29 | let mut dac: DacCh1<'_, _, NoDma> = DacCh1::new(dac_peripheral, NoDma, p.PA4); | ||
| 30 | unwrap!(dac.set_trigger_enable(false)); | ||
| 31 | |||
| 32 | let mut adc = Adc::new(p.ADC1, &mut Delay); | ||
| 33 | |||
| 34 | #[cfg(feature = "stm32h755zi")] | ||
| 35 | let normalization_factor = 256; | ||
| 36 | #[cfg(any(feature = "stm32f429zi", feature = "stm32g071rb"))] | ||
| 37 | let normalization_factor: i32 = 16; | ||
| 38 | |||
| 39 | unwrap!(dac.set(Value::Bit8(0))); | ||
| 40 | // Now wait a little to obtain a stable value | ||
| 41 | Timer::after(Duration::from_millis(30)).await; | ||
| 42 | let offset = adc.read(&mut unsafe { embassy_stm32::Peripherals::steal() }.PA4); | ||
| 43 | |||
| 44 | for v in 0..=255 { | ||
| 45 | // First set the DAC output value | ||
| 46 | let dac_output_val = to_sine_wave(v); | ||
| 47 | unwrap!(dac.set(Value::Bit8(dac_output_val))); | ||
| 48 | |||
| 49 | // Now wait a little to obtain a stable value | ||
| 50 | Timer::after(Duration::from_millis(30)).await; | ||
| 51 | |||
| 52 | // Need to steal the peripherals here because PA4 is obviously in use already | ||
| 53 | let measured = adc.read(&mut unsafe { embassy_stm32::Peripherals::steal() }.PA4); | ||
| 54 | // Calibrate and normalize the measurement to get close to the dac_output_val | ||
| 55 | let measured_normalized = ((measured as i32 - offset as i32) / normalization_factor) as i16; | ||
| 56 | |||
| 57 | info!("value / measured: {} / {}", dac_output_val, measured_normalized); | ||
| 58 | |||
| 59 | // The deviations are quite enormous but that does not matter since this is only a quick test | ||
| 60 | assert!((dac_output_val as i16 - measured_normalized).abs() < 15); | ||
| 61 | } | ||
| 62 | |||
| 63 | info!("Test OK"); | ||
| 64 | cortex_m::asm::bkpt(); | ||
| 65 | } | ||
| 66 | |||
| 67 | use core::f32::consts::PI; | ||
| 68 | |||
| 69 | use micromath::F32Ext; | ||
| 70 | |||
| 71 | fn to_sine_wave(v: u8) -> u8 { | ||
| 72 | if v >= 128 { | ||
| 73 | // top half | ||
| 74 | let r = PI * ((v - 128) as f32 / 128.0); | ||
| 75 | (r.sin() * 128.0 + 127.0) as u8 | ||
| 76 | } else { | ||
| 77 | // bottom half | ||
| 78 | let r = PI + PI * (v as f32 / 128.0); | ||
| 79 | (r.sin() * 128.0 + 127.0) as u8 | ||
| 80 | } | ||
| 81 | } | ||
diff --git a/tests/stm32/src/bin/spi.rs b/tests/stm32/src/bin/spi.rs index 819ecae3c..e51dd5bf2 100644 --- a/tests/stm32/src/bin/spi.rs +++ b/tests/stm32/src/bin/spi.rs | |||
| @@ -35,15 +35,14 @@ async fn main(_spawner: Spawner) { | |||
| 35 | #[cfg(feature = "stm32c031c6")] | 35 | #[cfg(feature = "stm32c031c6")] |
| 36 | let (spi, sck, mosi, miso) = (p.SPI1, p.PA5, p.PA7, p.PA6); | 36 | let (spi, sck, mosi, miso) = (p.SPI1, p.PA5, p.PA7, p.PA6); |
| 37 | 37 | ||
| 38 | let mut spi_config = spi::Config::default(); | ||
| 39 | spi_config.frequency = Hertz(1_000_000); | ||
| 40 | |||
| 38 | let mut spi = Spi::new( | 41 | let mut spi = Spi::new( |
| 39 | spi, | 42 | spi, sck, // Arduino D13 |
| 40 | sck, // Arduino D13 | ||
| 41 | mosi, // Arduino D11 | 43 | mosi, // Arduino D11 |
| 42 | miso, // Arduino D12 | 44 | miso, // Arduino D12 |
| 43 | NoDma, | 45 | NoDma, NoDma, spi_config, |
| 44 | NoDma, | ||
| 45 | Hertz(1_000_000), | ||
| 46 | spi::Config::default(), | ||
| 47 | ); | 46 | ); |
| 48 | 47 | ||
| 49 | let data: [u8; 9] = [0x00, 0xFF, 0xAA, 0x55, 0xC0, 0xFF, 0xEE, 0xC0, 0xDE]; | 48 | let data: [u8; 9] = [0x00, 0xFF, 0xAA, 0x55, 0xC0, 0xFF, 0xEE, 0xC0, 0xDE]; |
diff --git a/tests/stm32/src/bin/spi_dma.rs b/tests/stm32/src/bin/spi_dma.rs index 78aad24e1..d45cbe45b 100644 --- a/tests/stm32/src/bin/spi_dma.rs +++ b/tests/stm32/src/bin/spi_dma.rs | |||
| @@ -34,15 +34,14 @@ async fn main(_spawner: Spawner) { | |||
| 34 | #[cfg(feature = "stm32c031c6")] | 34 | #[cfg(feature = "stm32c031c6")] |
| 35 | let (spi, sck, mosi, miso, tx_dma, rx_dma) = (p.SPI1, p.PA5, p.PA7, p.PA6, p.DMA1_CH1, p.DMA1_CH2); | 35 | let (spi, sck, mosi, miso, tx_dma, rx_dma) = (p.SPI1, p.PA5, p.PA7, p.PA6, p.DMA1_CH1, p.DMA1_CH2); |
| 36 | 36 | ||
| 37 | let mut spi_config = spi::Config::default(); | ||
| 38 | spi_config.frequency = Hertz(1_000_000); | ||
| 39 | |||
| 37 | let mut spi = Spi::new( | 40 | let mut spi = Spi::new( |
| 38 | spi, | 41 | spi, sck, // Arduino D13 |
| 39 | sck, // Arduino D13 | ||
| 40 | mosi, // Arduino D11 | 42 | mosi, // Arduino D11 |
| 41 | miso, // Arduino D12 | 43 | miso, // Arduino D12 |
| 42 | tx_dma, | 44 | tx_dma, rx_dma, spi_config, |
| 43 | rx_dma, | ||
| 44 | Hertz(1_000_000), | ||
| 45 | spi::Config::default(), | ||
| 46 | ); | 45 | ); |
| 47 | 46 | ||
| 48 | let data: [u8; 9] = [0x00, 0xFF, 0xAA, 0x55, 0xC0, 0xFF, 0xEE, 0xC0, 0xDE]; | 47 | let data: [u8; 9] = [0x00, 0xFF, 0xAA, 0x55, 0xC0, 0xFF, 0xEE, 0xC0, 0xDE]; |
diff --git a/tests/stm32/src/common.rs b/tests/stm32/src/common.rs index 3d2a9b8ef..ca5cb43ac 100644 --- a/tests/stm32/src/common.rs +++ b/tests/stm32/src/common.rs | |||
| @@ -33,6 +33,7 @@ pub fn config() -> Config { | |||
| 33 | { | 33 | { |
| 34 | config.rcc.sys_ck = Some(Hertz(400_000_000)); | 34 | config.rcc.sys_ck = Some(Hertz(400_000_000)); |
| 35 | config.rcc.pll1.q_ck = Some(Hertz(100_000_000)); | 35 | config.rcc.pll1.q_ck = Some(Hertz(100_000_000)); |
| 36 | config.rcc.adc_clock_source = embassy_stm32::rcc::AdcClockSource::PerCk; | ||
| 36 | } | 37 | } |
| 37 | 38 | ||
| 38 | #[cfg(feature = "stm32u585ai")] | 39 | #[cfg(feature = "stm32u585ai")] |
