diff options
| author | Eicke Hecht <[email protected]> | 2025-11-23 23:38:38 +0100 |
|---|---|---|
| committer | Eicke Hecht <[email protected]> | 2025-11-23 23:38:38 +0100 |
| commit | 1a79bb51bf1490de5cc6f6ad021edd161c088b9f (patch) | |
| tree | 72efd9d1daffa368c8abc4eadf11a0cad7e59263 /embassy-stm32/src/timer | |
| parent | 36f4075b9054576ccf6dba2dedb08c62484a0599 (diff) | |
wip: adding basic ringbuffered structure
Diffstat (limited to 'embassy-stm32/src/timer')
| -rw-r--r-- | embassy-stm32/src/timer/mod.rs | 1 | ||||
| -rw-r--r-- | embassy-stm32/src/timer/ringbuffered.rs | 47 |
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; | |||
| 13 | pub mod pwm_input; | 13 | pub mod pwm_input; |
| 14 | pub mod qei; | 14 | pub mod qei; |
| 15 | pub mod simple_pwm; | 15 | pub mod simple_pwm; |
| 16 | pub mod ringbuffered; | ||
| 16 | 17 | ||
| 17 | use crate::interrupt; | 18 | use crate::interrupt; |
| 18 | use crate::rcc::RccPeripheral; | 19 | use 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 | |||
| 3 | use core::mem::ManuallyDrop; | ||
| 4 | |||
| 5 | use super::low_level::Timer; | ||
| 6 | use super::{Channel, GeneralInstance4Channel, TimerChannel, TimerPin}; | ||
| 7 | use crate::Peri; | ||
| 8 | use crate::dma::ringbuffer::WritableDmaRingBuffer; | ||
| 9 | use super::simple_pwm::SimplePwm; | ||
| 10 | |||
| 11 | pub 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`]. | ||
| 18 | pub 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. | ||
| 30 | pub struct RingBufferedPwm<'d, T: GeneralInstance4Channel> { | ||
| 31 | inner: Timer<'d, T>, | ||
| 32 | } | ||
| 33 | |||
| 34 | impl<'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 | } | ||
