diff --git a/include/libopencm3/stm32/common/rcc_common_all.h b/include/libopencm3/stm32/common/rcc_common_all.h index 7a9fa520..c610be8e 100644 --- a/include/libopencm3/stm32/common/rcc_common_all.h +++ b/include/libopencm3/stm32/common/rcc_common_all.h @@ -51,6 +51,13 @@ void rcc_periph_reset_release(enum rcc_periph_rst rst); void rcc_set_mco(uint32_t mcosrc); +/** + * Is the given oscillator ready? + * @param osc Oscillator ID + * @return true if the hardware indicates the oscillator is ready. + */ +bool rcc_is_osc_ready(enum rcc_osc osc); + /** * Wait for Oscillator Ready. * Block until the hardware indicates that the Oscillator is ready. diff --git a/include/libopencm3/stm32/l4/rcc.h b/include/libopencm3/stm32/l4/rcc.h index c191fde7..567e1037 100644 --- a/include/libopencm3/stm32/l4/rcc.h +++ b/include/libopencm3/stm32/l4/rcc.h @@ -930,7 +930,6 @@ void rcc_osc_ready_int_disable(enum rcc_osc osc); int rcc_osc_ready_int_flag(enum rcc_osc osc); void rcc_css_int_clear(void); int rcc_css_int_flag(void); -bool rcc_is_osc_ready(enum rcc_osc osc); void rcc_wait_for_sysclk_status(enum rcc_osc osc); void rcc_osc_on(enum rcc_osc osc); void rcc_osc_off(enum rcc_osc osc); diff --git a/lib/stm32/f0/rcc.c b/lib/stm32/f0/rcc.c index f23fcc8b..432b0139 100644 --- a/lib/stm32/f0/rcc.c +++ b/lib/stm32/f0/rcc.c @@ -202,37 +202,30 @@ int rcc_css_int_flag(void) return ((RCC_CIR & RCC_CIR_CSSF) != 0); } -/*---------------------------------------------------------------------------*/ -/** @brief RCC Wait for Oscillator Ready. - * - * @param[in] osc enum ::osc_t. Oscillator ID - */ - -void rcc_wait_for_osc_ready(enum rcc_osc osc) +bool rcc_is_osc_ready(enum rcc_osc osc) { switch (osc) { case RCC_HSI48: - while ((RCC_CR2 & RCC_CR2_HSI48RDY) == 0); - break; + return (RCC_CR2 & RCC_CR2_HSI48RDY); case RCC_HSI14: - while ((RCC_CR2 & RCC_CR2_HSI14RDY) == 0); - break; + return (RCC_CR2 & RCC_CR2_HSI14RDY); case RCC_HSI: - while ((RCC_CR & RCC_CR_HSIRDY) == 0); - break; + return (RCC_CR & RCC_CR_HSIRDY); case RCC_HSE: - while ((RCC_CR & RCC_CR_HSERDY) == 0); - break; + return (RCC_CR & RCC_CR_HSERDY); case RCC_PLL: - while ((RCC_CR & RCC_CR_PLLRDY) == 0); - break; + return (RCC_CR & RCC_CR_PLLRDY); case RCC_LSE: - while ((RCC_BDCR & RCC_BDCR_LSERDY) == 0); - break; + return (RCC_BDCR & RCC_BDCR_LSERDY); case RCC_LSI: - while ((RCC_CSR & RCC_CSR_LSIRDY) == 0); - break; + return (RCC_CSR & RCC_CSR_LSIRDY); } + return false; +} + +void rcc_wait_for_osc_ready(enum rcc_osc osc) +{ + while (!rcc_is_osc_ready(osc)); } /*---------------------------------------------------------------------------*/ diff --git a/lib/stm32/f1/rcc.c b/lib/stm32/f1/rcc.c index d2158542..fd0d4fb6 100644 --- a/lib/stm32/f1/rcc.c +++ b/lib/stm32/f1/rcc.c @@ -217,37 +217,30 @@ int rcc_css_int_flag(void) return ((RCC_CIR & RCC_CIR_CSSF) != 0); } -/*---------------------------------------------------------------------------*/ -/** @brief RCC Wait for Oscillator Ready. - -@param[in] osc enum ::osc_t. Oscillator ID -*/ - -void rcc_wait_for_osc_ready(enum rcc_osc osc) +bool rcc_is_osc_ready(enum rcc_osc osc) { switch (osc) { case RCC_PLL: - while ((RCC_CR & RCC_CR_PLLRDY) == 0); - break; + return (RCC_CR & RCC_CR_PLLRDY); case RCC_PLL2: - while ((RCC_CR & RCC_CR_PLL2RDY) == 0); - break; + return (RCC_CR & RCC_CR_PLL2RDY); case RCC_PLL3: - while ((RCC_CR & RCC_CR_PLL3RDY) == 0); - break; + return (RCC_CR & RCC_CR_PLL3RDY); case RCC_HSE: - while ((RCC_CR & RCC_CR_HSERDY) == 0); - break; + return (RCC_CR & RCC_CR_HSERDY); case RCC_HSI: - while ((RCC_CR & RCC_CR_HSIRDY) == 0); - break; + return (RCC_CR & RCC_CR_HSIRDY); case RCC_LSE: - while ((RCC_BDCR & RCC_BDCR_LSERDY) == 0); - break; + return (RCC_BDCR & RCC_BDCR_LSERDY); case RCC_LSI: - while ((RCC_CSR & RCC_CSR_LSIRDY) == 0); - break; + return (RCC_CSR & RCC_CSR_LSIRDY); } + return false; +} + +void rcc_wait_for_osc_ready(enum rcc_osc osc) +{ + while (!rcc_is_osc_ready(osc)); } /*---------------------------------------------------------------------------*/ diff --git a/lib/stm32/f2/rcc.c b/lib/stm32/f2/rcc.c index 042fffed..76fe6a97 100644 --- a/lib/stm32/f2/rcc.c +++ b/lib/stm32/f2/rcc.c @@ -160,25 +160,26 @@ int rcc_css_int_flag(void) return ((RCC_CIR & RCC_CIR_CSSF) != 0); } -void rcc_wait_for_osc_ready(enum rcc_osc osc) +bool rcc_is_osc_ready(enum rcc_osc osc) { switch (osc) { case RCC_PLL: - while ((RCC_CR & RCC_CR_PLLRDY) == 0); - break; + return (RCC_CR & RCC_CR_PLLRDY); case RCC_HSE: - while ((RCC_CR & RCC_CR_HSERDY) == 0); - break; + return (RCC_CR & RCC_CR_HSERDY); case RCC_HSI: - while ((RCC_CR & RCC_CR_HSIRDY) == 0); - break; + return (RCC_CR & RCC_CR_HSIRDY); case RCC_LSE: - while ((RCC_BDCR & RCC_BDCR_LSERDY) == 0); - break; + return (RCC_BDCR & RCC_BDCR_LSERDY); case RCC_LSI: - while ((RCC_CSR & RCC_CSR_LSIRDY) == 0); - break; + return (RCC_CSR & RCC_CSR_LSIRDY); } + return false; +} + +void rcc_wait_for_osc_ready(enum rcc_osc osc) +{ + while (!rcc_is_osc_ready(osc)); } void rcc_wait_for_sysclk_status(enum rcc_osc osc) diff --git a/lib/stm32/f3/rcc.c b/lib/stm32/f3/rcc.c index 5ff6ad37..b9942123 100644 --- a/lib/stm32/f3/rcc.c +++ b/lib/stm32/f3/rcc.c @@ -176,47 +176,32 @@ int rcc_css_int_flag(void) return ((RCC_CIR & RCC_CIR_CSSF) != 0); } -void rcc_wait_for_osc_ready(enum rcc_osc osc) +bool rcc_is_osc_ready(enum rcc_osc osc) { switch (osc) { case RCC_PLL: - while ((RCC_CR & RCC_CR_PLLRDY) == 0); - break; + return (RCC_CR & RCC_CR_PLLRDY); case RCC_HSE: - while ((RCC_CR & RCC_CR_HSERDY) == 0); - break; + return (RCC_CR & RCC_CR_HSERDY); case RCC_HSI: - while ((RCC_CR & RCC_CR_HSIRDY) == 0); - break; + return (RCC_CR & RCC_CR_HSIRDY); case RCC_LSE: - while ((RCC_BDCR & RCC_BDCR_LSERDY) == 0); - break; + return (RCC_BDCR & RCC_BDCR_LSERDY); case RCC_LSI: - while ((RCC_CSR & RCC_CSR_LSIRDY) == 0); - break; + return (RCC_CSR & RCC_CSR_LSIRDY); } + return false; +} + +void rcc_wait_for_osc_ready(enum rcc_osc osc) +{ + while (!rcc_is_osc_ready(osc)); } void rcc_wait_for_osc_not_ready(enum rcc_osc osc) { - switch (osc) { - case RCC_PLL: - while ((RCC_CR & RCC_CR_PLLRDY) != 0); - break; - case RCC_HSE: - while ((RCC_CR & RCC_CR_HSERDY) != 0); - break; - case RCC_HSI: - while ((RCC_CR & RCC_CR_HSIRDY) != 0); - break; - case RCC_LSE: - while ((RCC_BDCR & RCC_BDCR_LSERDY) != 0); - break; - case RCC_LSI: - while ((RCC_CSR & RCC_CSR_LSIRDY) != 0); - break; - } + while (rcc_is_osc_ready(osc)); } void rcc_wait_for_sysclk_status(enum rcc_osc osc) diff --git a/lib/stm32/f4/rcc.c b/lib/stm32/f4/rcc.c index d6394d6d..6748e01f 100644 --- a/lib/stm32/f4/rcc.c +++ b/lib/stm32/f4/rcc.c @@ -405,31 +405,30 @@ int rcc_css_int_flag(void) return ((RCC_CIR & RCC_CIR_CSSF) != 0); } -void rcc_wait_for_osc_ready(enum rcc_osc osc) +bool rcc_is_osc_ready(enum rcc_osc osc) { switch (osc) { case RCC_PLL: - while ((RCC_CR & RCC_CR_PLLRDY) == 0); - break; + return (RCC_CR & RCC_CR_PLLRDY); case RCC_HSE: - while ((RCC_CR & RCC_CR_HSERDY) == 0); - break; + return (RCC_CR & RCC_CR_HSERDY); case RCC_HSI: - while ((RCC_CR & RCC_CR_HSIRDY) == 0); - break; + return (RCC_CR & RCC_CR_HSIRDY); case RCC_LSE: - while ((RCC_BDCR & RCC_BDCR_LSERDY) == 0); - break; + return (RCC_BDCR & RCC_BDCR_LSERDY); case RCC_LSI: - while ((RCC_CSR & RCC_CSR_LSIRDY) == 0); - break; + return (RCC_CSR & RCC_CSR_LSIRDY); case RCC_PLLSAI: - while ((RCC_CR & RCC_CR_PLLSAIRDY) == 0); - break; + return (RCC_CR & RCC_CR_PLLSAIRDY); case RCC_PLLI2S: - while ((RCC_CR & RCC_CR_PLLI2SRDY) == 0); - break; + return (RCC_CR & RCC_CR_PLLI2SRDY); } + return false; +} + +void rcc_wait_for_osc_ready(enum rcc_osc osc) +{ + while (!rcc_is_osc_ready(osc)); } void rcc_wait_for_sysclk_status(enum rcc_osc osc) diff --git a/lib/stm32/l0/rcc.c b/lib/stm32/l0/rcc.c index 47234048..a4446679 100644 --- a/lib/stm32/l0/rcc.c +++ b/lib/stm32/l0/rcc.c @@ -258,36 +258,30 @@ int rcc_osc_ready_int_flag(enum rcc_osc osc) } -/*---------------------------------------------------------------------------*/ -/** @brief RCC Wait for Oscillator Ready. - * - * @param[in] osc enum ::osc_t. Oscillator ID - */ -void rcc_wait_for_osc_ready(enum rcc_osc osc) +bool rcc_is_osc_ready(enum rcc_osc osc) { switch (osc) { case RCC_PLL: - while ((RCC_CR & RCC_CR_PLLRDY) == 0); - break; + return (RCC_CR & RCC_CR_PLLRDY); case RCC_HSE: - while ((RCC_CR & RCC_CR_HSERDY) == 0); - break; + return (RCC_CR & RCC_CR_HSERDY); case RCC_HSI16: - while ((RCC_CR & RCC_CR_HSI16RDY) == 0); - break; + return (RCC_CR & RCC_CR_HSI16RDY); case RCC_HSI48: - while ((RCC_CRRCR & RCC_CRRCR_HSI48RDY) == 0); - break; + return (RCC_CRRCR & RCC_CRRCR_HSI48RDY); case RCC_MSI: - while ((RCC_CR & RCC_CR_MSIRDY) == 0); - break; + return (RCC_CR & RCC_CR_MSIRDY); case RCC_LSE: - while ((RCC_CSR & RCC_CSR_LSERDY) == 0); - break; + return (RCC_CSR & RCC_CSR_LSERDY); case RCC_LSI: - while ((RCC_CSR & RCC_CSR_LSIRDY) == 0); - break; + return (RCC_CSR & RCC_CSR_LSIRDY); } + return false; +} + +void rcc_wait_for_osc_ready(enum rcc_osc osc) +{ + while (!rcc_is_osc_ready(osc)); } /*---------------------------------------------------------------------------*/ diff --git a/lib/stm32/l1/rcc.c b/lib/stm32/l1/rcc.c index b9f34527..deb54908 100644 --- a/lib/stm32/l1/rcc.c +++ b/lib/stm32/l1/rcc.c @@ -228,28 +228,28 @@ int rcc_css_int_flag(void) return ((RCC_CIR & RCC_CIR_CSSF) != 0); } -void rcc_wait_for_osc_ready(enum rcc_osc osc) +bool rcc_is_osc_ready(enum rcc_osc osc) { switch (osc) { case RCC_PLL: - while ((RCC_CR & RCC_CR_PLLRDY) == 0); - break; + return (RCC_CR & RCC_CR_PLLRDY); case RCC_HSE: - while ((RCC_CR & RCC_CR_HSERDY) == 0); - break; + return (RCC_CR & RCC_CR_HSERDY); case RCC_HSI: - while ((RCC_CR & RCC_CR_HSIRDY) == 0); - break; + return (RCC_CR & RCC_CR_HSIRDY); case RCC_MSI: - while ((RCC_CR & RCC_CR_MSIRDY) == 0); - break; + return (RCC_CR & RCC_CR_MSIRDY); case RCC_LSE: - while ((RCC_CSR & RCC_CSR_LSERDY) == 0); - break; + return (RCC_CSR & RCC_CSR_LSERDY); case RCC_LSI: - while ((RCC_CSR & RCC_CSR_LSIRDY) == 0); - break; + return (RCC_CSR & RCC_CSR_LSIRDY); } + return false; +} + +void rcc_wait_for_osc_ready(enum rcc_osc osc) +{ + while (!rcc_is_osc_ready(osc)); } void rcc_wait_for_sysclk_status(enum rcc_osc osc)