aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJuliDi <[email protected]>2023-07-22 19:25:02 +0200
committerJuliDi <[email protected]>2023-07-22 19:25:02 +0200
commit80ce6d1fb7eeb4617c2d10468e136a5013d71ac3 (patch)
treeaa526e2591bd259def19c565ebc06529903ee884
parent224fbc8125de73e08c0fe03df6d3980001f77c7f (diff)
update DAC triggers to incorporate v3
-rw-r--r--embassy-stm32/Cargo.toml4
-rw-r--r--embassy-stm32/src/dac/mod.rs49
-rw-r--r--embassy-stm32/src/dma/dma.rs19
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"
57embedded-sdmmc = { git = "https://github.com/embassy-rs/embedded-sdmmc-rs", rev = "a4f293d3a6f72158385f79c98634cb8a14d0d2fc", optional = true } 57embedded-sdmmc = { git = "https://github.com/embassy-rs/embedded-sdmmc-rs", rev = "a4f293d3a6f72158385f79c98634cb8a14d0d2fc", optional = true }
58critical-section = "1.1" 58critical-section = "1.1"
59atomic-polyfill = "1.0.1" 59atomic-polyfill = "1.0.1"
60stm32-metapac = "12" 60stm32-metapac = "13"
61vcell = "0.1.3" 61vcell = "0.1.3"
62bxcan = "0.7.0" 62bxcan = "0.7.0"
63nb = "1.0.0" 63nb = "1.0.0"
@@ -74,7 +74,7 @@ critical-section = { version = "1.1", features = ["std"] }
74[build-dependencies] 74[build-dependencies]
75proc-macro2 = "1.0.36" 75proc-macro2 = "1.0.36"
76quote = "1.0.15" 76quote = "1.0.15"
77stm32-metapac = { version = "12", default-features = false, features = ["metadata"]} 77stm32-metapac = { version = "13", default-features = false, features = ["metadata"]}
78 78
79[features] 79[features]
80default = ["rt"] 80default = ["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
40pub enum Ch1Trigger { 40pub 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 {
50impl Ch1Trigger { 69impl 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
33impl Default for TransferOptions { 39impl 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)]