From 1a79bb51bf1490de5cc6f6ad021edd161c088b9f Mon Sep 17 00:00:00 2001 From: Eicke Hecht Date: Sun, 23 Nov 2025 23:38:38 +0100 Subject: wip: adding basic ringbuffered structure --- embassy-stm32/src/timer/mod.rs | 1 + embassy-stm32/src/timer/ringbuffered.rs | 47 +++++++++++++++++++++++++++++++++ 2 files changed, 48 insertions(+) create mode 100644 embassy-stm32/src/timer/ringbuffered.rs 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; pub mod pwm_input; pub mod qei; pub mod simple_pwm; +pub mod ringbuffered; use crate::interrupt; 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 @@ +//! RingBuffered PWM driver. + +use core::mem::ManuallyDrop; + +use super::low_level::Timer; +use super::{Channel, GeneralInstance4Channel, TimerChannel, TimerPin}; +use crate::Peri; +use crate::dma::ringbuffer::WritableDmaRingBuffer; +use super::simple_pwm::SimplePwm; + +pub struct RingBufferedPwmChannel<'d, T: GeneralInstance4Channel> { + timer: ManuallyDrop>, + ring_buf: WritableDmaRingBuffer<'d, u8>, + channel: Channel, +} + +/// A group of four [`SimplePwmChannel`]s, obtained from [`SimplePwm::split`]. +pub struct RingBufferedPwmChannels<'d, T: GeneralInstance4Channel> { + /// Channel 1 + pub ch1: RingBufferedPwmChannel<'d, T>, + /// Channel 2 + pub ch2: RingBufferedPwmChannel<'d, T>, + /// Channel 3 + pub ch3: RingBufferedPwmChannel<'d, T>, + /// Channel 4 + pub ch4: RingBufferedPwmChannel<'d, T>, +} + +/// Simple PWM driver. +pub struct RingBufferedPwm<'d, T: GeneralInstance4Channel> { + inner: Timer<'d, T>, +} + +impl<'d, T: GeneralInstance4Channel> SimplePwm<'d, T> { + pub fn into_ring_buffered_channel(mut self, tx_dma: Peri<'_, impl super::Dma>, dma_buf: &'d mut [u8]) -> RingBufferedPwmChannel<'d> { + assert!(!dma_buf.is_empty() && dma_buf.len() <= 0xFFFF); + let ring_buf = WritableDmaRingBuffer::new(dma_buf); + let channel = C::CHANNEL; + RingBufferedPwmChannel { + timer: unsafe { self.inner.clone_unchecked() }, + channel, + ring_buf + } + + // let ring_buf = WriteableRingBuffer::new(); + } +} -- cgit