diff options
| -rw-r--r-- | embassy-stm32/Cargo.toml | 4 | ||||
| -rw-r--r-- | embassy-stm32/src/dac/mod.rs | 49 | ||||
| -rw-r--r-- | embassy-stm32/src/dma/dma.rs | 19 |
3 files changed, 62 insertions, 10 deletions
diff --git a/embassy-stm32/Cargo.toml b/embassy-stm32/Cargo.toml index ec934e8be..0fb6fdb56 100644 --- a/embassy-stm32/Cargo.toml +++ b/embassy-stm32/Cargo.toml | |||
| @@ -57,7 +57,7 @@ sdio-host = "0.5.0" | |||
| 57 | embedded-sdmmc = { git = "https://github.com/embassy-rs/embedded-sdmmc-rs", rev = "a4f293d3a6f72158385f79c98634cb8a14d0d2fc", optional = true } | 57 | embedded-sdmmc = { git = "https://github.com/embassy-rs/embedded-sdmmc-rs", rev = "a4f293d3a6f72158385f79c98634cb8a14d0d2fc", optional = true } |
| 58 | critical-section = "1.1" | 58 | critical-section = "1.1" |
| 59 | atomic-polyfill = "1.0.1" | 59 | atomic-polyfill = "1.0.1" |
| 60 | stm32-metapac = "12" | 60 | stm32-metapac = "13" |
| 61 | vcell = "0.1.3" | 61 | vcell = "0.1.3" |
| 62 | bxcan = "0.7.0" | 62 | bxcan = "0.7.0" |
| 63 | nb = "1.0.0" | 63 | nb = "1.0.0" |
| @@ -74,7 +74,7 @@ critical-section = { version = "1.1", features = ["std"] } | |||
| 74 | [build-dependencies] | 74 | [build-dependencies] |
| 75 | proc-macro2 = "1.0.36" | 75 | proc-macro2 = "1.0.36" |
| 76 | quote = "1.0.15" | 76 | quote = "1.0.15" |
| 77 | stm32-metapac = { version = "12", default-features = false, features = ["metadata"]} | 77 | stm32-metapac = { version = "13", default-features = false, features = ["metadata"]} |
| 78 | 78 | ||
| 79 | [features] | 79 | [features] |
| 80 | default = ["rt"] | 80 | default = ["rt"] |
diff --git a/embassy-stm32/src/dac/mod.rs b/embassy-stm32/src/dac/mod.rs index 3dee242ef..6712585cf 100644 --- a/embassy-stm32/src/dac/mod.rs +++ b/embassy-stm32/src/dac/mod.rs | |||
| @@ -38,11 +38,30 @@ impl Channel { | |||
| 38 | #[cfg_attr(feature = "defmt", derive(defmt::Format))] | 38 | #[cfg_attr(feature = "defmt", derive(defmt::Format))] |
| 39 | /// Trigger sources for CH1 | 39 | /// Trigger sources for CH1 |
| 40 | pub enum Ch1Trigger { | 40 | pub enum Ch1Trigger { |
| 41 | Tim6, | 41 | #[cfg(dac_v3)] |
| 42 | Tim1, | ||
| 43 | Tim2, | ||
| 44 | #[cfg(not(dac_v2))] | ||
| 42 | Tim3, | 45 | Tim3, |
| 46 | #[cfg(dac_v3)] | ||
| 47 | Tim4, | ||
| 48 | #[cfg(dac_v3)] | ||
| 49 | Tim5, | ||
| 50 | Tim6, | ||
| 43 | Tim7, | 51 | Tim7, |
| 52 | #[cfg(dac_v3)] | ||
| 53 | Tim8, | ||
| 44 | Tim15, | 54 | Tim15, |
| 45 | Tim2, | 55 | #[cfg(dac_v3)] |
| 56 | Hrtim1Dactrg1, | ||
| 57 | #[cfg(dac_v3)] | ||
| 58 | Hrtim1Dactrg2, | ||
| 59 | #[cfg(dac_v3)] | ||
| 60 | Lptim1, | ||
| 61 | #[cfg(dac_v3)] | ||
| 62 | Lptim2, | ||
| 63 | #[cfg(dac_v3)] | ||
| 64 | Lptim3, | ||
| 46 | Exti9, | 65 | Exti9, |
| 47 | Software, | 66 | Software, |
| 48 | } | 67 | } |
| @@ -50,11 +69,30 @@ pub enum Ch1Trigger { | |||
| 50 | impl Ch1Trigger { | 69 | impl Ch1Trigger { |
| 51 | fn tsel(&self) -> dac::vals::Tsel1 { | 70 | fn tsel(&self) -> dac::vals::Tsel1 { |
| 52 | match self { | 71 | match self { |
| 53 | Ch1Trigger::Tim6 => dac::vals::Tsel1::TIM6_TRGO, | 72 | #[cfg(dac_v3)] |
| 73 | Ch1Trigger::Tim1 => dac::vals::Tsel1::TIM1_TRGO, | ||
| 74 | Ch1Trigger::Tim2 => dac::vals::Tsel1::TIM2_TRGO, | ||
| 75 | #[cfg(dac_v2)] | ||
| 54 | Ch1Trigger::Tim3 => dac::vals::Tsel1::TIM3_TRGO, | 76 | Ch1Trigger::Tim3 => dac::vals::Tsel1::TIM3_TRGO, |
| 77 | #[cfg(dac_v3)] | ||
| 78 | Ch1Trigger::Tim4 => dac::vals::Tsel1::TIM4_TRGO, | ||
| 79 | #[cfg(dac_v3)] | ||
| 80 | Ch1Trigger::Tim5 => dac::vals::Tsel1::TIM5_TRGO, | ||
| 81 | Ch1Trigger::Tim6 => dac::vals::Tsel1::TIM6_TRGO, | ||
| 55 | Ch1Trigger::Tim7 => dac::vals::Tsel1::TIM7_TRGO, | 82 | Ch1Trigger::Tim7 => dac::vals::Tsel1::TIM7_TRGO, |
| 83 | #[cfg(dac_v3)] | ||
| 84 | Ch1Trigger::Tim8 => dac::vals::Tsel1::TIM8_TRGO, | ||
| 56 | Ch1Trigger::Tim15 => dac::vals::Tsel1::TIM15_TRGO, | 85 | Ch1Trigger::Tim15 => dac::vals::Tsel1::TIM15_TRGO, |
| 57 | Ch1Trigger::Tim2 => dac::vals::Tsel1::TIM2_TRGO, | 86 | #[cfg(dac_v3)] |
| 87 | Ch1Trigger::Hrtim1Dactrg1 => dac::vals::Tsel1::HRTIM1_DACTRG1, | ||
| 88 | #[cfg(dac_v3)] | ||
| 89 | Ch1Trigger::Hrtim1Dactrg2 => dac::vals::Tsel1::HRTIM1_DACTRG2, | ||
| 90 | #[cfg(dac_v3)] | ||
| 91 | Ch1Trigger::Lptim1 => dac::vals::Tsel1::LPTIM1_OUT, | ||
| 92 | #[cfg(dac_v3)] | ||
| 93 | Ch1Trigger::Lptim2 => dac::vals::Tsel1::LPTIM2_OUT, | ||
| 94 | #[cfg(dac_v3)] | ||
| 95 | Ch1Trigger::Lptim3 => dac::vals::Tsel1::LPTIM3_OUT, | ||
| 58 | Ch1Trigger::Exti9 => dac::vals::Tsel1::EXTI9, | 96 | Ch1Trigger::Exti9 => dac::vals::Tsel1::EXTI9, |
| 59 | Ch1Trigger::Software => dac::vals::Tsel1::SOFTWARE, | 97 | Ch1Trigger::Software => dac::vals::Tsel1::SOFTWARE, |
| 60 | } | 98 | } |
| @@ -363,7 +401,6 @@ impl<'d, T: Instance, Tx> DacCh2<'d, T, Tx> { | |||
| 363 | /// Note that for performance reasons in circular mode the transfer complete interrupt is disabled. | 401 | /// Note that for performance reasons in circular mode the transfer complete interrupt is disabled. |
| 364 | /// | 402 | /// |
| 365 | /// **Important:** Channel 2 has to be configured for the DAC instance! | 403 | /// **Important:** Channel 2 has to be configured for the DAC instance! |
| 366 | #[cfg(all(bdma, not(dma)))] // It currently only works with BDMA-only chips (DMA should theoretically work though) | ||
| 367 | pub async fn write(&mut self, data: ValueArray<'_>, circular: bool) -> Result<(), Error> | 404 | pub async fn write(&mut self, data: ValueArray<'_>, circular: bool) -> Result<(), Error> |
| 368 | where | 405 | where |
| 369 | Tx: DmaCh2<T>, | 406 | Tx: DmaCh2<T>, |
| @@ -467,7 +504,7 @@ impl<'d, T: Instance, TxCh1, TxCh2> Dac<'d, T, TxCh1, TxCh2> { | |||
| 467 | dac_ch1.enable_channel().unwrap(); | 504 | dac_ch1.enable_channel().unwrap(); |
| 468 | dac_ch1.set_trigger_enable(true).unwrap(); | 505 | dac_ch1.set_trigger_enable(true).unwrap(); |
| 469 | 506 | ||
| 470 | #[cfg(dac_v2)] | 507 | #[cfg(any(dac_v2, dac_v3))] |
| 471 | dac_ch2.set_channel_mode(0).unwrap(); | 508 | dac_ch2.set_channel_mode(0).unwrap(); |
| 472 | dac_ch2.enable_channel().unwrap(); | 509 | dac_ch2.enable_channel().unwrap(); |
| 473 | dac_ch2.set_trigger_enable(true).unwrap(); | 510 | dac_ch2.set_trigger_enable(true).unwrap(); |
diff --git a/embassy-stm32/src/dma/dma.rs b/embassy-stm32/src/dma/dma.rs index 58d438af8..f14084599 100644 --- a/embassy-stm32/src/dma/dma.rs +++ b/embassy-stm32/src/dma/dma.rs | |||
| @@ -28,6 +28,12 @@ pub struct TransferOptions { | |||
| 28 | pub flow_ctrl: FlowControl, | 28 | pub flow_ctrl: FlowControl, |
| 29 | /// FIFO threshold for DMA FIFO mode. If none, direct mode is used. | 29 | /// FIFO threshold for DMA FIFO mode. If none, direct mode is used. |
| 30 | pub fifo_threshold: Option<FifoThreshold>, | 30 | pub fifo_threshold: Option<FifoThreshold>, |
| 31 | /// Enable circular DMA | ||
| 32 | pub circular: bool, | ||
| 33 | /// Enable half transfer interrupt | ||
| 34 | pub half_transfer_ir: bool, | ||
| 35 | /// Enable transfer complete interrupt | ||
| 36 | pub complete_transfer_ir: bool, | ||
| 31 | } | 37 | } |
| 32 | 38 | ||
| 33 | impl Default for TransferOptions { | 39 | impl Default for TransferOptions { |
| @@ -37,6 +43,9 @@ impl Default for TransferOptions { | |||
| 37 | mburst: Burst::Single, | 43 | mburst: Burst::Single, |
| 38 | flow_ctrl: FlowControl::Dma, | 44 | flow_ctrl: FlowControl::Dma, |
| 39 | fifo_threshold: None, | 45 | fifo_threshold: None, |
| 46 | circular: false, | ||
| 47 | half_transfer_ir: false, | ||
| 48 | complete_transfer_ir: true, | ||
| 40 | } | 49 | } |
| 41 | } | 50 | } |
| 42 | } | 51 | } |
| @@ -365,7 +374,13 @@ impl<'a, C: Channel> Transfer<'a, C> { | |||
| 365 | }); | 374 | }); |
| 366 | w.set_pinc(vals::Inc::FIXED); | 375 | w.set_pinc(vals::Inc::FIXED); |
| 367 | w.set_teie(true); | 376 | w.set_teie(true); |
| 368 | w.set_tcie(true); | 377 | w.set_tcie(options.complete_transfer_ir); |
| 378 | if options.circular { | ||
| 379 | w.set_circ(vals::Circ::ENABLED); | ||
| 380 | debug!("Setting circular mode"); | ||
| 381 | } else { | ||
| 382 | w.set_circ(vals::Circ::DISABLED); | ||
| 383 | } | ||
| 369 | #[cfg(dma_v1)] | 384 | #[cfg(dma_v1)] |
| 370 | w.set_trbuff(true); | 385 | w.set_trbuff(true); |
| 371 | 386 | ||
| @@ -646,7 +661,7 @@ impl<'a, C: Channel, W: Word> RingBuffer<'a, C, W> { | |||
| 646 | w.set_minc(vals::Inc::INCREMENTED); | 661 | w.set_minc(vals::Inc::INCREMENTED); |
| 647 | w.set_pinc(vals::Inc::FIXED); | 662 | w.set_pinc(vals::Inc::FIXED); |
| 648 | w.set_teie(true); | 663 | w.set_teie(true); |
| 649 | w.set_htie(true); | 664 | w.set_htie(options.half_transfer_ir); |
| 650 | w.set_tcie(true); | 665 | w.set_tcie(true); |
| 651 | w.set_circ(vals::Circ::ENABLED); | 666 | w.set_circ(vals::Circ::ENABLED); |
| 652 | #[cfg(dma_v1)] | 667 | #[cfg(dma_v1)] |
