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. *