Skip to content

Commit 9347fb6

Browse files
authored
Merge pull request #75 from stm32-rs/feature/pwm-dymamic-freq
PWM updates
2 parents 50b3ab4 + 2dd4116 commit 9347fb6

File tree

4 files changed

+38
-36
lines changed

4 files changed

+38
-36
lines changed

examples/adc.rs

Lines changed: 5 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ extern crate panic_halt;
99
extern crate stm32g0xx_hal as hal;
1010

1111
use cortex_m_semihosting::hprintln;
12-
use hal::analog::adc::{OversamplingRatio, Precision, SampleTime, VTemp};
12+
use hal::analog::adc::{OversamplingRatio, Precision, SampleTime, VBat};
1313
use hal::prelude::*;
1414
use hal::stm32;
1515
use rt::entry;
@@ -35,14 +35,12 @@ fn main() -> ! {
3535

3636
let mut adc_pin = gpioa.pa0.into_analog();
3737

38-
let mut vtemp = VTemp::new();
39-
vtemp.enable(&mut adc);
38+
let mut vbat = VBat::new();
39+
vbat.enable(&mut adc);
4040

4141
loop {
42-
let temp: u32 = adc.read(&mut vtemp).expect("temperature read failed");
43-
let u_raw: u32 = adc.read(&mut adc_pin).expect("adc read failed");
4442
let u_mv = adc.read_voltage(&mut adc_pin).expect("adc read failed");
45-
46-
hprintln!("U raw: {} | U: {} mV | t: {}°C", u_raw, u_mv, temp / 42).unwrap();
43+
let u_bat = adc.read_voltage(&mut vbat).expect("adc read failed");
44+
hprintln!("VBat: {}mV | PA0: {}mV", u_bat * 3, u_mv).unwrap();
4745
}
4846
}

examples/pwm.rs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ fn main() -> ! {
2020

2121
let mut rcc = dp.RCC.constrain();
2222
let gpioa = dp.GPIOA.split(&mut rcc);
23-
let pwm = dp.TIM1.pwm(10.khz(), &mut rcc);
23+
let mut pwm = dp.TIM1.pwm(10.khz(), &mut rcc);
2424

2525
let mut pwm_ch1 = pwm.bind_pin(gpioa.pa8);
2626
let mut pwm_ch2 = pwm.bind_pin(gpioa.pa9);
@@ -41,6 +41,8 @@ fn main() -> ! {
4141
pwm_ch2.set_duty(max / 16);
4242
asm::bkpt();
4343

44+
pwm.set_freq(20.khz());
45+
4446
loop {}
4547
}
4648

examples/stopwatch.rs

Lines changed: 5 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -42,28 +42,20 @@ fn main() -> ! {
4242
});
4343
hprintln!("Timer: 100 us -> {} us", elapsed_us.0).unwrap();
4444

45-
let elapsed_us = stopwatch.trace(|| {
46-
let x = calc_something();
47-
assert!(x > 0);
48-
});
45+
let elapsed_us = stopwatch.trace(calc_something);
4946
hprintln!("Calc @ 16 MHz: {} us", elapsed_us.0).unwrap();
5047

5148
let rcc = rcc.freeze(Config::new(SysClockSrc::PLL));
5249
stopwatch.set_clock(rcc.clocks.apb_tim_clk);
5350

54-
let elapsed_us = stopwatch.trace(|| {
55-
let x = calc_something();
56-
assert!(x > 0);
57-
});
51+
let elapsed_us = stopwatch.trace(calc_something);
5852
hprintln!("Calc @ 64 MHz: {} us", elapsed_us.0).unwrap();
5953

6054
loop {}
6155
}
6256

63-
fn calc_something() -> u32 {
64-
let mut result = 0;
65-
for i in 1..1000 {
66-
result = (result + i) / 3
57+
fn calc_something() {
58+
for _ in 1..100_500 {
59+
cortex_m::asm::nop();
6760
}
68-
result
6961
}

src/timer/pwm.rs

Lines changed: 25 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ use crate::timer::pins::TimerPin;
88
use crate::timer::*;
99

1010
pub struct Pwm<TIM> {
11+
clk: Hertz,
1112
tim: PhantomData<TIM>,
1213
}
1314

@@ -47,24 +48,33 @@ macro_rules! pwm {
4748
}
4849
}
4950

50-
fn $timX<T>(tim: $TIMX, freq: T, rcc: &mut Rcc) -> Pwm<$TIMX>
51-
where
52-
T: Into<Hertz>,
53-
{
51+
fn $timX<F: Into<Hertz>>(_tim: $TIMX, freq: F, rcc: &mut Rcc) -> Pwm<$TIMX> {
5452
$TIMX::enable(rcc);
5553
$TIMX::reset(rcc);
5654

57-
let ratio = rcc.clocks.apb_tim_clk / freq.into();
58-
let psc = (ratio - 1) / 0xffff;
59-
let arr = ratio / (psc + 1) - 1;
60-
tim.psc.write(|w| unsafe { w.psc().bits(psc as u16) });
61-
tim.arr.write(|w| unsafe { w.$arr().bits(arr as u16) });
62-
$(
63-
tim.arr.modify(|_, w| unsafe { w.$arr_h().bits((arr >> 16) as u16) });
64-
)*
65-
tim.cr1.write(|w| w.cen().set_bit());
66-
Pwm {
67-
tim: PhantomData
55+
let mut pwm = Pwm::<$TIMX> {
56+
clk: rcc.clocks.apb_tim_clk,
57+
tim: PhantomData,
58+
};
59+
pwm.set_freq(freq);
60+
pwm
61+
}
62+
63+
impl Pwm<$TIMX> {
64+
pub fn set_freq<F: Into<Hertz>>(&mut self, freq: F) {
65+
let ratio = self.clk / freq.into();
66+
let psc = (ratio - 1) / 0xffff;
67+
let arr = ratio / (psc + 1) - 1;
68+
69+
unsafe {
70+
let tim = &*$TIMX::ptr();
71+
tim.psc.write(|w| w.psc().bits(psc as u16));
72+
tim.arr.write(|w| w.$arr().bits(arr as u16));
73+
$(
74+
tim.arr.modify(|_, w| w.$arr_h().bits((arr >> 16) as u16));
75+
)*
76+
tim.cr1.write(|w| w.cen().set_bit())
77+
}
6878
}
6979
}
7080
)+

0 commit comments

Comments
 (0)