Browse Source

Adding some useful functions for wakeup timer interrupts

pull/107/head
Michael Aherne 12 years ago
parent
commit
dd75633245
  1. 2
      include/libopencm3/stm32/common/rtc_common_bcd.h
  2. 31
      lib/stm32/common/rtc_common_bcd.c

2
include/libopencm3/stm32/common/rtc_common_bcd.h

@ -305,6 +305,8 @@ void rtc_set_prescaler(u32 sync, u32 async);
void rtc_wait_for_synchro(void);
void rtc_lock(void);
void rtc_unlock(void);
void rtc_set_wakeup_time(u16 wkup_time, u8 rtc_cr_wucksel);
void rtc_clear_wakeup_flag(void);
END_DECLS
/**@}*/

31
lib/stm32/common/rtc_common_bcd.c

@ -75,4 +75,35 @@ void rtc_lock(void) {
RTC_WPR = 0xff;
}
/*---------------------------------------------------------------------------*/
/** @brief Sets the wakeup time auto-reload value
*/
void rtc_set_wakeup_time(u16 wkup_time, u8 rtc_cr_wucksel) {
// FTFM:
// The following sequence is required to configure or change the wakeup timer
// auto-reload value (WUT[15:0] in RTC_WUTR):
// 1. Clear WUTE in RTC_CR to disable the wakeup timer.
RTC_CR &= ~RTC_CR_WUTE;
// 2. Poll WUTWF until it is set in RTC_ISR to make sure the access to wakeup
// auto-reload counter and to WUCKSEL[2:0] bits is allowed. It takes around 2
// RTCCLK clock cycles (due to clock synchronization).
while (!((RTC_ISR) & (RTC_ISR_WUTWF))) { }
// 3. Program the wakeup auto-reload value WUT[15:0], and the wakeup clock
// selection (WUCKSEL[2:0] bits in RTC_CR).Set WUTE in RTC_CR to enable the
// timer again. The wakeup timer restarts down-counting.
RTC_WUTR = wkup_time;
RTC_CR |= (rtc_cr_wucksel << RTC_CR_WUCLKSEL_SHIFT);
RTC_CR |= RTC_CR_WUTE;
}
/*---------------------------------------------------------------------------*/
/** @brief Clears the wakeup flag
@details This function should be called first in the rtc_wkup_isr()
*/
void rtc_clear_wakeup_flag(void) {
RTC_ISR &= ~RTC_ISR_WUTF;
}
/**@}*/

Loading…
Cancel
Save