diff options
| -rw-r--r-- | embassy-stm32/src/gpio.rs | 19 | ||||
| -rw-r--r-- | embassy-stm32/src/spi/spi_v1.rs | 29 |
2 files changed, 27 insertions, 21 deletions
diff --git a/embassy-stm32/src/gpio.rs b/embassy-stm32/src/gpio.rs index 350918e84..ae3690044 100644 --- a/embassy-stm32/src/gpio.rs +++ b/embassy-stm32/src/gpio.rs | |||
| @@ -184,6 +184,25 @@ pub(crate) mod sealed { | |||
| 184 | self.block().bsrr().write(|w| w.set_br(n, true)); | 184 | self.block().bsrr().write(|w| w.set_br(n, true)); |
| 185 | } | 185 | } |
| 186 | } | 186 | } |
| 187 | |||
| 188 | unsafe fn set_as_af(&self, af_num: u8) { | ||
| 189 | let pin = self._pin() as usize; | ||
| 190 | let block = self.block(); | ||
| 191 | block | ||
| 192 | .moder() | ||
| 193 | .modify(|w| w.set_moder(pin, vals::Moder::ALTERNATE)); | ||
| 194 | block | ||
| 195 | .afr(pin / 8) | ||
| 196 | .modify(|w| w.set_afr(pin % 8, vals::Afr(af_num))); | ||
| 197 | } | ||
| 198 | |||
| 199 | unsafe fn set_as_analog(&self) { | ||
| 200 | let pin = self._pin() as usize; | ||
| 201 | let block = self.block(); | ||
| 202 | block | ||
| 203 | .moder() | ||
| 204 | .modify(|w| w.set_moder(pin, vals::Moder::ANALOG)); | ||
| 205 | } | ||
| 187 | } | 206 | } |
| 188 | 207 | ||
| 189 | pub trait OptionalPin {} | 208 | pub trait OptionalPin {} |
diff --git a/embassy-stm32/src/spi/spi_v1.rs b/embassy-stm32/src/spi/spi_v1.rs index 002fe207e..90515727f 100644 --- a/embassy-stm32/src/spi/spi_v1.rs +++ b/embassy-stm32/src/spi/spi_v1.rs | |||
| @@ -1,8 +1,6 @@ | |||
| 1 | #![macro_use] | 1 | #![macro_use] |
| 2 | 2 | ||
| 3 | use crate::gpio::{AnyPin, Pin}; | 3 | use crate::gpio::{sealed::Pin, AnyPin}; |
| 4 | use crate::pac::gpio::vals::{Afr, Moder}; | ||
| 5 | use crate::pac::gpio::Gpio; | ||
| 6 | use crate::pac::spi; | 4 | use crate::pac::spi; |
| 7 | use crate::spi::{ByteOrder, Config, Error, Instance, MisoPin, MosiPin, SckPin, WordSize}; | 5 | use crate::spi::{ByteOrder, Config, Error, Instance, MisoPin, MosiPin, SckPin, WordSize}; |
| 8 | use crate::time::Hertz; | 6 | use crate::time::Hertz; |
| @@ -42,13 +40,12 @@ impl<'d, T: Instance> Spi<'d, T> { | |||
| 42 | where | 40 | where |
| 43 | F: Into<Hertz>, | 41 | F: Into<Hertz>, |
| 44 | { | 42 | { |
| 45 | unborrow!(peri); | 43 | unborrow!(peri, sck, mosi, miso); |
| 46 | unborrow!(sck, mosi, miso); | ||
| 47 | 44 | ||
| 48 | unsafe { | 45 | unsafe { |
| 49 | Self::configure_pin(sck.block(), sck.pin() as _, sck.af()); | 46 | sck.set_as_af(sck.af()); |
| 50 | Self::configure_pin(mosi.block(), mosi.pin() as _, mosi.af()); | 47 | mosi.set_as_af(mosi.af()); |
| 51 | Self::configure_pin(miso.block(), miso.pin() as _, miso.af()); | 48 | miso.set_as_af(miso.af()); |
| 52 | } | 49 | } |
| 53 | 50 | ||
| 54 | let sck = sck.degrade(); | 51 | let sck = sck.degrade(); |
| @@ -101,16 +98,6 @@ impl<'d, T: Instance> Spi<'d, T> { | |||
| 101 | } | 98 | } |
| 102 | } | 99 | } |
| 103 | 100 | ||
| 104 | unsafe fn configure_pin(block: Gpio, pin: usize, af_num: u8) { | ||
| 105 | let (afr, n_af) = if pin < 8 { (0, pin) } else { (1, pin - 8) }; | ||
| 106 | block.moder().modify(|w| w.set_moder(pin, Moder::ALTERNATE)); | ||
| 107 | block.afr(afr).modify(|w| w.set_afr(n_af, Afr(af_num))); | ||
| 108 | } | ||
| 109 | |||
| 110 | unsafe fn unconfigure_pin(block: Gpio, pin: usize) { | ||
| 111 | block.moder().modify(|w| w.set_moder(pin, Moder::ANALOG)); | ||
| 112 | } | ||
| 113 | |||
| 114 | fn compute_baud_rate(clocks: Hertz, freq: Hertz) -> u8 { | 101 | fn compute_baud_rate(clocks: Hertz, freq: Hertz) -> u8 { |
| 115 | match clocks.0 / freq.0 { | 102 | match clocks.0 / freq.0 { |
| 116 | 0 => unreachable!(), | 103 | 0 => unreachable!(), |
| @@ -145,9 +132,9 @@ impl<'d, T: Instance> Spi<'d, T> { | |||
| 145 | impl<'d, T: Instance> Drop for Spi<'d, T> { | 132 | impl<'d, T: Instance> Drop for Spi<'d, T> { |
| 146 | fn drop(&mut self) { | 133 | fn drop(&mut self) { |
| 147 | unsafe { | 134 | unsafe { |
| 148 | Self::unconfigure_pin(self.sck.block(), self.sck.pin() as _); | 135 | self.sck.set_as_analog(); |
| 149 | Self::unconfigure_pin(self.mosi.block(), self.mosi.pin() as _); | 136 | self.mosi.set_as_analog(); |
| 150 | Self::unconfigure_pin(self.miso.block(), self.miso.pin() as _); | 137 | self.miso.set_as_analog(); |
| 151 | } | 138 | } |
| 152 | } | 139 | } |
| 153 | } | 140 | } |
