Merge pull request #2105 from andresv/fix-stm32-uart-set-config

Fix stm32 uart set_config
This commit is contained in:
Dario Nieuwenhuis 2023-10-24 13:13:42 +00:00 committed by GitHub
commit b3879ec223
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 60 additions and 34 deletions

View File

@ -116,28 +116,28 @@ pub struct BufferedUartRx<'d, T: BasicInstance> {
impl<'d, T: BasicInstance> SetConfig for BufferedUart<'d, T> { impl<'d, T: BasicInstance> SetConfig for BufferedUart<'d, T> {
type Config = Config; type Config = Config;
type ConfigError = (); type ConfigError = ConfigError;
fn set_config(&mut self, config: &Self::Config) -> Result<(), ()> { fn set_config(&mut self, config: &Self::Config) -> Result<(), Self::ConfigError> {
self.set_config(config).map_err(|_| ()) self.set_config(config)
} }
} }
impl<'d, T: BasicInstance> SetConfig for BufferedUartRx<'d, T> { impl<'d, T: BasicInstance> SetConfig for BufferedUartRx<'d, T> {
type Config = Config; type Config = Config;
type ConfigError = (); type ConfigError = ConfigError;
fn set_config(&mut self, config: &Self::Config) -> Result<(), ()> { fn set_config(&mut self, config: &Self::Config) -> Result<(), Self::ConfigError> {
self.set_config(config).map_err(|_| ()) self.set_config(config)
} }
} }
impl<'d, T: BasicInstance> SetConfig for BufferedUartTx<'d, T> { impl<'d, T: BasicInstance> SetConfig for BufferedUartTx<'d, T> {
type Config = Config; type Config = Config;
type ConfigError = (); type ConfigError = ConfigError;
fn set_config(&mut self, config: &Self::Config) -> Result<(), ()> { fn set_config(&mut self, config: &Self::Config) -> Result<(), Self::ConfigError> {
self.set_config(config).map_err(|_| ()) self.set_config(config)
} }
} }
@ -233,9 +233,6 @@ impl<'d, T: BasicInstance> BufferedUart<'d, T> {
configure(r, &config, T::frequency(), T::KIND, true, true)?; configure(r, &config, T::frequency(), T::KIND, true, true)?;
r.cr1().modify(|w| { r.cr1().modify(|w| {
#[cfg(lpuart_v2)]
w.set_fifoen(true);
w.set_rxneie(true); w.set_rxneie(true);
w.set_idleie(true); w.set_idleie(true);
}); });
@ -254,7 +251,14 @@ impl<'d, T: BasicInstance> BufferedUart<'d, T> {
} }
pub fn set_config(&mut self, config: &Config) -> Result<(), ConfigError> { pub fn set_config(&mut self, config: &Config) -> Result<(), ConfigError> {
reconfigure::<T>(config) reconfigure::<T>(config)?;
T::regs().cr1().modify(|w| {
w.set_rxneie(true);
w.set_idleie(true);
});
Ok(())
} }
} }
@ -334,7 +338,14 @@ impl<'d, T: BasicInstance> BufferedUartRx<'d, T> {
} }
pub fn set_config(&mut self, config: &Config) -> Result<(), ConfigError> { pub fn set_config(&mut self, config: &Config) -> Result<(), ConfigError> {
reconfigure::<T>(config) reconfigure::<T>(config)?;
T::regs().cr1().modify(|w| {
w.set_rxneie(true);
w.set_idleie(true);
});
Ok(())
} }
} }
@ -408,7 +419,14 @@ impl<'d, T: BasicInstance> BufferedUartTx<'d, T> {
} }
pub fn set_config(&mut self, config: &Config) -> Result<(), ConfigError> { pub fn set_config(&mut self, config: &Config) -> Result<(), ConfigError> {
reconfigure::<T>(config) reconfigure::<T>(config)?;
T::regs().cr1().modify(|w| {
w.set_rxneie(true);
w.set_idleie(true);
});
Ok(())
} }
} }

View File

