aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--embassy-stm32/src/timer/mod.rs28
-rw-r--r--embassy-stm32/src/timer/simple_pwm.rs38
2 files changed, 66 insertions, 0 deletions
diff --git a/embassy-stm32/src/timer/mod.rs b/embassy-stm32/src/timer/mod.rs
index d88fbcfdb..1e0999ed3 100644
--- a/embassy-stm32/src/timer/mod.rs
+++ b/embassy-stm32/src/timer/mod.rs
@@ -70,6 +70,16 @@ pub(crate) mod sealed {
70 fn set_autoreload_preload(&mut self, enable: vals::Arpe) { 70 fn set_autoreload_preload(&mut self, enable: vals::Arpe) {
71 Self::regs().cr1().modify(|r| r.set_arpe(enable)); 71 Self::regs().cr1().modify(|r| r.set_arpe(enable));
72 } 72 }
73
74 fn get_frequency(&self) -> Hertz {
75 let timer_f = Self::frequency();
76
77 let regs = Self::regs();
78 let arr = regs.arr().read().arr();
79 let psc = regs.psc().read().psc();
80
81 timer_f / arr / (psc + 1)
82 }
73 } 83 }
74 84
75 pub trait GeneralPurpose16bitInstance: Basic16bitInstance { 85 pub trait GeneralPurpose16bitInstance: Basic16bitInstance {
@@ -103,6 +113,16 @@ pub(crate) mod sealed {
103 regs.egr().write(|r| r.set_ug(true)); 113 regs.egr().write(|r| r.set_ug(true));
104 regs.cr1().modify(|r| r.set_urs(vals::Urs::ANYEVENT)); 114 regs.cr1().modify(|r| r.set_urs(vals::Urs::ANYEVENT));
105 } 115 }
116
117 fn get_frequency(&self) -> Hertz {
118 let timer_f = Self::frequency();
119
120 let regs = Self::regs_gp32();
121 let arr = regs.arr().read().arr();
122 let psc = regs.psc().read().psc();
123
124 timer_f / arr / (psc + 1)
125 }
106 } 126 }
107 127
108 pub trait AdvancedControlInstance: GeneralPurpose16bitInstance { 128 pub trait AdvancedControlInstance: GeneralPurpose16bitInstance {
@@ -183,6 +203,10 @@ pub(crate) mod sealed {
183 fn get_max_compare_value(&self) -> u16 { 203 fn get_max_compare_value(&self) -> u16 {
184 Self::regs_gp16().arr().read().arr() 204 Self::regs_gp16().arr().read().arr()
185 } 205 }
206
207 fn get_compare_value(&self, channel: Channel) -> u16 {
208 Self::regs_gp16().ccr(channel.raw()).read().ccr()
209 }
186 } 210 }
187 211
188 pub trait ComplementaryCaptureCompare16bitInstance: CaptureCompare16bitInstance + AdvancedControlInstance { 212 pub trait ComplementaryCaptureCompare16bitInstance: CaptureCompare16bitInstance + AdvancedControlInstance {
@@ -219,6 +243,10 @@ pub(crate) mod sealed {
219 fn get_max_compare_value(&self) -> u32 { 243 fn get_max_compare_value(&self) -> u32 {
220 Self::regs_gp32().arr().read().arr() 244 Self::regs_gp32().arr().read().arr()
221 } 245 }
246
247 fn get_compare_value(&self, channel: Channel) -> u32 {
248 Self::regs_gp32().ccr(channel.raw()).read().ccr()
249 }
222 } 250 }
223} 251}
224 252
diff --git a/embassy-stm32/src/timer/simple_pwm.rs b/embassy-stm32/src/timer/simple_pwm.rs
index 9e28878b1..2b3a069a7 100644
--- a/embassy-stm32/src/timer/simple_pwm.rs
+++ b/embassy-stm32/src/timer/simple_pwm.rs
@@ -109,3 +109,41 @@ impl<'d, T: CaptureCompare16bitInstance> SimplePwm<'d, T> {
109 self.inner.set_output_polarity(channel, polarity); 109 self.inner.set_output_polarity(channel, polarity);
110 } 110 }
111} 111}
112
113impl<'d, T: CaptureCompare16bitInstance> embedded_hal_02::Pwm for SimplePwm<'d, T> {
114 type Channel = Channel;
115 type Time = Hertz;
116 type Duty = u16;
117
118 fn disable(&mut self, channel: Self::Channel) {
119 self.inner.enable_channel(channel, false);
120 }
121
122 fn enable(&mut self, channel: Self::Channel) {
123 self.inner.enable_channel(channel, true);
124 }
125
126 fn get_period(&self) -> Self::Time {
127 self.inner.get_frequency().into()
128 }
129
130 fn get_duty(&self, channel: Self::Channel) -> Self::Duty {
131 self.inner.get_compare_value(channel)
132 }
133
134 fn get_max_duty(&self) -> Self::Duty {
135 self.inner.get_max_compare_value() + 1
136 }
137
138 fn set_duty(&mut self, channel: Self::Channel, duty: Self::Duty) {
139 assert!(duty <= self.get_max_duty());
140 self.inner.set_compare_value(channel, duty)
141 }
142
143 fn set_period<P>(&mut self, period: P)
144 where
145 P: Into<Self::Time>,
146 {
147 self.inner.set_frequency(period.into());
148 }
149}