diff options
| author | randi <[email protected]> | 2023-10-07 11:57:19 +1300 |
|---|---|---|
| committer | randi <[email protected]> | 2023-10-07 11:57:19 +1300 |
| commit | b217d147deab67a988df0d5e58a15eb9260dd6fa (patch) | |
| tree | 3a500cee61ed806b4bba09406977ca7d812ca7fc /embassy-stm32 | |
| parent | 65ed19aae272d6d6320554446f9187ec2ef8bf39 (diff) | |
Implemented Pwm trait from embedded_hal
Diffstat (limited to 'embassy-stm32')
| -rw-r--r-- | embassy-stm32/src/timer/mod.rs | 28 | ||||
| -rw-r--r-- | embassy-stm32/src/timer/simple_pwm.rs | 38 |
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 | |||
| 113 | impl<'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 | } | ||
