diff options
| author | JuliDi <[email protected]> | 2023-06-22 10:44:08 +0200 |
|---|---|---|
| committer | JuliDi <[email protected]> | 2023-06-22 10:44:08 +0200 |
| commit | 78736328a042e7c7f6565ed44ac301be22953f7a (patch) | |
| tree | b78892725ad64463edf682f15b977ca71fe77072 | |
| parent | 8d0095c61808b88ad95349c7f24e91797d93dc83 (diff) | |
update docs and update to new dma interface
| -rw-r--r-- | embassy-stm32/src/dac/mod.rs | 20 |
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 | ||
| 117 | impl<'d, T: Instance, Tx> Dac<'d, T, Tx> { | 117 | impl<'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 | }, |
