From 67e2f9159cac61a6551dc68363014b5d2ee664ea Mon Sep 17 00:00:00 2001 From: Joshua Salzedo Date: Mon, 27 Sep 2021 15:27:43 -0700 Subject: [PATCH 1/2] set moder::ALTERNATE last when configuring pins to AF modes. - as per STM32F4xx_hal's impl --- embassy-stm32/src/gpio.rs | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/embassy-stm32/src/gpio.rs b/embassy-stm32/src/gpio.rs index 14f2559e1..81d427a74 100644 --- a/embassy-stm32/src/gpio.rs +++ b/embassy-stm32/src/gpio.rs @@ -310,9 +310,6 @@ pub(crate) mod sealed { unsafe fn set_as_af(&self, af_num: u8, af_type: OutputType) { let pin = self._pin() as usize; let block = self.block(); - block - .moder() - .modify(|w| w.set_moder(pin, vals::Moder::ALTERNATE)); block .afr(pin / 8) .modify(|w| w.set_afr(pin % 8, vals::Afr(af_num))); @@ -327,6 +324,10 @@ pub(crate) mod sealed { block .pupdr() .modify(|w| w.set_pupdr(pin, vals::Pupdr::FLOATING)); + + block + .moder() + .modify(|w| w.set_moder(pin, vals::Moder::ALTERNATE)); } unsafe fn set_as_analog(&self) { From ab60cfd64b243d09ea3856da26d809e1b37cb052 Mon Sep 17 00:00:00 2001 From: Joshua Salzedo Date: Mon, 27 Sep 2021 15:48:56 -0700 Subject: [PATCH 2/2] Patch additional regressions --- embassy-stm32/src/gpio.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/embassy-stm32/src/gpio.rs b/embassy-stm32/src/gpio.rs index 81d427a74..a67d4e73f 100644 --- a/embassy-stm32/src/gpio.rs +++ b/embassy-stm32/src/gpio.rs @@ -130,9 +130,9 @@ impl<'d, T: Pin> Output<'d, T> { let r = pin.block(); let n = pin.pin() as usize; r.pupdr().modify(|w| w.set_pupdr(n, vals::Pupdr::FLOATING)); - r.moder().modify(|w| w.set_moder(n, vals::Moder::OUTPUT)); r.otyper().modify(|w| w.set_ot(n, vals::Ot::PUSHPULL)); pin.set_speed(speed); + r.moder().modify(|w| w.set_moder(n, vals::Moder::OUTPUT)); }); Self { @@ -208,9 +208,9 @@ impl<'d, T: Pin> OutputOpenDrain<'d, T> { let r = pin.block(); let n = pin.pin() as usize; r.pupdr().modify(|w| w.set_pupdr(n, pull.into())); - r.moder().modify(|w| w.set_moder(n, vals::Moder::OUTPUT)); r.otyper().modify(|w| w.set_ot(n, vals::Ot::OPENDRAIN)); pin.set_speed(speed); + r.moder().modify(|w| w.set_moder(n, vals::Moder::OUTPUT)); }); Self {