Skip to content

Commit 505a85e

Browse files
committed
eh-1.0.0: pwm
1 parent a77abcf commit 505a85e

File tree

6 files changed

+279
-180
lines changed

6 files changed

+279
-180
lines changed

CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88

99
* pwm: Renamed `get_max_duty` -> `max_duty_cycle`; `set_duty` -> `set_duty_cycle`
1010
* pwm: `enable` method now returns type `Result<(), PwmError>`
11+
* pwm: LPTIMs can return a `NotEnabled` error from `set_duty_cycle`
1112

1213
## [v0.15.1] 2023-11-03
1314

examples/pwm.rs

Lines changed: 13 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -4,9 +4,12 @@
44

55
use cortex_m::asm;
66
use cortex_m_rt::entry;
7+
8+
use embedded_hal::pwm::*;
9+
use stm32h7xx_hal::{pac, prelude::*};
10+
711
#[macro_use]
812
mod utilities;
9-
use stm32h7xx_hal::{pac, prelude::*};
1013

1114
use log::info;
1215

@@ -47,23 +50,23 @@ fn main() -> ! {
4750
.pwm(pins, 10.kHz(), ccdr.peripheral.TIM1, &ccdr.clocks);
4851

4952
// Output PWM on PA8
50-
let max = pwm.get_max_duty();
51-
pwm.set_duty(max / 2);
53+
let max = pwm.max_duty_cycle();
54+
pwm.set_duty_cycle(max / 2).unwrap();
5255

5356
info!("50%");
54-
pwm.enable();
57+
pwm.enable().unwrap();
5558
asm::bkpt();
5659

5760
info!("25%");
58-
pwm.set_duty(max / 4);
61+
pwm.set_duty_cycle(max / 4).unwrap();
5962
asm::bkpt();
6063

6164
info!("12.5%");
62-
pwm.set_duty(max / 8);
65+
pwm.set_duty_cycle(max / 8).unwrap();
6366
asm::bkpt();
6467

6568
info!("100%");
66-
pwm.set_duty(max);
69+
pwm.set_duty_cycle(max).unwrap();
6770
asm::bkpt();
6871

6972
let mut pwm = dp.TIM12.pwm(
@@ -74,9 +77,9 @@ fn main() -> ! {
7477
);
7578

7679
// Output PWM on PB14
77-
let max = pwm.get_max_duty();
78-
pwm.set_duty(max / 2);
79-
pwm.enable();
80+
let max = pwm.max_duty_cycle();
81+
pwm.set_duty_cycle(max / 2).unwrap();
82+
pwm.enable().unwrap();
8083

8184
loop {
8285
cortex_m::asm::nop()

examples/pwm_advanced.rs

Lines changed: 63 additions & 61 deletions
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,7 @@
4545
//! If you momentarily pull PE15 low, LD2 will turn on and you will get no PWM on PE8-PE14, even if you pull PE15 high again
4646
//! If PE15 is high and you press the USER button, TIM1 PWM will resume on PE8-PE14
4747
48-
#![deny(warnings)]
48+
//#![deny(warnings)]
4949
#![no_main]
5050
#![no_std]
5151

@@ -55,6 +55,8 @@ mod utilities;
5555
use stm32h7xx_hal::pwm::{FaultMonitor, Polarity};
5656
use stm32h7xx_hal::{pac, prelude::*};
5757

58+
use embedded_hal::pwm::*;
59+
5860
use log::info;
5961

6062
#[entry]
@@ -122,16 +124,16 @@ fn main() -> ! {
122124
let mut t1c4 = t1c4.into_active_low();
123125

124126
// Output TIM1 PWM
125-
let period = t1c1.get_max_duty();
126-
t1c1.set_duty(period / 2);
127-
t1c2.set_duty(period / 8 * 7);
128-
t1c3.set_duty(period / 8);
129-
t1c4.set_duty(period / 2);
127+
let period = t1c1.max_duty_cycle();
128+
t1c1.set_duty_cycle(period / 2).unwrap();
129+
t1c2.set_duty_cycle(period / 8 * 7).unwrap();
130+
t1c3.set_duty_cycle(period / 8).unwrap();
131+
t1c4.set_duty_cycle(period / 2).unwrap();
130132

131-
t1c1.enable();
132-
t1c2.enable();
133-
t1c3.enable();
134-
t1c4.enable();
133+
t1c1.enable().unwrap();
134+
t1c2.enable().unwrap();
135+
t1c3.enable().unwrap();
136+
t1c4.enable().unwrap();
135137

136138
// Configure TIM2 PWM
137139
let (_t2control, (mut t2c2, mut t2c1, mut t2c3, t2c4)) = dp
@@ -154,16 +156,16 @@ fn main() -> ! {
154156
let mut t2c4 = t2c4.into_active_low();
155157

156158
// Output TIM2 PWM
157-
let period = t2c1.get_max_duty();
158-
t2c1.set_duty(period / 4 * 3);
159-
t2c2.set_duty(period / 2);
160-
t2c3.set_duty(period / 4);
161-
t2c4.set_duty(period / 4 * 3);
159+
let period = t2c1.max_duty_cycle();
160+
t2c1.set_duty_cycle(period / 4 * 3).unwrap();
161+
t2c2.set_duty_cycle(period / 2).unwrap();
162+
t2c3.set_duty_cycle(period / 4).unwrap();
163+
t2c4.set_duty_cycle(period / 4 * 3).unwrap();
162164

163-
t2c1.enable();
164-
t2c2.enable();
165-
t2c3.enable();
166-
t2c4.enable();
165+
t2c1.enable().unwrap();
166+
t2c2.enable().unwrap();
167+
t2c3.enable().unwrap();
168+
t2c4.enable().unwrap();
167169

168170
// Configure TIM3 PWM
169171
let (_t3control, (mut t3c3, mut t3c2)) = dp
@@ -178,12 +180,12 @@ fn main() -> ! {
178180
.finalize();
179181

180182
// Output TIM3 PWM
181-
let period = t3c2.get_max_duty();
182-
t3c2.set_duty(period / 3);
183-
t3c3.set_duty(period / 3 * 2);
183+
let period = t3c2.max_duty_cycle();
184+
t3c2.set_duty_cycle(period / 3).unwrap();
185+
t3c3.set_duty_cycle(period / 3 * 2).unwrap();
184186

185-
t3c2.enable();
186-
t3c3.enable();
187+
t3c2.enable().unwrap();
188+
t3c3.enable().unwrap();
187189

188190
// Configure TIM4 PWM
189191
let (_t4control, t4c4) = dp
@@ -199,10 +201,10 @@ fn main() -> ! {
199201
let mut t4c4 = t4c4.into_active_low();
200202

201203
// Output TIM4 PWM
202-
let period = t4c4.get_max_duty();
203-
t4c4.set_duty(period / 10 * 4);
204+
let period = t4c4.max_duty_cycle();
205+
t4c4.set_duty_cycle(period / 10 * 4).unwrap();
204206

205-
t4c4.enable();
207+
t4c4.enable().unwrap();
206208

207209
// Configure TIM5 PWM
208210
let t5builder = dp
@@ -218,10 +220,10 @@ fn main() -> ! {
218220
let (_t5control, mut t5c4) = t5builder.finalize();
219221

220222
// Output TIM5 PWM
221-
let period = t5c4.get_max_duty();
222-
t5c4.set_duty(period / 5 * 4);
223+
let period = t5c4.max_duty_cycle();
224+
t5c4.set_duty_cycle(period / 5 * 4).unwrap();
223225

224-
t5c4.enable();
226+
t5c4.enable().unwrap();
225227

226228
// Configure TIM8 PWM
227229
let (mut t8control, (t8c1, mut t8c2, t8c3, t8c4)) = dp
@@ -247,16 +249,16 @@ fn main() -> ! {
247249
let mut t8c4 = t8c4.into_active_low();
248250

249251
// Output TIM8 PWM
250-
let period = t8c1.get_max_duty();
251-
t8c1.set_duty(period / 2);
252-
t8c2.set_duty(period / 10);
253-
t8c3.set_duty(period / 4);
254-
t8c4.set_duty(period / 4 * 3);
252+
let period = t8c1.max_duty_cycle();
253+
t8c1.set_duty_cycle(period / 2).unwrap();
254+
t8c2.set_duty_cycle(period / 10).unwrap();
255+
t8c3.set_duty_cycle(period / 4).unwrap();
256+
t8c4.set_duty_cycle(period / 4 * 3).unwrap();
255257

256-
t8c1.enable();
257-
t8c2.enable();
258-
t8c3.enable();
259-
t8c4.enable();
258+
t8c1.enable().unwrap();
259+
t8c2.enable().unwrap();
260+
t8c3.enable().unwrap();
261+
t8c4.enable().unwrap();
260262

261263
// Configure TIM12 PWM
262264
let (mut t12c2, t12c1) = dp.TIM12.pwm(
@@ -269,12 +271,12 @@ fn main() -> ! {
269271
let mut t12c1 = t12c1.into_active_low();
270272

271273
// Output TIM12 PWM
272-
let period = t12c1.get_max_duty();
273-
t12c1.set_duty(period / 4);
274-
t12c2.set_duty(period / 10 * 4);
274+
let period = t12c1.max_duty_cycle();
275+
t12c1.set_duty_cycle(period / 4).unwrap();
276+
t12c2.set_duty_cycle(period / 10 * 4).unwrap();
275277

276-
t12c1.enable();
277-
t12c2.enable();
278+
t12c1.enable().unwrap();
279+
t12c2.enable().unwrap();
278280

279281
// Configure TIM13 PWM
280282
let (_t13control, t13c1) = dp
@@ -290,10 +292,10 @@ fn main() -> ! {
290292
let mut t13c1 = t13c1.into_active_low();
291293

292294
// Output TIM13 PWM
293-
let period = t13c1.get_max_duty();
294-
t13c1.set_duty(period / 10 * 3);
295+
let period = t13c1.max_duty_cycle();
296+
t13c1.set_duty_cycle(period / 10 * 3).unwrap();
295297

296-
t13c1.enable();
298+
t13c1.enable().unwrap();
297299

298300
// Configure TIM14 PWM
299301
let (_t14control, mut t14c1) = dp
@@ -307,10 +309,10 @@ fn main() -> ! {
307309
.finalize();
308310

309311
// Output TIM14 PWM
310-
let period = t14c1.get_max_duty();
311-
t14c1.set_duty(period / 5);
312+
let period = t14c1.max_duty_cycle();
313+
t14c1.set_duty_cycle(period / 5).unwrap();
312314

313-
t14c1.enable();
315+
t14c1.enable().unwrap();
314316

315317
// Configure TIM15 PWM
316318
let (mut t15control, (t15c1, mut t15c2)) = dp
@@ -331,12 +333,12 @@ fn main() -> ! {
331333
.into_comp_active_low();
332334

333335
// Output TIM15 PWM
334-
let period = t15c1.get_max_duty();
335-
t15c1.set_duty(period / 4);
336-
t15c2.set_duty(period / 2);
336+
let period = t15c1.max_duty_cycle();
337+
t15c1.set_duty_cycle(period / 4).unwrap();
338+
t15c2.set_duty_cycle(period / 2).unwrap();
337339

338-
t15c1.enable();
339-
t15c2.enable();
340+
t15c1.enable().unwrap();
341+
t15c2.enable().unwrap();
340342

341343
// Configure TIM16 PWM
342344
let (mut t16control, t16c1) = dp
@@ -353,10 +355,10 @@ fn main() -> ! {
353355
let mut t16c1 = t16c1.into_active_low();
354356

355357
// Output TIM16 PWM
356-
let period = t16c1.get_max_duty();
357-
t16c1.set_duty(period / 4);
358+
let period = t16c1.max_duty_cycle();
359+
t16c1.set_duty_cycle(period / 4).unwrap();
358360

359-
t16c1.enable();
361+
t16c1.enable().unwrap();
360362

361363
// Configure TIM17 PWM
362364
let (_t17control, t17c1) = dp
@@ -373,10 +375,10 @@ fn main() -> ! {
373375
let mut t17c1 = t17c1.into_complementary(gpiof.pf9.into_alternate());
374376

375377
// Output TIM16 PWM
376-
let period = t17c1.get_max_duty();
377-
t17c1.set_duty(period / 2);
378+
let period = t17c1.max_duty_cycle();
379+
t17c1.set_duty_cycle(period / 2).unwrap();
378380

379-
t17c1.enable();
381+
t17c1.enable().unwrap();
380382

381383
info!("");
382384
info!("PWM channels enabled; see examples/pwm_advanced.rs for list of channels, pins, and settings");

examples/pwm_lptim.rs

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,8 @@ use cortex_m::asm;
88
use cortex_m_rt::entry;
99
#[macro_use]
1010
mod utilities;
11+
12+
use embedded_hal::pwm::*;
1113
use stm32h7xx_hal::{pac, prelude::*, rcc::rec};
1214

1315
use log::info;
@@ -44,26 +46,26 @@ fn main() -> ! {
4446
.kernel_clk_mux(rec::Lptim2ClkSel::Lsi),
4547
&ccdr.clocks,
4648
);
47-
pwm.enable(); // must be enabled before use
49+
pwm.enable().unwrap(); // must be enabled before use
4850

4951
// Output PWM on PB13
50-
let max = pwm.get_max_duty();
51-
pwm.set_duty(max / 2);
52+
let max = pwm.max_duty_cycle();
53+
pwm.set_duty_cycle(max / 2).unwrap();
5254

5355
info!("50%");
54-
pwm.enable();
56+
pwm.enable().unwrap();
5557
asm::bkpt();
5658

5759
info!("25%");
58-
pwm.set_duty(max / 4);
60+
pwm.set_duty_cycle(max / 4).unwrap();
5961
asm::bkpt();
6062

6163
info!("12.5%");
62-
pwm.set_duty(max / 8);
64+
pwm.set_duty_cycle(max / 8).unwrap();
6365
asm::bkpt();
6466

6567
info!("100%");
66-
pwm.set_duty(max);
68+
pwm.set_duty_cycle(max).unwrap();
6769
asm::bkpt();
6870

6971
loop {

0 commit comments

Comments
 (0)