diff options
| author | Dario Nieuwenhuis <[email protected]> | 2023-12-08 20:24:15 +0100 |
|---|---|---|
| committer | Dario Nieuwenhuis <[email protected]> | 2023-12-08 20:24:15 +0100 |
| commit | fe218ed978a76014b45410e188f974e20adba1a0 (patch) | |
| tree | e4924437f202efc0bc8e843d5652ad7a81fc52e8 /tests | |
| parent | c27459c05251aada50b4de620b78d13dc071a765 (diff) | |
tests/stm32: add L1 DAC/ADC test.
Diffstat (limited to 'tests')
| -rw-r--r-- | tests/stm32/Cargo.toml | 17 | ||||
| -rw-r--r-- | tests/stm32/src/bin/dac.rs | 5 | ||||
| -rw-r--r-- | tests/stm32/src/bin/dac_l1.rs | 86 | ||||
| -rw-r--r-- | tests/stm32/src/common.rs | 9 |
4 files changed, 105 insertions, 12 deletions
diff --git a/tests/stm32/Cargo.toml b/tests/stm32/Cargo.toml index 8c2cfdf5c..460c103b2 100644 --- a/tests/stm32/Cargo.toml +++ b/tests/stm32/Cargo.toml | |||
| @@ -10,14 +10,14 @@ stm32c031c6 = ["embassy-stm32/stm32c031c6", "cm0", "not-gpdma"] | |||
| 10 | stm32f103c8 = ["embassy-stm32/stm32f103c8", "not-gpdma"] | 10 | stm32f103c8 = ["embassy-stm32/stm32f103c8", "not-gpdma"] |
| 11 | stm32f207zg = ["embassy-stm32/stm32f207zg", "chrono", "not-gpdma", "eth", "rng"] | 11 | stm32f207zg = ["embassy-stm32/stm32f207zg", "chrono", "not-gpdma", "eth", "rng"] |
| 12 | stm32f303ze = ["embassy-stm32/stm32f303ze", "chrono", "not-gpdma"] | 12 | stm32f303ze = ["embassy-stm32/stm32f303ze", "chrono", "not-gpdma"] |
| 13 | stm32f429zi = ["embassy-stm32/stm32f429zi", "chrono", "eth", "stop", "can", "not-gpdma", "dac-adc-pin", "rng"] | 13 | stm32f429zi = ["embassy-stm32/stm32f429zi", "chrono", "eth", "stop", "can", "not-gpdma", "dac", "rng"] |
| 14 | stm32f446re = ["embassy-stm32/stm32f446re", "chrono", "stop", "can", "not-gpdma", "dac-adc-pin", "sdmmc"] | 14 | stm32f446re = ["embassy-stm32/stm32f446re", "chrono", "stop", "can", "not-gpdma", "dac", "sdmmc"] |
| 15 | stm32f767zi = ["embassy-stm32/stm32f767zi", "chrono", "not-gpdma", "eth", "rng"] | 15 | stm32f767zi = ["embassy-stm32/stm32f767zi", "chrono", "not-gpdma", "eth", "rng"] |
| 16 | stm32g071rb = ["embassy-stm32/stm32g071rb", "cm0", "not-gpdma", "dac-adc-pin"] | 16 | stm32g071rb = ["embassy-stm32/stm32g071rb", "cm0", "not-gpdma", "dac"] |
| 17 | stm32g491re = ["embassy-stm32/stm32g491re", "chrono", "stop", "not-gpdma", "rng"] | 17 | stm32g491re = ["embassy-stm32/stm32g491re", "chrono", "stop", "not-gpdma", "rng"] |
| 18 | stm32h563zi = ["embassy-stm32/stm32h563zi", "chrono", "eth", "rng"] | 18 | stm32h563zi = ["embassy-stm32/stm32h563zi", "chrono", "eth", "rng"] |
| 19 | stm32h753zi = ["embassy-stm32/stm32h753zi", "chrono", "not-gpdma", "eth", "rng"] | 19 | stm32h753zi = ["embassy-stm32/stm32h753zi", "chrono", "not-gpdma", "eth", "rng"] |
| 20 | stm32h755zi = ["embassy-stm32/stm32h755zi-cm7", "chrono", "not-gpdma", "eth", "dac-adc-pin", "rng"] | 20 | stm32h755zi = ["embassy-stm32/stm32h755zi-cm7", "chrono", "not-gpdma", "eth", "dac", "rng"] |
| 21 | stm32h7a3zi = ["embassy-stm32/stm32h7a3zi", "not-gpdma", "rng"] | 21 | stm32h7a3zi = ["embassy-stm32/stm32h7a3zi", "not-gpdma", "rng"] |
| 22 | stm32l073rz = ["embassy-stm32/stm32l073rz", "cm0", "not-gpdma", "rng"] | 22 | stm32l073rz = ["embassy-stm32/stm32l073rz", "cm0", "not-gpdma", "rng"] |
| 23 | stm32l152re = ["embassy-stm32/stm32l152re", "chrono", "not-gpdma"] | 23 | stm32l152re = ["embassy-stm32/stm32l152re", "chrono", "not-gpdma"] |
| @@ -41,7 +41,7 @@ ble = ["dep:embassy-stm32-wpan", "embassy-stm32-wpan/ble"] | |||
| 41 | mac = ["dep:embassy-stm32-wpan", "embassy-stm32-wpan/mac"] | 41 | mac = ["dep:embassy-stm32-wpan", "embassy-stm32-wpan/mac"] |
| 42 | embassy-stm32-wpan = [] | 42 | embassy-stm32-wpan = [] |
| 43 | not-gpdma = [] | 43 | not-gpdma = [] |
| 44 | dac-adc-pin = [] | 44 | dac = [] |
| 45 | 45 | ||
| 46 | cm0 = ["portable-atomic/unsafe-assume-single-core"] | 46 | cm0 = ["portable-atomic/unsafe-assume-single-core"] |
| 47 | 47 | ||
| @@ -84,7 +84,12 @@ required-features = [ "can",] | |||
| 84 | [[bin]] | 84 | [[bin]] |
| 85 | name = "dac" | 85 | name = "dac" |
| 86 | path = "src/bin/dac.rs" | 86 | path = "src/bin/dac.rs" |
| 87 | required-features = [ "dac-adc-pin",] | 87 | required-features = [ "dac",] |
| 88 | |||
| 89 | [[bin]] | ||
| 90 | name = "dac_l1" | ||
| 91 | path = "src/bin/dac_l1.rs" | ||
| 92 | required-features = [ "stm32l152re",] | ||
| 88 | 93 | ||
| 89 | [[bin]] | 94 | [[bin]] |
| 90 | name = "eth" | 95 | name = "eth" |
diff --git a/tests/stm32/src/bin/dac.rs b/tests/stm32/src/bin/dac.rs index cf43106b3..9d64742df 100644 --- a/tests/stm32/src/bin/dac.rs +++ b/tests/stm32/src/bin/dac.rs | |||
| @@ -1,7 +1,7 @@ | |||
| 1 | #![no_std] | 1 | #![no_std] |
| 2 | #![no_main] | 2 | #![no_main] |
| 3 | 3 | ||
| 4 | // required-features: dac-adc-pin | 4 | // required-features: dac |
| 5 | 5 | ||
| 6 | #[path = "../common.rs"] | 6 | #[path = "../common.rs"] |
| 7 | mod common; | 7 | mod common; |
| @@ -22,12 +22,13 @@ async fn main(_spawner: Spawner) { | |||
| 22 | // Initialize the board and obtain a Peripherals instance | 22 | // Initialize the board and obtain a Peripherals instance |
| 23 | let p: embassy_stm32::Peripherals = embassy_stm32::init(config()); | 23 | let p: embassy_stm32::Peripherals = embassy_stm32::init(config()); |
| 24 | 24 | ||
| 25 | let adc = peri!(p, ADC); | ||
| 25 | let dac = peri!(p, DAC); | 26 | let dac = peri!(p, DAC); |
| 26 | let dac_pin = peri!(p, DAC_PIN); | 27 | let dac_pin = peri!(p, DAC_PIN); |
| 27 | let mut adc_pin = unsafe { core::ptr::read(&dac_pin) }; | 28 | let mut adc_pin = unsafe { core::ptr::read(&dac_pin) }; |
| 28 | 29 | ||
| 29 | let mut dac = DacCh1::new(dac, NoDma, dac_pin); | 30 | let mut dac = DacCh1::new(dac, NoDma, dac_pin); |
| 30 | let mut adc = Adc::new(p.ADC1, &mut Delay); | 31 | let mut adc = Adc::new(adc, &mut Delay); |
| 31 | 32 | ||
| 32 | #[cfg(feature = "stm32h755zi")] | 33 | #[cfg(feature = "stm32h755zi")] |
| 33 | let normalization_factor = 256; | 34 | let normalization_factor = 256; |
diff --git a/tests/stm32/src/bin/dac_l1.rs b/tests/stm32/src/bin/dac_l1.rs new file mode 100644 index 000000000..f8b00aaef --- /dev/null +++ b/tests/stm32/src/bin/dac_l1.rs | |||
| @@ -0,0 +1,86 @@ | |||
| 1 | #![no_std] | ||
| 2 | #![no_main] | ||
| 3 | |||
| 4 | // required-features: stm32l152re | ||
| 5 | |||
| 6 | #[path = "../common.rs"] | ||
| 7 | mod common; | ||
| 8 | use core::f32::consts::PI; | ||
| 9 | |||
| 10 | use common::*; | ||
| 11 | use defmt::assert; | ||
| 12 | use embassy_executor::Spawner; | ||
| 13 | use embassy_stm32::adc::Adc; | ||
| 14 | use embassy_stm32::dac::{DacCh1, Value}; | ||
| 15 | use embassy_stm32::dma::NoDma; | ||
| 16 | use embassy_stm32::{bind_interrupts, peripherals}; | ||
| 17 | use embassy_time::Timer; | ||
| 18 | use micromath::F32Ext; | ||
| 19 | use {defmt_rtt as _, panic_probe as _}; | ||
| 20 | |||
| 21 | bind_interrupts!(struct Irqs { | ||
| 22 | ADC1 => embassy_stm32::adc::InterruptHandler<peripherals::ADC>; | ||
| 23 | }); | ||
| 24 | |||
| 25 | #[embassy_executor::main] | ||
| 26 | async fn main(_spawner: Spawner) { | ||
| 27 | // Initialize the board and obtain a Peripherals instance | ||
| 28 | let p: embassy_stm32::Peripherals = embassy_stm32::init(config()); | ||
| 29 | |||
| 30 | let adc = peri!(p, ADC); | ||
| 31 | let dac = peri!(p, DAC); | ||
| 32 | let dac_pin = peri!(p, DAC_PIN); | ||
| 33 | let mut adc_pin = unsafe { core::ptr::read(&dac_pin) }; | ||
| 34 | |||
| 35 | let mut dac = DacCh1::new(dac, NoDma, dac_pin); | ||
| 36 | let mut adc = Adc::new(adc, Irqs); | ||
| 37 | |||
| 38 | #[cfg(feature = "stm32h755zi")] | ||
| 39 | let normalization_factor = 256; | ||
| 40 | #[cfg(any( | ||
| 41 | feature = "stm32f429zi", | ||
| 42 | feature = "stm32f446re", | ||
| 43 | feature = "stm32g071rb", | ||
| 44 | feature = "stm32l152re", | ||
| 45 | ))] | ||
| 46 | let normalization_factor: i32 = 16; | ||
| 47 | |||
| 48 | dac.set(Value::Bit8(0)); | ||
| 49 | // Now wait a little to obtain a stable value | ||
| 50 | Timer::after_millis(30).await; | ||
| 51 | let offset = adc.read(&mut adc_pin).await; | ||
| 52 | |||
| 53 | for v in 0..=255 { | ||
| 54 | // First set the DAC output value | ||
| 55 | let dac_output_val = to_sine_wave(v); | ||
| 56 | dac.set(Value::Bit8(dac_output_val)); | ||
| 57 | |||
| 58 | // Now wait a little to obtain a stable value | ||
| 59 | Timer::after_millis(30).await; | ||
| 60 | |||
| 61 | // Need to steal the peripherals here because PA4 is obviously in use already | ||
| 62 | let measured = adc.read(&mut unsafe { embassy_stm32::Peripherals::steal() }.PA4).await; | ||
| 63 | // Calibrate and normalize the measurement to get close to the dac_output_val | ||
| 64 | let measured_normalized = ((measured as i32 - offset as i32) / normalization_factor) as i16; | ||
| 65 | |||
| 66 | info!("value / measured: {} / {}", dac_output_val, measured_normalized); | ||
| 67 | |||
| 68 | // The deviations are quite enormous but that does not matter since this is only a quick test | ||
| 69 | assert!((dac_output_val as i16 - measured_normalized).abs() < 15); | ||
| 70 | } | ||
| 71 | |||
| 72 | info!("Test OK"); | ||
| 73 | cortex_m::asm::bkpt(); | ||
| 74 | } | ||
| 75 | |||
| 76 | fn to_sine_wave(v: u8) -> u8 { | ||
| 77 | if v >= 128 { | ||
| 78 | // top half | ||
| 79 | let r = PI * ((v - 128) as f32 / 128.0); | ||
| 80 | (r.sin() * 128.0 + 127.0) as u8 | ||
| 81 | } else { | ||
| 82 | // bottom half | ||
| 83 | let r = PI + PI * (v as f32 / 128.0); | ||
| 84 | (r.sin() * 128.0 + 127.0) as u8 | ||
| 85 | } | ||
| 86 | } | ||
diff --git a/tests/stm32/src/common.rs b/tests/stm32/src/common.rs index 155e1d9df..313380b35 100644 --- a/tests/stm32/src/common.rs +++ b/tests/stm32/src/common.rs | |||
| @@ -101,14 +101,14 @@ define_peris!( | |||
| 101 | define_peris!( | 101 | define_peris!( |
| 102 | UART = USART1, UART_TX = PC4, UART_RX = PC5, UART_TX_DMA = DMA1_CH1, UART_RX_DMA = DMA1_CH2, | 102 | UART = USART1, UART_TX = PC4, UART_RX = PC5, UART_TX_DMA = DMA1_CH1, UART_RX_DMA = DMA1_CH2, |
| 103 | SPI = SPI1, SPI_SCK = PA5, SPI_MOSI = PA7, SPI_MISO = PA6, SPI_TX_DMA = DMA1_CH1, SPI_RX_DMA = DMA1_CH2, | 103 | SPI = SPI1, SPI_SCK = PA5, SPI_MOSI = PA7, SPI_MISO = PA6, SPI_TX_DMA = DMA1_CH1, SPI_RX_DMA = DMA1_CH2, |
| 104 | DAC = DAC1, DAC_PIN = PA4, | 104 | ADC = ADC1, DAC = DAC1, DAC_PIN = PA4, |
| 105 | @irq UART = {USART1 => embassy_stm32::usart::InterruptHandler<embassy_stm32::peripherals::USART1>;}, | 105 | @irq UART = {USART1 => embassy_stm32::usart::InterruptHandler<embassy_stm32::peripherals::USART1>;}, |
| 106 | ); | 106 | ); |
| 107 | #[cfg(feature = "stm32f429zi")] | 107 | #[cfg(feature = "stm32f429zi")] |
| 108 | define_peris!( | 108 | define_peris!( |
| 109 | UART = USART6, UART_TX = PG14, UART_RX = PG9, UART_TX_DMA = DMA2_CH6, UART_RX_DMA = DMA2_CH1, | 109 | UART = USART6, UART_TX = PG14, UART_RX = PG9, UART_TX_DMA = DMA2_CH6, UART_RX_DMA = DMA2_CH1, |
| 110 | SPI = SPI1, SPI_SCK = PA5, SPI_MOSI = PA7, SPI_MISO = PA6, SPI_TX_DMA = DMA2_CH3, SPI_RX_DMA = DMA2_CH2, | 110 | SPI = SPI1, SPI_SCK = PA5, SPI_MOSI = PA7, SPI_MISO = PA6, SPI_TX_DMA = DMA2_CH3, SPI_RX_DMA = DMA2_CH2, |
| 111 | DAC = DAC, DAC_PIN = PA4, | 111 | ADC = ADC1, DAC = DAC, DAC_PIN = PA4, |
| 112 | CAN = CAN1, CAN_RX = PD0, CAN_TX = PD1, | 112 | CAN = CAN1, CAN_RX = PD0, CAN_TX = PD1, |
| 113 | @irq UART = {USART6 => embassy_stm32::usart::InterruptHandler<embassy_stm32::peripherals::USART6>;}, | 113 | @irq UART = {USART6 => embassy_stm32::usart::InterruptHandler<embassy_stm32::peripherals::USART6>;}, |
| 114 | ); | 114 | ); |
| @@ -116,7 +116,7 @@ define_peris!( | |||
| 116 | define_peris!( | 116 | define_peris!( |
| 117 | UART = USART1, UART_TX = PA9, UART_RX = PA10, UART_TX_DMA = DMA2_CH7, UART_RX_DMA = DMA2_CH5, | 117 | UART = USART1, UART_TX = PA9, UART_RX = PA10, UART_TX_DMA = DMA2_CH7, UART_RX_DMA = DMA2_CH5, |
| 118 | SPI = SPI1, SPI_SCK = PA5, SPI_MOSI = PA7, SPI_MISO = PA6, SPI_TX_DMA = DMA2_CH3, SPI_RX_DMA = DMA2_CH2, | 118 | SPI = SPI1, SPI_SCK = PA5, SPI_MOSI = PA7, SPI_MISO = PA6, SPI_TX_DMA = DMA2_CH3, SPI_RX_DMA = DMA2_CH2, |
| 119 | DAC = DAC, DAC_PIN = PA4, | 119 | ADC = ADC1, DAC = DAC, DAC_PIN = PA4, |
| 120 | CAN = CAN1, CAN_RX = PA11, CAN_TX = PA12, | 120 | CAN = CAN1, CAN_RX = PA11, CAN_TX = PA12, |
| 121 | @irq UART = {USART1 => embassy_stm32::usart::InterruptHandler<embassy_stm32::peripherals::USART1>;}, | 121 | @irq UART = {USART1 => embassy_stm32::usart::InterruptHandler<embassy_stm32::peripherals::USART1>;}, |
| 122 | ); | 122 | ); |
| @@ -130,7 +130,7 @@ define_peris!( | |||
| 130 | define_peris!( | 130 | define_peris!( |
| 131 | UART = USART1, UART_TX = PB6, UART_RX = PB7, UART_TX_DMA = DMA1_CH0, UART_RX_DMA = DMA1_CH1, | 131 | UART = USART1, UART_TX = PB6, UART_RX = PB7, UART_TX_DMA = DMA1_CH0, UART_RX_DMA = DMA1_CH1, |
| 132 | SPI = SPI1, SPI_SCK = PA5, SPI_MOSI = PB5, SPI_MISO = PA6, SPI_TX_DMA = DMA1_CH0, SPI_RX_DMA = DMA1_CH1, | 132 | SPI = SPI1, SPI_SCK = PA5, SPI_MOSI = PB5, SPI_MISO = PA6, SPI_TX_DMA = DMA1_CH0, SPI_RX_DMA = DMA1_CH1, |
| 133 | DAC = DAC1, DAC_PIN = PA4, | 133 | ADC = ADC1, DAC = DAC1, DAC_PIN = PA4, |
| 134 | @irq UART = {USART1 => embassy_stm32::usart::InterruptHandler<embassy_stm32::peripherals::USART1>;}, | 134 | @irq UART = {USART1 => embassy_stm32::usart::InterruptHandler<embassy_stm32::peripherals::USART1>;}, |
| 135 | ); | 135 | ); |
| 136 | #[cfg(feature = "stm32h7a3zi")] | 136 | #[cfg(feature = "stm32h7a3zi")] |
| @@ -191,6 +191,7 @@ define_peris!( | |||
| 191 | define_peris!( | 191 | define_peris!( |
| 192 | UART = USART3, UART_TX = PB10, UART_RX = PB11, UART_TX_DMA = DMA1_CH2, UART_RX_DMA = DMA1_CH3, | 192 | UART = USART3, UART_TX = PB10, UART_RX = PB11, UART_TX_DMA = DMA1_CH2, UART_RX_DMA = DMA1_CH3, |
| 193 | SPI = SPI1, SPI_SCK = PA5, SPI_MOSI = PA7, SPI_MISO = PA6, SPI_TX_DMA = DMA1_CH3, SPI_RX_DMA = DMA1_CH2, | 193 | SPI = SPI1, SPI_SCK = PA5, SPI_MOSI = PA7, SPI_MISO = PA6, SPI_TX_DMA = DMA1_CH3, SPI_RX_DMA = DMA1_CH2, |
| 194 | ADC = ADC, DAC = DAC, DAC_PIN = PA4, | ||
| 194 | @irq UART = {USART3 => embassy_stm32::usart::InterruptHandler<embassy_stm32::peripherals::USART3>;}, | 195 | @irq UART = {USART3 => embassy_stm32::usart::InterruptHandler<embassy_stm32::peripherals::USART3>;}, |
| 195 | ); | 196 | ); |
| 196 | #[cfg(feature = "stm32l552ze")] | 197 | #[cfg(feature = "stm32l552ze")] |