@ -108,6 +108,7 @@ pub enum StopBits {
pub enum ConfigError { pub enum ConfigError {
BaudrateTooLow, BaudrateTooLow,
BaudrateTooHigh, BaudrateTooHigh,
RxOrTxNotEnabled,
} }
#[non_exhaustive] #[non_exhaustive]
@ -181,11 +182,11 @@ pub struct Uart<'d, T: BasicInstance, TxDma = NoDma, RxDma = NoDma> {
impl<'d, T: BasicInstance, TxDma, RxDma> SetConfig for Uart<'d, T, TxDma, RxDma> { impl<'d, T: BasicInstance, TxDma, RxDma> SetConfig for Uart<'d, T, TxDma, RxDma> {
type Config = Config; type Config = Config;
type ConfigError = (); type ConfigError = ConfigError;
fn set_config(&mut self, config: &Self::Config) -> Result<(), ()> { fn set_config(&mut self, config: &Self::Config) -> Result<(), Self::ConfigError> {
self.tx.set_config(config).map_err(|_| ())?; self.tx.set_config(config)?;
self.rx.set_config(config).map_err(|_| ()) self.rx.set_config(config)
} }
} }
@ -196,10 +197,10 @@ pub struct UartTx<'d, T: BasicInstance, TxDma = NoDma> {
impl<'d, T: BasicInstance, TxDma> SetConfig for UartTx<'d, T, TxDma> { impl<'d, T: BasicInstance, TxDma> SetConfig for UartTx<'d, T, TxDma> {
type Config = Config; type Config = Config;
type ConfigError = (); type ConfigError = ConfigError;
fn set_config(&mut self, config: &Self::Config) -> Result<(), ()> { fn set_config(&mut self, config: &Self::Config) -> Result<(), Self::ConfigError> {
self.set_config(config).map_err(|_| ()) self.set_config(config)
} }
} }
@ -213,10 +214,10 @@ pub struct UartRx<'d, T: BasicInstance, RxDma = NoDma> {
impl<'d, T: BasicInstance, RxDma> SetConfig for UartRx<'d, T, RxDma> { impl<'d, T: BasicInstance, RxDma> SetConfig for UartRx<'d, T, RxDma> {
type Config = Config; type Config = Config;
type ConfigError = (); type ConfigError = ConfigError;
fn set_config(&mut self, config: &Self::Config) -> Result<(), ()> { fn set_config(&mut self, config: &Self::Config) -> Result<(), Self::ConfigError> {
self.set_config(config).map_err(|_| ()) self.set_config(config)
} }
} }
@ -866,7 +867,7 @@ fn configure(
enable_tx: bool, enable_tx: bool,
) -> Result<(), ConfigError> { ) -> Result<(), ConfigError> {
if !enable_rx && !enable_tx { if !enable_rx && !enable_tx {
panic!("USART: At least one of RX or TX should be enabled"); return Err(ConfigError::RxOrTxNotEnabled);
} }
#[cfg(not(usart_v4))] #[cfg(not(usart_v4))]
@ -909,6 +910,11 @@ fn configure(
brr + rounding brr + rounding
} }
// UART must be disabled during configuration.
r.cr1().modify(|w| {
w.set_ue(false);
});
#[cfg(not(usart_v1))] #[cfg(not(usart_v1))]
let mut over8 = false; let mut over8 = false;
let mut found_brr = None; let mut found_brr = None;
@ -968,6 +974,12 @@ fn configure(
#[cfg(any(usart_v3, usart_v4))] #[cfg(any(usart_v3, usart_v4))]
w.set_swap(config.swap_rx_tx); w.set_swap(config.swap_rx_tx);
}); });
#[cfg(not(usart_v1))]
r.cr3().modify(|w| {
w.set_onebit(config.assume_noise_free);
});
r.cr1().write(|w| { r.cr1().write(|w| {
// enable uart // enable uart
w.set_ue(true); w.set_ue(true);
@ -976,6 +988,7 @@ fn configure(
// enable receiver // enable receiver
w.set_re(enable_rx); w.set_re(enable_rx);
// configure word size // configure word size
// if using odd or even parity it must be configured to 9bits
w.set_m0(if config.parity != Parity::ParityNone { w.set_m0(if config.parity != Parity::ParityNone {
vals::M0::BIT9 vals::M0::BIT9
} else { } else {
@ -994,11 +1007,6 @@ fn configure(
w.set_fifoen(true); w.set_fifoen(true);
}); });
#[cfg(not(usart_v1))]
r.cr3().modify(|w| {
w.set_onebit(config.assume_noise_free);
});
Ok(()) Ok(())
} }

View File

@ -18,10 +18,10 @@ pub struct RingBufferedUartRx<'d, T: BasicInstance, RxDma: super::RxDma<T>> {
impl<'d, T: BasicInstance, RxDma: super::RxDma<T>> SetConfig for RingBufferedUartRx<'d, T, RxDma> { impl<'d, T: BasicInstance, RxDma: super::RxDma<T>> SetConfig for RingBufferedUartRx<'d, T, RxDma> {
type Config = Config; type Config = Config;
type ConfigError = (); type ConfigError = ConfigError;
fn set_config(&mut self, config: &Self::Config) -> Result<(), ()> { fn set_config(&mut self, config: &Self::Config) -> Result<(), Self::ConfigError> {
self.set_config(config).map_err(|_| ()) self.set_config(config)
} }
} }