aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEicke Hecht <[email protected]>2025-11-23 23:38:38 +0100
committerEicke Hecht <[email protected]>2025-11-23 23:38:38 +0100
commit1a79bb51bf1490de5cc6f6ad021edd161c088b9f (patch)
tree72efd9d1daffa368c8abc4eadf11a0cad7e59263
parent36f4075b9054576ccf6dba2dedb08c62484a0599 (diff)
wip: adding basic ringbuffered structure
-rw-r--r--embassy-stm32/src/timer/mod.rs1
-rw-r--r--embassy-stm32/src/timer/ringbuffered.rs47
2 files changed, 48 insertions, 0 deletions
diff --git a/embassy-stm32/src/timer/mod.rs b/embassy-stm32/src/timer/mod.rs
index 804d1ef37..aef3598f1 100644
--- a/embassy-stm32/src/timer/mod.rs
+++ b/embassy-stm32/src/timer/mod.rs
@@ -13,6 +13,7 @@ pub mod one_pulse;
13pub mod pwm_input; 13pub mod pwm_input;
14pub mod qei; 14pub mod qei;
15pub mod simple_pwm; 15pub mod simple_pwm;
16pub mod ringbuffered;
16 17
17use crate::interrupt; 18use crate::interrupt;
18use crate::rcc::RccPeripheral; 19use crate::rcc::RccPeripheral;
diff --git a/embassy-stm32/src/timer/ringbuffered.rs b/embassy-stm32/src/timer/ringbuffered.rs
new file mode 100644
index 000000000..d20c5d532
--- /dev/null
+++ b/embassy-stm32/src/timer/ringbuffered.rs
@@ -0,0 +1,47 @@
1//! RingBuffered PWM driver.
2
3use core::mem::ManuallyDrop;
4
5use super::low_level::Timer;
6use super::{Channel, GeneralInstance4Channel, TimerChannel, TimerPin};
7use crate::Peri;
8use crate::dma::ringbuffer::WritableDmaRingBuffer;
9use super::simple_pwm::SimplePwm;
10
11pub struct RingBufferedPwmChannel<'d, T: GeneralInstance4Channel> {
12 timer: ManuallyDrop<Timer<'d, T>>,
13 ring_buf: WritableDmaRingBuffer<'d, u8>,
14 channel: Channel,
15}
16
17/// A group of four [`SimplePwmChannel`]s, obtained from [`SimplePwm::split`].
18pub struct RingBufferedPwmChannels<'d, T: GeneralInstance4Channel> {
19 /// Channel 1
20 pub ch1: RingBufferedPwmChannel<'d, T>,
21 /// Channel 2
22 pub ch2: RingBufferedPwmChannel<'d, T>,
23 /// Channel 3
24 pub ch3: RingBufferedPwmChannel<'d, T>,
25 /// Channel 4
26 pub ch4: RingBufferedPwmChannel<'d, T>,
27}
28
29/// Simple PWM driver.
30pub struct RingBufferedPwm<'d, T: GeneralInstance4Channel> {
31 inner: Timer<'d, T>,
32}
33
34impl<'d, T: GeneralInstance4Channel> SimplePwm<'d, T> {
35 pub fn into_ring_buffered_channel<C: TimerChannel>(mut self, tx_dma: Peri<'_, impl super::Dma<T, C>>, dma_buf: &'d mut [u8]) -> RingBufferedPwmChannel<'d> {
36 assert!(!dma_buf.is_empty() && dma_buf.len() <= 0xFFFF);
37 let ring_buf = WritableDmaRingBuffer::new(dma_buf);
38 let channel = C::CHANNEL;
39 RingBufferedPwmChannel {
40 timer: unsafe { self.inner.clone_unchecked() },
41 channel,
42 ring_buf
43 }
44
45 // let ring_buf = WriteableRingBuffer::new();
46 }
47}