From ba5201c44f1adf7769d18017db5a3d40b0bd9bce Mon Sep 17 00:00:00 2001 From: Gerzain Mata Date: Tue, 12 Aug 2025 19:00:38 -0700 Subject: Added VREFBUF-TRIM manual write. Known errata --- embassy-stm32/src/vrefbuf/mod.rs | 30 +++++++++++++++++++++++++++++- 1 file changed, 29 insertions(+), 1 deletion(-) diff --git a/embassy-stm32/src/vrefbuf/mod.rs b/embassy-stm32/src/vrefbuf/mod.rs index f614fcf99..5c7dbfa50 100644 --- a/embassy-stm32/src/vrefbuf/mod.rs +++ b/embassy-stm32/src/vrefbuf/mod.rs @@ -1,5 +1,4 @@ //! Voltage Reference Buffer (VREFBUF) -// use core::ptr::{read_volatile, write_volatile}; use core::marker::PhantomData; use embassy_hal_internal::PeripheralType; @@ -12,6 +11,26 @@ pub struct VoltageReferenceBuffer<'d, T: Instance> { vrefbuf: PhantomData<&'d mut T>, } +#[cfg(rcc_wba)] +#[repr(usize)] +enum VRefBufTrim { + VRefBuf3Trim = 0x0BFA_07A8, + VRefBuf2Trim = 0x0BFA_07A9, + VRefBuf1Trim = 0x0BFA_07AA, + VRefBuf0Trim = 0x0BFA_07AB, +} + +#[cfg(rcc_wba)] +fn get_refbuf_trim(voltage_scale: Vrs) -> VRefBufTrim { + match voltage_scale { + Vrs::VREF0 => VRefBufTrim::VRefBuf0Trim, + Vrs::VREF1 => VRefBufTrim::VRefBuf1Trim, + Vrs::VREF2 => VRefBufTrim::VRefBuf2Trim, + Vrs::VREF3 => VRefBufTrim::VRefBuf3Trim, + _ => panic!("Incorrect Vrs setting!"), + } +} + impl<'d, T: Instance> VoltageReferenceBuffer<'d, T> { /// Creates an VREFBUF (Voltage Reference) instance with a voltage scale and impedance mode. /// @@ -21,6 +40,15 @@ impl<'d, T: Instance> VoltageReferenceBuffer<'d, T> { { use crate::pac::RCC; RCC.apb7enr().modify(|w| w.set_vrefen(true)); + // This is an errata for WBA6 devices. VREFBUF_TRIM value isn't set correctly + // [Link explaining it](https://www.st.com/resource/en/errata_sheet/es0644-stm32wba6xxx-device-errata-stmicroelectronics.pdf) + unsafe { + use crate::pac::VREFBUF; + let addr = get_refbuf_trim(voltage_scale) as usize; + let buf_trim_ptr = core::ptr::with_exposed_provenance::(addr); + let trim_val = core::ptr::read_volatile(buf_trim_ptr); + VREFBUF.ccr().write(|w| w.set_trim((trim_val & 0xFF) as u8)); + } } #[cfg(any(rcc_u5, rcc_h50, rcc_h5))] { -- cgit From 2a43e68cc342cdd7335140219704cb3513847bb6 Mon Sep 17 00:00:00 2001 From: Gerzain Mata Date: Wed, 13 Aug 2025 14:17:02 -0700 Subject: Removed uneeded enum --- embassy-stm32/src/vrefbuf/mod.rs | 23 +++++++---------------- 1 file changed, 7 insertions(+), 16 deletions(-) diff --git a/embassy-stm32/src/vrefbuf/mod.rs b/embassy-stm32/src/vrefbuf/mod.rs index 5c7dbfa50..54b4f8903 100644 --- a/embassy-stm32/src/vrefbuf/mod.rs +++ b/embassy-stm32/src/vrefbuf/mod.rs @@ -12,21 +12,12 @@ pub struct VoltageReferenceBuffer<'d, T: Instance> { } #[cfg(rcc_wba)] -#[repr(usize)] -enum VRefBufTrim { - VRefBuf3Trim = 0x0BFA_07A8, - VRefBuf2Trim = 0x0BFA_07A9, - VRefBuf1Trim = 0x0BFA_07AA, - VRefBuf0Trim = 0x0BFA_07AB, -} - -#[cfg(rcc_wba)] -fn get_refbuf_trim(voltage_scale: Vrs) -> VRefBufTrim { +fn get_refbuf_trim(voltage_scale: Vrs) -> usize { match voltage_scale { - Vrs::VREF0 => VRefBufTrim::VRefBuf0Trim, - Vrs::VREF1 => VRefBufTrim::VRefBuf1Trim, - Vrs::VREF2 => VRefBufTrim::VRefBuf2Trim, - Vrs::VREF3 => VRefBufTrim::VRefBuf3Trim, + Vrs::VREF0 => 0x0BFA_07A8usize, + Vrs::VREF1 => 0x0BFA_07A9usize, + Vrs::VREF2 => 0x0BFA_07AAusize, + Vrs::VREF3 => 0x0BFA_07ABusize, _ => panic!("Incorrect Vrs setting!"), } } @@ -44,10 +35,10 @@ impl<'d, T: Instance> VoltageReferenceBuffer<'d, T> { // [Link explaining it](https://www.st.com/resource/en/errata_sheet/es0644-stm32wba6xxx-device-errata-stmicroelectronics.pdf) unsafe { use crate::pac::VREFBUF; - let addr = get_refbuf_trim(voltage_scale) as usize; + let addr = get_refbuf_trim(voltage_scale); let buf_trim_ptr = core::ptr::with_exposed_provenance::(addr); let trim_val = core::ptr::read_volatile(buf_trim_ptr); - VREFBUF.ccr().write(|w| w.set_trim((trim_val & 0xFF) as u8)); + VREFBUF.ccr().write(|w| w.set_trim((trim_val & 0x3F) as u8)); } } #[cfg(any(rcc_u5, rcc_h50, rcc_h5))] -- cgit