#7019·embassy

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

rust
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?