aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDario Nieuwenhuis <[email protected]>2023-10-24 13:13:42 +0000
committerGitHub <[email protected]>2023-10-24 13:13:42 +0000
commitb3879ec22346ac38a409512e147fe8f7137f858a (patch)
treeda0ca5acb4bcff1ad89123f65701a3baeea94afb
parent1a51a843130fbc325dafbbba5004847462089ff3 (diff)
parentbda99e59ec0f2d31e4f29b8d03fbd44d8e917fdd (diff)
Merge pull request #2105 from andresv/fix-stm32-uart-set-config
Fix stm32 uart set_config
-rw-r--r--embassy-stm32/src/usart/buffered.rs48
-rw-r--r--embassy-stm32/src/usart/mod.rs40
-rw-r--r--embassy-stm32/src/usart/ringbuffered.rs6
3 files changed, 60 insertions, 34 deletions
diff --git a/embassy-stm32/src/usart/buffered.rs b/embassy-stm32/src/usart/buffered.rs
index cbc13a342..4daddfe91 100644
--- a/embassy-stm32/src/usart/buffered.rs
+++ b/embassy-stm32/src/usart/buffered.rs
@@ -116,28 +116,28 @@ pub struct BufferedUartRx<'d, T: BasicInstance> {
116 116
117impl<'d, T: BasicInstance> SetConfig for BufferedUart<'d, T> { 117impl<'d, T: BasicInstance> SetConfig for BufferedUart<'d, T> {
118 type Config = Config; 118 type Config = Config;
119 type ConfigError = (); 119 type ConfigError = ConfigError;
120 120
121 fn set_config(&mut self, config: &Self::Config) -> Result<(), ()> { 121 fn set_config(&mut self, config: &Self::Config) -> Result<(), Self::ConfigError> {
122 self.set_config(config).map_err(|_| ()) 122 self.set_config(config)
123 } 123 }
124} 124}
125 125
126impl<'d, T: BasicInstance> SetConfig for BufferedUartRx<'d, T> { 126impl<'d, T: BasicInstance> SetConfig for BufferedUartRx<'d, T> {
127 type Config = Config; 127 type Config = Config;
128 type ConfigError = (); 128 type ConfigError = ConfigError;
129 129
130 fn set_config(&mut self, config: &Self::Config) -> Result<(), ()> { 130 fn set_config(&mut self, config: &Self::Config) -> Result<(), Self::ConfigError> {
131 self.set_config(config).map_err(|_| ()) 131 self.set_config(config)
132 } 132 }
133} 133}
134 134
135impl<'d, T: BasicInstance> SetConfig for BufferedUartTx<'d, T> { 135impl<'d, T: BasicInstance> SetConfig for BufferedUartTx<'d, T> {
136 type Config = Config; 136 type Config = Config;
137 type ConfigError = (); 137 type ConfigError = ConfigError;
138 138
139 fn set_config(&mut self, config: &Self::Config) -> Result<(), ()> { 139 fn set_config(&mut self, config: &Self::Config) -> Result<(), Self::ConfigError> {
140 self.set_config(config).map_err(|_| ()) 140 self.set_config(config)
141 } 141 }
142} 142}
143 143
@@ -233,9 +233,6 @@ impl<'d, T: BasicInstance> BufferedUart<'d, T> {
233 configure(r, &config, T::frequency(), T::KIND, true, true)?; 233 configure(r, &config, T::frequency(), T::KIND, true, true)?;
234 234
235 r.cr1().modify(|w| { 235 r.cr1().modify(|w| {
236 #[cfg(lpuart_v2)]
237 w.set_fifoen(true);
238
239 w.set_rxneie(true); 236 w.set_rxneie(true);
240 w.set_idleie(true); 237 w.set_idleie(true);
241 }); 238 });
@@ -254,7 +251,14 @@ impl<'d, T: BasicInstance> BufferedUart<'d, T> {
254 } 251 }
255 252
256 pub fn set_config(&mut self, config: &Config) -> Result<(), ConfigError> { 253 pub fn set_config(&mut self, config: &Config) -> Result<(), ConfigError> {
257 reconfigure::<T>(config) 254 reconfigure::<T>(config)?;
255
256 T::regs().cr1().modify(|w| {
257 w.set_rxneie(true);
258 w.set_idleie(true);
259 });
260
261 Ok(())
258 } 262 }
259} 263}
260 264
@@ -334,7 +338,14 @@ impl<'d, T: BasicInstance> BufferedUartRx<'d, T> {
334 } 338 }
335 339
336 pub fn set_config(&mut self, config: &Config) -> Result<(), ConfigError> { 340 pub fn set_config(&mut self, config: &Config) -> Result<(), ConfigError> {
337 reconfigure::<T>(config) 341 reconfigure::<T>(config)?;
342
343 T::regs().cr1().modify(|w| {
344 w.set_rxneie(true);
345 w.set_idleie(true);
346 });
347
348 Ok(())
338 } 349 }
339} 350}
340 351
@@ -408,7 +419,14 @@ impl<'d, T: BasicInstance> BufferedUartTx<'d, T> {
408 } 419 }
409 420
410 pub fn set_config(&mut self, config: &Config) -> Result<(), ConfigError> { 421 pub fn set_config(&mut self, config: &Config) -> Result<(), ConfigError> {
411 reconfigure::<T>(config) 422 reconfigure::<T>(config)?;
423
424 T::regs().cr1().modify(|w| {
425 w.set_rxneie(true);
426 w.set_idleie(true);
427 });
428
429 Ok(())
412 } 430 }
413} 431}
414 432
diff --git a/embassy-stm32/src/usart/mod.rs b/embassy-stm32/src/usart/mod.rs
index 880ca4162..ea127e7f7 100644
--- a/embassy-stm32/src/usart/mod.rs
+++ b/embassy-stm32/src/usart/mod.rs
@@ -108,6 +108,7 @@ pub enum StopBits {
108pub enum ConfigError { 108pub enum ConfigError {
109 BaudrateTooLow, 109 BaudrateTooLow,
110 BaudrateTooHigh, 110 BaudrateTooHigh,
111 RxOrTxNotEnabled,
111} 112}
112 113
113#[non_exhaustive] 114#[non_exhaustive]
@@ -181,11 +182,11 @@ pub struct Uart<'d, T: BasicInstance, TxDma = NoDma, RxDma = NoDma> {
181 182
182impl<'d, T: BasicInstance, TxDma, RxDma> SetConfig for Uart<'d, T, TxDma, RxDma> { 183impl<'d, T: BasicInstance, TxDma, RxDma> SetConfig for Uart<'d, T, TxDma, RxDma> {
183 type Config = Config; 184 type Config = Config;
184 type ConfigError = (); 185 type ConfigError = ConfigError;
185 186
186 fn set_config(&mut self, config: &Self::Config) -> Result<(), ()> { 187 fn set_config(&mut self, config: &Self::Config) -> Result<(), Self::ConfigError> {
187 self.tx.set_config(config).map_err(|_| ())?; 188 self.tx.set_config(config)?;
188 self.rx.set_config(config).map_err(|_| ()) 189 self.rx.set_config(config)
189 } 190 }
190} 191}
191 192
@@ -196,10 +197,10 @@ pub struct UartTx<'d, T: BasicInstance, TxDma = NoDma> {
196 197
197impl<'d, T: BasicInstance, TxDma> SetConfig for UartTx<'d, T, TxDma> { 198impl<'d, T: BasicInstance, TxDma> SetConfig for UartTx<'d, T, TxDma> {
198 type Config = Config; 199 type Config = Config;
199 type ConfigError = (); 200 type ConfigError = ConfigError;
200 201
201 fn set_config(&mut self, config: &Self::Config) -> Result<(), ()> { 202 fn set_config(&mut self, config: &Self::Config) -> Result<(), Self::ConfigError> {
202 self.set_config(config).map_err(|_| ()) 203 self.set_config(config)
203 } 204 }
204} 205}
205 206
@@ -213,10 +214,10 @@ pub struct UartRx<'d, T: BasicInstance, RxDma = NoDma> {
213 214
214impl<'d, T: BasicInstance, RxDma> SetConfig for UartRx<'d, T, RxDma> { 215impl<'d, T: BasicInstance, RxDma> SetConfig for UartRx<'d, T, RxDma> {
215 type Config = Config; 216 type Config = Config;
216 type ConfigError = (); 217 type ConfigError = ConfigError;
217 218
218 fn set_config(&mut self, config: &Self::Config) -> Result<(), ()> { 219 fn set_config(&mut self, config: &Self::Config) -> Result<(), Self::ConfigError> {
219 self.set_config(config).map_err(|_| ()) 220 self.set_config(config)
220 } 221 }
221} 222}
222 223
@@ -866,7 +867,7 @@ fn configure(
866 enable_tx: bool, 867 enable_tx: bool,
867) -> Result<(), ConfigError> { 868) -> Result<(), ConfigError> {
868 if !enable_rx && !enable_tx { 869 if !enable_rx && !enable_tx {
869 panic!("USART: At least one of RX or TX should be enabled"); 870 return Err(ConfigError::RxOrTxNotEnabled);
870 } 871 }
871 872
872 #[cfg(not(usart_v4))] 873 #[cfg(not(usart_v4))]
@@ -909,6 +910,11 @@ fn configure(
909 brr + rounding 910 brr + rounding
910 } 911 }
911 912
913 // UART must be disabled during configuration.
914 r.cr1().modify(|w| {
915 w.set_ue(false);
916 });
917
912 #[cfg(not(usart_v1))] 918 #[cfg(not(usart_v1))]
913 let mut over8 = false; 919 let mut over8 = false;
914 let mut found_brr = None; 920 let mut found_brr = None;
@@ -968,6 +974,12 @@ fn configure(
968 #[cfg(any(usart_v3, usart_v4))] 974 #[cfg(any(usart_v3, usart_v4))]
969 w.set_swap(config.swap_rx_tx); 975 w.set_swap(config.swap_rx_tx);
970 }); 976 });
977
978 #[cfg(not(usart_v1))]
979 r.cr3().modify(|w| {
980 w.set_onebit(config.assume_noise_free);
981 });
982
971 r.cr1().write(|w| { 983 r.cr1().write(|w| {
972 // enable uart 984 // enable uart
973 w.set_ue(true); 985 w.set_ue(true);
@@ -976,6 +988,7 @@ fn configure(
976 // enable receiver 988 // enable receiver
977 w.set_re(enable_rx); 989 w.set_re(enable_rx);
978 // configure word size 990 // configure word size
991 // if using odd or even parity it must be configured to 9bits
979 w.set_m0(if config.parity != Parity::ParityNone { 992 w.set_m0(if config.parity != Parity::ParityNone {
980 vals::M0::BIT9 993 vals::M0::BIT9
981 } else { 994 } else {
@@ -994,11 +1007,6 @@ fn configure(
994 w.set_fifoen(true); 1007 w.set_fifoen(true);
995 }); 1008 });
996 1009
997 #[cfg(not(usart_v1))]
998 r.cr3().modify(|w| {
999 w.set_onebit(config.assume_noise_free);
1000 });
1001
1002 Ok(()) 1010 Ok(())
1003} 1011}
1004 1012
diff --git a/embassy-stm32/src/usart/ringbuffered.rs b/embassy-stm32/src/usart/ringbuffered.rs
index 55489f2e0..eceabbe9a 100644
--- a/embassy-stm32/src/usart/ringbuffered.rs
+++ b/embassy-stm32/src/usart/ringbuffered.rs
@@ -18,10 +18,10 @@ pub struct RingBufferedUartRx<'d, T: BasicInstance, RxDma: super::RxDma<T>> {
18 18
19impl<'d, T: BasicInstance, RxDma: super::RxDma<T>> SetConfig for RingBufferedUartRx<'d, T, RxDma> { 19impl<'d, T: BasicInstance, RxDma: super::RxDma<T>> SetConfig for RingBufferedUartRx<'d, T, RxDma> {
20 type Config = Config; 20 type Config = Config;
21 type ConfigError = (); 21 type ConfigError = ConfigError;
22 22
23 fn set_config(&mut self, config: &Self::Config) -> Result<(), ()> { 23 fn set_config(&mut self, config: &Self::Config) -> Result<(), Self::ConfigError> {
24 self.set_config(config).map_err(|_| ()) 24 self.set_config(config)
25 } 25 }
26} 26}
27 27