RTC. Error fixes and robustness improvements.
git-svn-id: svn://svn.code.sf.net/p/chibios/svn/trunk@3806 35acf78f-673a-0410-8e92-d51de3d6d3f4master
parent
03ab002971
commit
a2672b8dbb
|
@ -60,37 +60,32 @@ RTCDriver RTCD1;
|
||||||
*
|
*
|
||||||
* @notapi
|
* @notapi
|
||||||
*/
|
*/
|
||||||
static void rtc_lld_apb1_sync(void) {
|
#define rtc_lld_apb1_sync() {while ((RTC->CRL & RTC_CRL_RSF) == 0);}
|
||||||
|
|
||||||
while ((RTC->CRL & RTC_CRL_RSF) == 0)
|
/**
|
||||||
;
|
* @brief Wait for for previous write operation complete.
|
||||||
}
|
* @details This function must be invoked before writing to any RTC registers
|
||||||
|
*
|
||||||
|
* @notapi
|
||||||
|
*/
|
||||||
|
#define rtc_lld_wait_write() {while ((RTC->CRL & RTC_CRL_RTOFF) == 0);}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Acquires write access to RTC registers.
|
* @brief Acquires write access to RTC registers.
|
||||||
* @details Before writing to the backup domain RTC registers the previous
|
* @details Before writing to the backup domain RTC registers the previous
|
||||||
* write operation must be completed. Use this function before
|
* write operation must be completed. Use this function before
|
||||||
* writing to PRL, CNT, ALR registers. CR registers can always
|
* writing to PRL, CNT, ALR registers.
|
||||||
* be written.
|
|
||||||
*
|
*
|
||||||
* @notapi
|
* @notapi
|
||||||
*/
|
*/
|
||||||
static void rtc_lld_acquire(void) {
|
#define rtc_lld_acquire() {rtc_lld_wait_write(); RTC->CRL |= RTC_CRL_CNF;}
|
||||||
|
|
||||||
while ((RTC->CRL & RTC_CRL_RTOFF) == 0)
|
|
||||||
;
|
|
||||||
RTC->CRL |= RTC_CRL_CNF;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Releases write access to RTC registers.
|
* @brief Releases write access to RTC registers.
|
||||||
*
|
*
|
||||||
* @notapi
|
* @notapi
|
||||||
*/
|
*/
|
||||||
static void rtc_lld_release(void) {
|
#define rtc_lld_release() {RTC->CRL &= ~RTC_CRL_CNF;}
|
||||||
|
|
||||||
RTC->CRL &= ~RTC_CRL_CNF;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*===========================================================================*/
|
/*===========================================================================*/
|
||||||
/* Driver interrupt handlers. */
|
/* Driver interrupt handlers. */
|
||||||
|
@ -149,6 +144,7 @@ void rtc_lld_init(void){
|
||||||
}
|
}
|
||||||
|
|
||||||
/* All interrupts initially disabled.*/
|
/* All interrupts initially disabled.*/
|
||||||
|
rtc_lld_wait_write();
|
||||||
RTC->CRH = 0;
|
RTC->CRH = 0;
|
||||||
|
|
||||||
/* Callback initially disabled.*/
|
/* Callback initially disabled.*/
|
||||||
|
@ -277,10 +273,12 @@ void rtc_lld_set_callback(RTCDriver *rtcp, rtccb_t callback) {
|
||||||
/* IRQ sources enabled only after setting up the callback.*/
|
/* IRQ sources enabled only after setting up the callback.*/
|
||||||
rtcp->callback = callback;
|
rtcp->callback = callback;
|
||||||
|
|
||||||
|
rtc_lld_wait_write();
|
||||||
RTC->CRL &= ~(RTC_CRL_OWF | RTC_CRL_ALRF | RTC_CRL_SECF);
|
RTC->CRL &= ~(RTC_CRL_OWF | RTC_CRL_ALRF | RTC_CRL_SECF);
|
||||||
RTC->CRH = RTC_CRH_OWIE | RTC_CRH_ALRIE | RTC_CRH_SECIE;
|
RTC->CRH = RTC_CRH_OWIE | RTC_CRH_ALRIE | RTC_CRH_SECIE;
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
|
rtc_lld_wait_write();
|
||||||
RTC->CRH = 0;
|
RTC->CRH = 0;
|
||||||
|
|
||||||
/* Callback set to NULL only after disabling the IRQ sources.*/
|
/* Callback set to NULL only after disabling the IRQ sources.*/
|
||||||
|
|
|
@ -24,7 +24,7 @@
|
||||||
RTCTime timespec;
|
RTCTime timespec;
|
||||||
RTCAlarm alarmspec;
|
RTCAlarm alarmspec;
|
||||||
|
|
||||||
#define TEST_ALARM_WAKEUP TRUE
|
#define TEST_ALARM_WAKEUP FALSE
|
||||||
|
|
||||||
#if TEST_ALARM_WAKEUP
|
#if TEST_ALARM_WAKEUP
|
||||||
|
|
||||||
|
@ -90,7 +90,9 @@ static void my_cb(RTCDriver *rtcp, rtcevent_t event) {
|
||||||
break;
|
break;
|
||||||
case RTC_EVENT_ALARM:
|
case RTC_EVENT_ALARM:
|
||||||
palTogglePad(GPIOC, GPIOC_LED);
|
palTogglePad(GPIOC, GPIOC_LED);
|
||||||
|
chSysLockFromIsr();
|
||||||
chBSemSignalI(&alarm_sem);
|
chBSemSignalI(&alarm_sem);
|
||||||
|
chSysUnlockFromIsr();
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue