aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDario Nieuwenhuis <[email protected]>2023-10-07 00:35:05 +0000
committerGitHub <[email protected]>2023-10-07 00:35:05 +0000
commit9d311121f23d030bd6f8bbe2787b865b3be74a91 (patch)
tree11b5add91ec648b43b7da681719c767b96d9cb9c
parent25c3754cd2fc28a5b9cfec95375bcd035959d237 (diff)
parent710874021a783768f5d2d3f712e095eba3bc1627 (diff)
Merge pull request #2022 from HelloWorldTeraByte/impl-pwm-trait
Implemented Pwm trait from embedded_hal for simple and complementary pwm
-rw-r--r--embassy-stm32/src/timer/complementary_pwm.rs40
-rw-r--r--embassy-stm32/src/timer/mod.rs28
-rw-r--r--embassy-stm32/src/timer/simple_pwm.rs38
3 files changed, 106 insertions, 0 deletions
diff --git a/embassy-stm32/src/timer/complementary_pwm.rs b/embassy-stm32/src/timer/complementary_pwm.rs
index 4f033e3a2..0ab727344 100644
--- a/embassy-stm32/src/timer/complementary_pwm.rs
+++ b/embassy-stm32/src/timer/complementary_pwm.rs
@@ -122,6 +122,46 @@ impl<'d, T: ComplementaryCaptureCompare16bitInstance> ComplementaryPwm<'d, T> {
122 } 122 }
123} 123}
124 124
125impl<'d, T: ComplementaryCaptureCompare16bitInstance> embedded_hal_02::Pwm for ComplementaryPwm<'d, T> {
126 type Channel = Channel;
127 type Time = Hertz;
128 type Duty = u16;
129
130 fn disable(&mut self, channel: Self::Channel) {
131 self.inner.enable_complementary_channel(channel, false);
132 self.inner.enable_channel(channel, false);
133 }
134
135 fn enable(&mut self, channel: Self::Channel) {
136 self.inner.enable_channel(channel, true);
137 self.inner.enable_complementary_channel(channel, true);
138 }
139
140 fn get_period(&self) -> Self::Time {
141 self.inner.get_frequency().into()
142 }
143
144 fn get_duty(&self, channel: Self::Channel) -> Self::Duty {
145 self.inner.get_compare_value(channel)
146 }
147
148 fn get_max_duty(&self) -> Self::Duty {
149 self.inner.get_max_compare_value() + 1
150 }
151
152 fn set_duty(&mut self, channel: Self::Channel, duty: Self::Duty) {
153 assert!(duty <= self.get_max_duty());
154 self.inner.set_compare_value(channel, duty)
155 }
156
157 fn set_period<P>(&mut self, period: P)
158 where
159 P: Into<Self::Time>,
160 {
161 self.inner.set_frequency(period.into());
162 }
163}
164
125fn compute_dead_time_value(value: u16) -> (Ckd, u8) { 165fn compute_dead_time_value(value: u16) -> (Ckd, u8) {
126 /* 166 /*
127 Dead-time = T_clk * T_dts * T_dtg 167 Dead-time = T_clk * T_dts * T_dtg
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}