diff options
| author | Jakob <[email protected]> | 2025-08-06 10:46:21 +0200 |
|---|---|---|
| committer | Jakob <[email protected]> | 2025-08-10 08:57:11 +0200 |
| commit | 7dad187ff740a0a1940d2d503fbc373218f4bd01 (patch) | |
| tree | 539c95ddd7daff56678988711cb453995c763a2e /embassy-stm32/src | |
| parent | 76e369b8aa5641b6f3f4440824f559def6cf6192 (diff) | |
Add methods for setting ossi, ossr, osi and oisn along with software trigger for break input
Diffstat (limited to 'embassy-stm32/src')
| -rw-r--r-- | embassy-stm32/src/timer/complementary_pwm.rs | 45 | ||||
| -rw-r--r-- | embassy-stm32/src/timer/low_level.rs | 25 |
2 files changed, 69 insertions, 1 deletions
diff --git a/embassy-stm32/src/timer/complementary_pwm.rs b/embassy-stm32/src/timer/complementary_pwm.rs index b00cc18ad..1178e7d83 100644 --- a/embassy-stm32/src/timer/complementary_pwm.rs +++ b/embassy-stm32/src/timer/complementary_pwm.rs | |||
| @@ -2,7 +2,7 @@ | |||
| 2 | 2 | ||
| 3 | use core::marker::PhantomData; | 3 | use core::marker::PhantomData; |
| 4 | 4 | ||
| 5 | use stm32_metapac::timer::vals::Ckd; | 5 | pub use stm32_metapac::timer::vals::{Ckd, Ossi, Ossr}; |
| 6 | 6 | ||
| 7 | use super::low_level::{CountingMode, OutputPolarity, Timer}; | 7 | use super::low_level::{CountingMode, OutputPolarity, Timer}; |
| 8 | use super::simple_pwm::PwmPin; | 8 | use super::simple_pwm::PwmPin; |
| @@ -82,6 +82,49 @@ impl<'d, T: AdvancedInstance4Channel> ComplementaryPwm<'d, T> { | |||
| 82 | this | 82 | this |
| 83 | } | 83 | } |
| 84 | 84 | ||
| 85 | /// Set output idle state for all channels | ||
| 86 | /// - `output_high_when_idle` - true if the output for the normal channels should | ||
| 87 | /// be high when idle, which means that the complementary channels are low. Opposite | ||
| 88 | /// for `false`. | ||
| 89 | pub fn set_output_idle_state(&self, output_high_when_idle: bool) { | ||
| 90 | [Channel::Ch1, Channel::Ch2, Channel::Ch3, Channel::Ch4] | ||
| 91 | .iter() | ||
| 92 | .for_each(|&channel| { | ||
| 93 | self.inner.set_ois(channel, output_high_when_idle); | ||
| 94 | self.inner.set_oisn(channel, !output_high_when_idle); | ||
| 95 | }); | ||
| 96 | } | ||
| 97 | |||
| 98 | /// Set state of OSSI-bit in BDTR register | ||
| 99 | pub fn set_off_state_selection_idle(&self, val: Ossi) { | ||
| 100 | self.inner.set_ossi(val); | ||
| 101 | } | ||
| 102 | |||
| 103 | /// Set state of OSSR-bit in BDTR register | ||
| 104 | pub fn set_off_state_selection_run(&self, val: Ossr) { | ||
| 105 | self.inner.set_ossr(val); | ||
| 106 | } | ||
| 107 | |||
| 108 | /// Trigger break input from software | ||
| 109 | pub fn trigger_software_break(&self, n: usize) { | ||
| 110 | self.inner.trigger_software_break(n); | ||
| 111 | } | ||
| 112 | |||
| 113 | /// Set Master Output Enable | ||
| 114 | pub fn set_master_output_enable(&mut self, enable: bool) { | ||
| 115 | self.inner.set_moe(enable); | ||
| 116 | } | ||
| 117 | |||
| 118 | /// Set Master Slave Mode 2 | ||
| 119 | pub fn set_mms2(&mut self, mms2: Mms2) { | ||
| 120 | self.inner.set_mms2_selection(mms2); | ||
| 121 | } | ||
| 122 | |||
| 123 | /// Set Repetition Counter | ||
| 124 | pub fn set_repetition_counter(&mut self, val: u16) { | ||
| 125 | self.inner.set_repetition_counter(val); | ||
| 126 | } | ||
| 127 | |||
| 85 | /// Enable the given channel. | 128 | /// Enable the given channel. |
| 86 | pub fn enable(&mut self, channel: Channel) { | 129 | pub fn enable(&mut self, channel: Channel) { |
| 87 | self.inner.enable_channel(channel, true); | 130 | self.inner.enable_channel(channel, true); |
diff --git a/embassy-stm32/src/timer/low_level.rs b/embassy-stm32/src/timer/low_level.rs index dc8ceb725..01bf60869 100644 --- a/embassy-stm32/src/timer/low_level.rs +++ b/embassy-stm32/src/timer/low_level.rs | |||
| @@ -686,6 +686,16 @@ impl<'d, T: AdvancedInstance1Channel> Timer<'d, T> { | |||
| 686 | self.regs_1ch_cmp().bdtr().modify(|w| w.set_dtg(value)); | 686 | self.regs_1ch_cmp().bdtr().modify(|w| w.set_dtg(value)); |
| 687 | } | 687 | } |
| 688 | 688 | ||
| 689 | /// Set state of OSSI-bit in BDTR register | ||
| 690 | pub fn set_ossi(&self, val: vals::Ossi) { | ||
| 691 | self.regs_1ch_cmp().bdtr().modify(|w| w.set_ossi(val)); | ||
| 692 | } | ||
| 693 | |||
| 694 | /// Set state of OSSR-bit in BDTR register | ||
| 695 | pub fn set_ossr(&self, val: vals::Ossr) { | ||
| 696 | self.regs_1ch_cmp().bdtr().modify(|w| w.set_ossr(val)); | ||
| 697 | } | ||
| 698 | |||
| 689 | /// Set state of MOE-bit in BDTR register to en-/disable output | 699 | /// Set state of MOE-bit in BDTR register to en-/disable output |
| 690 | pub fn set_moe(&self, enable: bool) { | 700 | pub fn set_moe(&self, enable: bool) { |
| 691 | self.regs_1ch_cmp().bdtr().modify(|w| w.set_moe(enable)); | 701 | self.regs_1ch_cmp().bdtr().modify(|w| w.set_moe(enable)); |
| @@ -725,4 +735,19 @@ impl<'d, T: AdvancedInstance4Channel> Timer<'d, T> { | |||
| 725 | .ccer() | 735 | .ccer() |
| 726 | .modify(|w| w.set_ccne(channel.index(), enable)); | 736 | .modify(|w| w.set_ccne(channel.index(), enable)); |
| 727 | } | 737 | } |
| 738 | |||
| 739 | /// Set Output Idle State | ||
| 740 | pub fn set_ois(&self, channel: Channel, val: bool) { | ||
| 741 | self.regs_advanced().cr2().modify(|w| w.set_ois(channel.index(), val)); | ||
| 742 | } | ||
| 743 | /// Set Output Idle State Complementary Channel | ||
| 744 | pub fn set_oisn(&self, channel: Channel, val: bool) { | ||
| 745 | self.regs_advanced().cr2().modify(|w| w.set_oisn(channel.index(), val)); | ||
| 746 | } | ||
| 747 | |||
| 748 | /// Trigger software break 1 or 2 | ||
| 749 | /// Setting this bit generates a break event. This bit is automatically cleared by the hardware. | ||
| 750 | pub fn trigger_software_break(&self, n: usize) { | ||
| 751 | self.regs_advanced().egr().write(|r| r.set_bg(n, true)); | ||
| 752 | } | ||
| 728 | } | 753 | } |
