aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJakob <[email protected]>2025-08-06 10:46:21 +0200
committerJakob <[email protected]>2025-08-10 08:57:11 +0200
commit7dad187ff740a0a1940d2d503fbc373218f4bd01 (patch)
tree539c95ddd7daff56678988711cb453995c763a2e
parent76e369b8aa5641b6f3f4440824f559def6cf6192 (diff)
Add methods for setting ossi, ossr, osi and oisn along with software trigger for break input
-rw-r--r--embassy-stm32/src/timer/complementary_pwm.rs45
-rw-r--r--embassy-stm32/src/timer/low_level.rs25
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
3use core::marker::PhantomData; 3use core::marker::PhantomData;
4 4
5use stm32_metapac::timer::vals::Ckd; 5pub use stm32_metapac::timer::vals::{Ckd, Ossi, Ossr};
6 6
7use super::low_level::{CountingMode, OutputPolarity, Timer}; 7use super::low_level::{CountingMode, OutputPolarity, Timer};
8use super::simple_pwm::PwmPin; 8use 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}