aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJuliDi <[email protected]>2023-06-22 10:44:08 +0200
committerJuliDi <[email protected]>2023-06-22 10:44:08 +0200
commit78736328a042e7c7f6565ed44ac301be22953f7a (patch)
treeb78892725ad64463edf682f15b977ca71fe77072
parent8d0095c61808b88ad95349c7f24e91797d93dc83 (diff)
update docs and update to new dma interface
-rw-r--r--embassy-stm32/src/dac/mod.rs20
1 files changed, 16 insertions, 4 deletions
diff --git a/embassy-stm32/src/dac/mod.rs b/embassy-stm32/src/dac/mod.rs
index f02adeed9..42646d20d 100644
--- a/embassy-stm32/src/dac/mod.rs
+++ b/embassy-stm32/src/dac/mod.rs
@@ -115,6 +115,7 @@ pub struct Dac<'d, T: Instance, Tx> {
115} 115}
116 116
117impl<'d, T: Instance, Tx> Dac<'d, T, Tx> { 117impl<'d, T: Instance, Tx> Dac<'d, T, Tx> {
118 /// Create a new instance with one channel
118 pub fn new_1ch( 119 pub fn new_1ch(
119 peri: impl Peripheral<P = T> + 'd, 120 peri: impl Peripheral<P = T> + 'd,
120 txdma: impl Peripheral<P = Tx> + 'd, 121 txdma: impl Peripheral<P = Tx> + 'd,
@@ -124,6 +125,7 @@ impl<'d, T: Instance, Tx> Dac<'d, T, Tx> {
124 Self::new_inner(peri, 1, txdma) 125 Self::new_inner(peri, 1, txdma)
125 } 126 }
126 127
128 /// Create a new instance with two channels
127 pub fn new_2ch( 129 pub fn new_2ch(
128 peri: impl Peripheral<P = T> + 'd, 130 peri: impl Peripheral<P = T> + 'd,
129 txdma: impl Peripheral<P = Tx> + 'd, 131 txdma: impl Peripheral<P = Tx> + 'd,
@@ -134,6 +136,7 @@ impl<'d, T: Instance, Tx> Dac<'d, T, Tx> {
134 Self::new_inner(peri, 2, txdma) 136 Self::new_inner(peri, 2, txdma)
135 } 137 }
136 138
139 /// Perform initialisation steps for the DAC
137 fn new_inner(peri: PeripheralRef<'d, T>, channels: u8, txdma: impl Peripheral<P = Tx> + 'd) -> Self { 140 fn new_inner(peri: PeripheralRef<'d, T>, channels: u8, txdma: impl Peripheral<P = Tx> + 'd) -> Self {
138 into_ref!(txdma); 141 into_ref!(txdma);
139 T::enable(); 142 T::enable();
@@ -178,15 +181,17 @@ impl<'d, T: Instance, Tx> Dac<'d, T, Tx> {
178 Ok(()) 181 Ok(())
179 } 182 }
180 183
184 /// Enable the DAC channel `ch`
181 pub fn enable_channel(&mut self, ch: Channel) -> Result<(), Error> { 185 pub fn enable_channel(&mut self, ch: Channel) -> Result<(), Error> {
182 self.set_channel_enable(ch, true) 186 self.set_channel_enable(ch, true)
183 } 187 }
184 188
189 /// Disable the DAC channel `ch`
185 pub fn disable_channel(&mut self, ch: Channel) -> Result<(), Error> { 190 pub fn disable_channel(&mut self, ch: Channel) -> Result<(), Error> {
186 self.set_channel_enable(ch, false) 191 self.set_channel_enable(ch, false)
187 } 192 }
188 193
189 /// Performs all register accesses necessary to select a new trigger for CH1 194 /// Select a new trigger for CH1 (disables the channel)
190 pub fn select_trigger_ch1(&mut self, trigger: Ch1Trigger) -> Result<(), Error> { 195 pub fn select_trigger_ch1(&mut self, trigger: Ch1Trigger) -> Result<(), Error> {
191 self.check_channel_exists(Channel::Ch1)?; 196 self.check_channel_exists(Channel::Ch1)?;
192 unwrap!(self.disable_channel(Channel::Ch1)); 197 unwrap!(self.disable_channel(Channel::Ch1));
@@ -196,7 +201,7 @@ impl<'d, T: Instance, Tx> Dac<'d, T, Tx> {
196 Ok(()) 201 Ok(())
197 } 202 }
198 203
199 /// Performs all register accesses necessary to select a new trigger for CH2 204 /// Select a new trigger for CH2 (disables the channel)
200 pub fn select_trigger_ch2(&mut self, trigger: Ch2Trigger) -> Result<(), Error> { 205 pub fn select_trigger_ch2(&mut self, trigger: Ch2Trigger) -> Result<(), Error> {
201 self.check_channel_exists(Channel::Ch2)?; 206 self.check_channel_exists(Channel::Ch2)?;
202 unwrap!(self.disable_channel(Channel::Ch2)); 207 unwrap!(self.disable_channel(Channel::Ch2));
@@ -206,7 +211,7 @@ impl<'d, T: Instance, Tx> Dac<'d, T, Tx> {
206 Ok(()) 211 Ok(())
207 } 212 }
208 213
209 /// Perform a software trigger on a given channel 214 /// Perform a software trigger on `ch`
210 pub fn trigger(&mut self, ch: Channel) -> Result<(), Error> { 215 pub fn trigger(&mut self, ch: Channel) -> Result<(), Error> {
211 self.check_channel_exists(ch)?; 216 self.check_channel_exists(ch)?;
212 T::regs().swtrigr().write(|reg| { 217 T::regs().swtrigr().write(|reg| {
@@ -223,6 +228,9 @@ impl<'d, T: Instance, Tx> Dac<'d, T, Tx> {
223 }); 228 });
224 } 229 }
225 230
231 /// Set a value to be output by the DAC on trigger.
232 ///
233 /// The `value` is written to the corresponding "data holding register"
226 pub fn set(&mut self, ch: Channel, value: Value) -> Result<(), Error> { 234 pub fn set(&mut self, ch: Channel, value: Value) -> Result<(), Error> {
227 self.check_channel_exists(ch)?; 235 self.check_channel_exists(ch)?;
228 match value { 236 match value {
@@ -237,6 +245,7 @@ impl<'d, T: Instance, Tx> Dac<'d, T, Tx> {
237 /// 245 ///
238 /// To prevent delays/glitches when outputting a periodic waveform, the `circular` flag can be set. 246 /// To prevent delays/glitches when outputting a periodic waveform, the `circular` flag can be set.
239 /// This will configure a circular DMA transfer that periodically outputs the `data`. 247 /// This will configure a circular DMA transfer that periodically outputs the `data`.
248 /// Note that for performance reasons in circular mode the transfer complete interrupt is disabled.
240 /// 249 ///
241 /// ## Current limitations 250 /// ## Current limitations
242 /// - Only CH1 Supported 251 /// - Only CH1 Supported
@@ -255,7 +264,7 @@ impl<'d, T: Instance, Tx> Dac<'d, T, Tx> {
255 }); 264 });
256 265
257 let tx_request = self.txdma.request(); 266 let tx_request = self.txdma.request();
258 let channel = &mut self.txdma; 267 let channel = &self.txdma;
259 268
260 // Initiate the correct type of DMA transfer depending on what data is passed 269 // Initiate the correct type of DMA transfer depending on what data is passed
261 let tx_f = match data_ch1 { 270 let tx_f = match data_ch1 {
@@ -268,6 +277,7 @@ impl<'d, T: Instance, Tx> Dac<'d, T, Tx> {
268 TransferOptions { 277 TransferOptions {
269 circular, 278 circular,
270 half_transfer_ir: false, 279 half_transfer_ir: false,
280 complete_transfer_ir: !circular,
271 }, 281 },
272 ) 282 )
273 }, 283 },
@@ -280,6 +290,7 @@ impl<'d, T: Instance, Tx> Dac<'d, T, Tx> {
280 TransferOptions { 290 TransferOptions {
281 circular, 291 circular,
282 half_transfer_ir: false, 292 half_transfer_ir: false,
293 complete_transfer_ir: !circular,
283 }, 294 },
284 ) 295 )
285 }, 296 },
@@ -292,6 +303,7 @@ impl<'d, T: Instance, Tx> Dac<'d, T, Tx> {
292 TransferOptions { 303 TransferOptions {
293 circular, 304 circular,
294 half_transfer_ir: false, 305 half_transfer_ir: false,
306 complete_transfer_ir: !circular,
295 }, 307 },
296 ) 308 )
297 }, 309 },