Skip to content

Commit 638dbeb

Browse files
committed
More work on dac trigger and tests
1 parent f51452f commit 638dbeb

File tree

6 files changed

+438
-8
lines changed

6 files changed

+438
-8
lines changed

Cargo.toml

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -155,6 +155,10 @@ name = "nucleo-g474_hrtim"
155155
harness = false
156156
required-features = ["stm32g474", "defmt", "hrtim"]
157157

158+
[[test]]
159+
name = "nucleo-g474_w_jumpers-hrtim"
160+
harness = false
161+
158162
[lib]
159163
test = false
160164

examples/utils/mod.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
11
//! Utilities for examples
22
33
pub mod logger;
4+
pub mod test;

examples/utils/test.rs

Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
#![allow(dead_code)]
2+
3+
use fugit::MicrosDurationU32;
4+
5+
use stm32g4xx_hal::stm32;
6+
7+
pub fn is_pax_low(gpioa: &stm32::gpioa::RegisterBlock, x: u8) -> bool {
8+
gpioa.idr().read().idr(x).is_low()
9+
}
10+
11+
#[cfg_attr(feature = "defmt", derive(defmt::Format))]
12+
#[derive(Debug)]
13+
pub struct ErrorTimedOut;
14+
15+
pub fn await_lo(
16+
gpioa: &stm32::gpioa::RegisterBlock,
17+
pin: u8,
18+
timeout: MicrosDurationU32,
19+
now: impl FnMut() -> MicrosDurationU32,
20+
) -> Result<MicrosDurationU32, ErrorTimedOut> {
21+
await_p(|| is_pax_low(gpioa, pin), timeout, now)
22+
}
23+
24+
pub fn await_hi(
25+
gpioa: &stm32::gpioa::RegisterBlock,
26+
pin: u8,
27+
timeout: MicrosDurationU32,
28+
now: impl FnMut() -> MicrosDurationU32,
29+
) -> Result<MicrosDurationU32, ErrorTimedOut> {
30+
await_p(|| !is_pax_low(gpioa, pin), timeout, now)
31+
}
32+
33+
pub fn await_p(
34+
mut p: impl FnMut() -> bool,
35+
timeout: MicrosDurationU32,
36+
mut now: impl FnMut() -> MicrosDurationU32,
37+
) -> Result<MicrosDurationU32, ErrorTimedOut> {
38+
let before = now();
39+
40+
loop {
41+
let passed_time = now() - before;
42+
if p() {
43+
return Ok(passed_time);
44+
}
45+
if passed_time > timeout {
46+
return Err(ErrorTimedOut);
47+
}
48+
}
49+
}

src/hrtim/dac_trigger.rs

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
use stm32_hrtim::DacResetOnCounterReset;
2+
use stm32_hrtim::{
3+
compare_register::HrCr2, output::HrOut1, timer::HrTim, DacResetOnOut1Set, DacResetTrigger,
4+
DacStepOnCmp2, DacStepOnOut1Rst, DacStepTrigger,
5+
};
6+
7+
use crate::dac::{IncTriggerSource, TriggerSource as RstTriggerSource};
8+
use crate::stm32;
9+
10+
// TODO: use crate::stasis instead of references
11+
macro_rules! impl_dac_triggers {
12+
($($TIM:ident: $bits:expr),*) => {$(
13+
unsafe impl<PSCL> IncTriggerSource for &HrCr2<stm32::$TIM, PSCL, DacStepOnCmp2> {
14+
const BITS: u8 = $bits;
15+
}
16+
unsafe impl<PSCL, R: DacResetTrigger> IncTriggerSource for &HrOut1<stm32::$TIM, PSCL, R, DacStepOnOut1Rst> {
17+
const BITS: u8 = $bits;
18+
}
19+
20+
unsafe impl<PSCL, CPT1, CPT2> RstTriggerSource for &HrTim<stm32::$TIM, PSCL, CPT1, CPT2, DacResetOnCounterReset> {
21+
const BITS: u8 = $bits;
22+
}
23+
unsafe impl<PSCL, S: DacStepTrigger> RstTriggerSource for &HrOut1<stm32::$TIM, PSCL, DacResetOnOut1Set, S> {
24+
const BITS: u8 = $bits;
25+
}
26+
)*};
27+
}
28+
29+
// RM0440 DAC1 interconnection
30+
impl_dac_triggers! {
31+
HRTIM_TIMA: 9,
32+
HRTIM_TIMB: 10,
33+
HRTIM_TIMC: 11,
34+
HRTIM_TIMD: 12,
35+
HRTIM_TIME: 13,
36+
HRTIM_TIMF: 14
37+
}

