From 43736cf03fcc90536c0eec7d448a1c962a2805d1 Mon Sep 17 00:00:00 2001 From: Sergey Matyukevich Date: Mon, 2 Jan 2017 23:32:24 +0300 Subject: [PATCH] stm32/f0: RTC clock helpers Add three more RTC clock helper functions: - rcc_set_rtc_clock_source RTC on stm32/f0 can be clocked from the following three sources: LSI, LSE (32.768Hz), HSE/32. - rcc_enable_rtc_clock - rcc_disable_rtc_clock enable/disable clocking RTC module using selected clock source Signed-off-by: Sergey Matyukevich --- include/libopencm3/stm32/f0/rcc.h | 3 +++ lib/stm32/f0/rcc.c | 44 +++++++++++++++++++++++++++++++ 2 files changed, 47 insertions(+) diff --git a/include/libopencm3/stm32/f0/rcc.h b/include/libopencm3/stm32/f0/rcc.h index 6d502e8b..5a614e01 100644 --- a/include/libopencm3/stm32/f0/rcc.h +++ b/include/libopencm3/stm32/f0/rcc.h @@ -509,6 +509,9 @@ void rcc_css_int_clear(void); int rcc_css_int_flag(void); void rcc_set_sysclk_source(enum rcc_osc clk); void rcc_set_usbclk_source(enum rcc_osc clk); +void rcc_set_rtc_clock_source(enum rcc_osc clk); +void rcc_enable_rtc_clock(void); +void rcc_disable_rtc_clock(void); void rcc_set_pll_multiplication_factor(uint32_t mul); void rcc_set_ppre(uint32_t ppre); void rcc_set_hpre(uint32_t hpre); diff --git a/lib/stm32/f0/rcc.c b/lib/stm32/f0/rcc.c index 97e16e8b..7c82e995 100644 --- a/lib/stm32/f0/rcc.c +++ b/lib/stm32/f0/rcc.c @@ -438,6 +438,50 @@ void rcc_set_usbclk_source(enum rcc_osc clk) } } +/*---------------------------------------------------------------------------*/ +/** @brief RCC Enable the RTC clock + +*/ + +void rcc_enable_rtc_clock(void) +{ + RCC_BDCR |= RCC_BDCR_RTCEN; +} + +/*---------------------------------------------------------------------------*/ +/** @brief RCC Disable the RTC clock + +*/ + +void rcc_disable_rtc_clock(void) +{ + RCC_BDCR &= ~RCC_BDCR_RTCEN; +} + +/*---------------------------------------------------------------------------*/ +/** @brief RCC Set the Source for the RTC clock + +@param[in] clock_source ::rcc_osc. RTC clock source. Only HSE/32, LSE and LSI. +*/ + +void rcc_set_rtc_clock_source(enum rcc_osc clk) +{ + switch (clk) { + case RCC_HSE: + RCC_BDCR = (RCC_BDCR & ~RCC_BDCR_RTCSEL) | RCC_BDCR_RTCSEL_HSE; + break; + case RCC_LSE: + RCC_BDCR = (RCC_BDCR & ~RCC_BDCR_RTCSEL) | RCC_BDCR_RTCSEL_LSE; + break; + case RCC_LSI: + RCC_BDCR = (RCC_BDCR & ~RCC_BDCR_RTCSEL) | RCC_BDCR_RTCSEL_LSI; + break; + default: + /* do nothing */ + break; + } +} + /*---------------------------------------------------------------------------*/ /** @brief RCC Set the PLL Multiplication Factor. *