From 08aac020adb55e9f28eaf14a9b791b3a2d20c0a3 Mon Sep 17 00:00:00 2001 From: Karl Palsson Date: Tue, 16 Aug 2016 17:57:57 +0000 Subject: [PATCH] stm32: rcc: provide async routines for osc checks Start providing async routines for all blocking routines, to make it easier to use libopencm3 in some RTOS environments. This is not in anyway intended to be complete, this just covers a single blocking routine, rcc_wait_for_osc_ready. Documentation added to the top level, and provided for all stm32 families. --- .../libopencm3/stm32/common/rcc_common_all.h | 7 ++++ include/libopencm3/stm32/l4/rcc.h | 1 - lib/stm32/f0/rcc.c | 35 +++++++--------- lib/stm32/f1/rcc.c | 35 +++++++--------- lib/stm32/f2/rcc.c | 23 ++++++----- lib/stm32/f3/rcc.c | 41 ++++++------------- lib/stm32/f4/rcc.c | 29 +++++++------ lib/stm32/l0/rcc.c | 34 +++++++-------- lib/stm32/l1/rcc.c | 26 ++++++------ 9 files changed, 101 insertions(+), 130 deletions(-) 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)