src/hrtim/mod.rs

Lines changed: 26 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
pub mod adc_trigger;
22
pub mod capture;
3+
pub mod dac_trigger;
34
pub mod external_event;
45
pub mod fault;
56

@@ -13,7 +14,7 @@ use crate::{
1314
use stm32_hrtim::{
1415
control::{HrPwmControl, HrTimOngoingCalibration},
1516
output::{HrOut1, HrOut2, ToHrOut},
16-
HrParts, HrPwmBuilder,
17+
DacResetTrigger, DacStepTrigger, HrParts, HrPwmBuilder,
1718
};
1819

1920
pub use stm32_hrtim;
@@ -33,18 +34,31 @@ impl HrControltExt for crate::stm32::HRTIM_COMMON {
3334
}
3435
}
3536

36-
pub trait HrPwmBuilderExt<TIM, PSCL, PINS: ToHrOut<TIM>> {
37-
fn finalize(self, control: &mut HrPwmControl) -> HrParts<TIM, PSCL, PINS::Out<PSCL>>;
37+
pub trait HrPwmBuilderExt<TIM, PSCL, PINS: ToHrOut<TIM>, DacRst, DacStp>
38+
where
39+
DacRst: DacResetTrigger,
40+
DacStp: DacStepTrigger,
41+
{
42+
fn finalize(
43+
self,
44+
control: &mut HrPwmControl,
45+
) -> HrParts<TIM, PSCL, PINS::Out<PSCL>, DacRst, DacStp>;
3846
}
47+
3948
macro_rules! impl_finalize {
4049
($($TIMX:ident),+) => {$(
41-
impl<PSCL: stm32_hrtim::HrtimPrescaler, PINS: HrtimPin<$TIMX>> HrPwmBuilderExt<$TIMX, PSCL, PINS>
42-
for HrPwmBuilder<$TIMX, PSCL, stm32_hrtim::PreloadSource, PINS>
50+
impl<PSCL, PINS, DacRst, DacStp> HrPwmBuilderExt<$TIMX, PSCL, PINS, DacRst, DacStp>
51+
for HrPwmBuilder<$TIMX, PSCL, stm32_hrtim::PreloadSource, PINS, DacRst, DacStp>
52+
where
53+
PSCL: stm32_hrtim::HrtimPrescaler,
54+
PINS: HrtimPin<$TIMX>,
55+
DacRst: DacResetTrigger,
56+
DacStp: DacStepTrigger
4357
{
4458
fn finalize(
4559
self,
4660
control: &mut HrPwmControl,
47-
) -> HrParts<$TIMX, PSCL, <PINS as ToHrOut<$TIMX>>::Out<PSCL>> {
61+
) -> HrParts<$TIMX, PSCL, <PINS as ToHrOut<$TIMX>>::Out<PSCL>, DacRst, DacStp> {
4862
let pins = self._init(control);
4963
pins.connect_to_hrtim();
5064
unsafe { MaybeUninit::uninit().assume_init() }
@@ -93,8 +107,12 @@ macro_rules! pins_helper {
93107
($TIMX:ty, $HrOutY:ident, $CHY:ident<$CHY_AF:literal>) => {
94108
//impl sealed::Sealed<$TIMX> for $CHY<GpioInputMode> {}
95109

96-
unsafe impl ToHrOut<$TIMX> for $CHY<gpio::DefaultMode> {
97-
type Out<PSCL> = $HrOutY<$TIMX, PSCL>;
110+
unsafe impl<DacRst, DacStp> ToHrOut<$TIMX, DacRst, DacStp> for $CHY<gpio::DefaultMode>
111+
where
112+
DacRst: DacResetTrigger,
113+
DacStp: DacStepTrigger,
114+
{
115+
type Out<PSCL> = $HrOutY<$TIMX, PSCL, DacRst, DacStp>;
98116
}
99117

100118
impl HrtimPin<$TIMX> for $CHY<gpio::DefaultMode> {

0 commit comments

Comments
 (0)