Ring buffered UART not working reliably on STM32 U575
Author: nathanaelgCreated Sep 17, 2026Updated Sep 17, 2026
I recently updated embassy to https://github.com/embassy-rs/embassy/commit/822a76ea91f2c0885c6eb0c65fe91181e31133e1 and started seeing regular failures with UARTs (I think getting overruns in the rx?). I bisected the regression to https://github.com/embassy-rs/embassy/pull/6707/changes/6fa87cc1b53ef148142c69fe853ba2532eb70d18
My device is a STM32U575RI
let mut config = Config::default();
{
use embassy_stm32::rcc::*;
config.rcc.hse = Some(Hse {
freq: Hertz::mhz(40),
mode: HseMode::Oscillator,
});
config.rcc.pll1 = Some(Pll {
source: PllSource::Hse,
prediv: PllPreDiv::Div5,
mul: PllMul::Mul60,
divp: None,
divq: Some(PllDiv::Div6),
divr: Some(PllDiv::Div3),
});
config.rcc.pll2 = Some(Pll {
source: PllSource::Hse,
prediv: PllPreDiv::Div5,
mul: PllMul::Mul48,
divp: None,
divq: Some(PllDiv::Div8),
divr: None,
});
config.rcc.sys = Sysclk::Pll1R;
config.rcc.mux.fdcan1sel = mux::Fdcansel::Pll1Q;
config.rcc.mux.iclksel = mux::Iclksel::Pll2Q;
}
let p = embassy_stm32::init(config);
let mut usart_config = embassy_stm32::usart::Config::default();
usart_config.baudrate = 19200;
let usart2 = usart::Uart::new(
p.USART2,
p.PA3,
p.PA2,
p.GPDMA1_CH1,
p.GPDMA1_CH2,
Usart2Irqs,
usart_config,
).unwrap();
let uart4 = usart::Uart::new(
p.UART4,
p.PA1,
p.PA0,
p.GPDMA1_CH3,
p.GPDMA1_CH4,
Uart4Irqs,
usart_config,
).unwrap();
let (tx2, rx2) = usart2.split();
let (tx4, rx4) = uart4.split();
const BUFFER_SIZE: usize = 32;
let rx2_buf: &mut [u8; BUFFER_SIZE] =
singleton!(UART_RX2_BUF: [u8; BUFFER_SIZE] = [0; BUFFER_SIZE]).unwrap();
let rx2_buffered = rx2.into_ring_buffered(rx2_buf);
let rx4_buf: &mut [u8; BUFFER_SIZE] =
singleton!(UART_RX4_BUF: [u8; BUFFER_SIZE] = [0; BUFFER_SIZE]).unwrap();
let rx4_buffered = rx4.into_ring_buffered(rx4_buf);Any ideas or things to look into?
Source: embassy-rs/embassy