diff options
Diffstat (limited to 'embassy-stm32/src/timer/ringbuffered.rs')
| -rw-r--r-- | embassy-stm32/src/timer/ringbuffered.rs | 29 |
1 files changed, 9 insertions, 20 deletions
diff --git a/embassy-stm32/src/timer/ringbuffered.rs b/embassy-stm32/src/timer/ringbuffered.rs index e8f97bf59..fbb6b19ea 100644 --- a/embassy-stm32/src/timer/ringbuffered.rs +++ b/embassy-stm32/src/timer/ringbuffered.rs | |||
| @@ -7,6 +7,7 @@ use super::low_level::Timer; | |||
| 7 | use super::{Channel, GeneralInstance4Channel}; | 7 | use super::{Channel, GeneralInstance4Channel}; |
| 8 | use crate::dma::WritableRingBuffer; | 8 | use crate::dma::WritableRingBuffer; |
| 9 | use crate::dma::ringbuffer::Error; | 9 | use crate::dma::ringbuffer::Error; |
| 10 | use crate::dma::word::Word; | ||
| 10 | 11 | ||
| 11 | /// A PWM channel that uses a DMA ring buffer for continuous waveform generation. | 12 | /// A PWM channel that uses a DMA ring buffer for continuous waveform generation. |
| 12 | /// | 13 | /// |
| @@ -23,17 +24,17 @@ use crate::dma::ringbuffer::Error; | |||
| 23 | /// channel.start(); // Start DMA transfer | 24 | /// channel.start(); // Start DMA transfer |
| 24 | /// channel.write(&[100, 200, 300]).ok(); // Update duty cycles | 25 | /// channel.write(&[100, 200, 300]).ok(); // Update duty cycles |
| 25 | /// ``` | 26 | /// ``` |
| 26 | pub struct RingBufferedPwmChannel<'d, T: GeneralInstance4Channel> { | 27 | pub struct RingBufferedPwmChannel<'d, T: GeneralInstance4Channel, W: Word + Into<T::Word>> { |
| 27 | timer: ManuallyDrop<Timer<'d, T>>, | 28 | timer: ManuallyDrop<Timer<'d, T>>, |
| 28 | ring_buf: WritableRingBuffer<'d, u16>, | 29 | ring_buf: WritableRingBuffer<'d, W>, |
| 29 | channel: Channel, | 30 | channel: Channel, |
| 30 | } | 31 | } |
| 31 | 32 | ||
| 32 | impl<'d, T: GeneralInstance4Channel> RingBufferedPwmChannel<'d, T> { | 33 | impl<'d, T: GeneralInstance4Channel, W: Word + Into<T::Word>> RingBufferedPwmChannel<'d, T, W> { |
| 33 | pub(crate) fn new( | 34 | pub(crate) fn new( |
| 34 | timer: ManuallyDrop<Timer<'d, T>>, | 35 | timer: ManuallyDrop<Timer<'d, T>>, |
| 35 | channel: Channel, | 36 | channel: Channel, |
| 36 | ring_buf: WritableRingBuffer<'d, u16>, | 37 | ring_buf: WritableRingBuffer<'d, W>, |
| 37 | ) -> Self { | 38 | ) -> Self { |
| 38 | Self { | 39 | Self { |
| 39 | timer, | 40 | timer, |
| @@ -55,18 +56,18 @@ impl<'d, T: GeneralInstance4Channel> RingBufferedPwmChannel<'d, T> { | |||
| 55 | } | 56 | } |
| 56 | 57 | ||
| 57 | /// Write elements directly to the raw buffer. This can be used to fill the buffer before starting the DMA transfer. | 58 | /// Write elements directly to the raw buffer. This can be used to fill the buffer before starting the DMA transfer. |
| 58 | pub fn write_immediate(&mut self, buf: &[u16]) -> Result<(usize, usize), Error> { | 59 | pub fn write_immediate(&mut self, buf: &[W]) -> Result<(usize, usize), Error> { |
| 59 | self.ring_buf.write_immediate(buf) | 60 | self.ring_buf.write_immediate(buf) |
| 60 | } | 61 | } |
| 61 | 62 | ||
| 62 | /// Write elements from the ring buffer | 63 | /// Write elements from the ring buffer |
| 63 | /// Return a tuple of the length written and the length remaining in the buffer | 64 | /// Return a tuple of the length written and the length remaining in the buffer |
| 64 | pub fn write(&mut self, buf: &[u16]) -> Result<(usize, usize), Error> { | 65 | pub fn write(&mut self, buf: &[W]) -> Result<(usize, usize), Error> { |
| 65 | self.ring_buf.write(buf) | 66 | self.ring_buf.write(buf) |
| 66 | } | 67 | } |
| 67 | 68 | ||
| 68 | /// Write an exact number of elements to the ringbuffer. | 69 | /// Write an exact number of elements to the ringbuffer. |
| 69 | pub async fn write_exact(&mut self, buffer: &[u16]) -> Result<usize, Error> { | 70 | pub async fn write_exact(&mut self, buffer: &[W]) -> Result<usize, Error> { |
| 70 | self.ring_buf.write_exact(buffer).await | 71 | self.ring_buf.write_exact(buffer).await |
| 71 | } | 72 | } |
| 72 | 73 | ||
| @@ -140,7 +141,7 @@ impl<'d, T: GeneralInstance4Channel> RingBufferedPwmChannel<'d, T> { | |||
| 140 | /// | 141 | /// |
| 141 | /// This value depends on the configured frequency and the timer's clock rate from RCC. | 142 | /// This value depends on the configured frequency and the timer's clock rate from RCC. |
| 142 | pub fn max_duty_cycle(&self) -> u16 { | 143 | pub fn max_duty_cycle(&self) -> u16 { |
| 143 | let max = self.timer.get_max_compare_value(); | 144 | let max: u32 = self.timer.get_max_compare_value().into(); |
| 144 | assert!(max < u16::MAX as u32); | 145 | assert!(max < u16::MAX as u32); |
| 145 | max as u16 + 1 | 146 | max as u16 + 1 |
| 146 | } | 147 | } |
| @@ -155,15 +156,3 @@ impl<'d, T: GeneralInstance4Channel> RingBufferedPwmChannel<'d, T> { | |||
| 155 | self.timer.set_output_compare_mode(self.channel, mode); | 156 | self.timer.set_output_compare_mode(self.channel, mode); |
| 156 | } | 157 | } |
| 157 | } | 158 | } |
| 158 | |||
| 159 | /// A group of four [`SimplePwmChannel`]s, obtained from [`SimplePwm::split`]. | ||
| 160 | pub struct RingBufferedPwmChannels<'d, T: GeneralInstance4Channel> { | ||
| 161 | /// Channel 1 | ||
| 162 | pub ch1: RingBufferedPwmChannel<'d, T>, | ||
| 163 | /// Channel 2 | ||
| 164 | pub ch2: RingBufferedPwmChannel<'d, T>, | ||
| 165 | /// Channel 3 | ||
| 166 | pub ch3: RingBufferedPwmChannel<'d, T>, | ||
| 167 | /// Channel 4 | ||
| 168 | pub ch4: RingBufferedPwmChannel<'d, T>, | ||
| 169 | } | ||
