aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDario Nieuwenhuis <[email protected]>2021-05-15 02:39:08 +0200
committerDario Nieuwenhuis <[email protected]>2021-05-15 03:07:59 +0200
commit8bb1bc3507efad5c2ffb41985fe37ccebc63e410 (patch)
treeaaab8dd1ae96aa5824b3075be00878295fc079f2
parentee869efcb58fa951e3dd377926b83c6b15cde716 (diff)
Move pin configuration to gpio mod
-rw-r--r--embassy-stm32/src/gpio.rs19
-rw-r--r--embassy-stm32/src/spi/spi_v1.rs29
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
3use crate::gpio::{AnyPin, Pin}; 3use crate::gpio::{sealed::Pin, AnyPin};
4use crate::pac::gpio::vals::{Afr, Moder};
5use crate::pac::gpio::Gpio;
6use crate::pac::spi; 4use crate::pac::spi;
7use crate::spi::{ByteOrder, Config, Error, Instance, MisoPin, MosiPin, SckPin, WordSize}; 5use crate::spi::{ByteOrder, Config, Error, Instance, MisoPin, MosiPin, SckPin, WordSize};
8use crate::time::Hertz; 6use 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> {
145impl<'d, T: Instance> Drop for Spi<'d, T> { 132impl<'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}