diff options
| author | Dario Nieuwenhuis <[email protected]> | 2023-10-24 13:13:42 +0000 |
|---|---|---|
| committer | GitHub <[email protected]> | 2023-10-24 13:13:42 +0000 |
| commit | b3879ec22346ac38a409512e147fe8f7137f858a (patch) | |
| tree | da0ca5acb4bcff1ad89123f65701a3baeea94afb | |
| parent | 1a51a843130fbc325dafbbba5004847462089ff3 (diff) | |
| parent | bda99e59ec0f2d31e4f29b8d03fbd44d8e917fdd (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.rs | 48 | ||||
| -rw-r--r-- | embassy-stm32/src/usart/mod.rs | 40 | ||||
| -rw-r--r-- | embassy-stm32/src/usart/ringbuffered.rs | 6 |
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 | ||
| 117 | impl<'d, T: BasicInstance> SetConfig for BufferedUart<'d, T> { | 117 | impl<'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 | ||
| 126 | impl<'d, T: BasicInstance> SetConfig for BufferedUartRx<'d, T> { | 126 | impl<'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 | ||
| 135 | impl<'d, T: BasicInstance> SetConfig for BufferedUartTx<'d, T> { | 135 | impl<'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 { | |||
| 108 | pub enum ConfigError { | 108 | pub 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 | ||
| 182 | impl<'d, T: BasicInstance, TxDma, RxDma> SetConfig for Uart<'d, T, TxDma, RxDma> { | 183 | impl<'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 | ||
| 197 | impl<'d, T: BasicInstance, TxDma> SetConfig for UartTx<'d, T, TxDma> { | 198 | impl<'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 | ||
| 214 | impl<'d, T: BasicInstance, RxDma> SetConfig for UartRx<'d, T, RxDma> { | 215 | impl<'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 | ||
| 19 | impl<'d, T: BasicInstance, RxDma: super::RxDma<T>> SetConfig for RingBufferedUartRx<'d, T, RxDma> { | 19 | impl<'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 | ||
