initial commit of kl25z rtc code. local changes for debug

Dependents:   demo_FRDM_RTC

Fork of KL25Z_RTC by clemente di caprio

Revision:
4:3bd0dc0c2b2e
Parent:
3:2cee0b9ac1ff
Child:
5:5f49823ac1a3
--- a/KL25Z_RTC.cpp	Fri Jun 21 02:22:00 2013 +0000
+++ b/KL25Z_RTC.cpp	Sun Aug 25 22:13:55 2013 +0000
@@ -19,15 +19,32 @@
 #include "KL25Z_RTC.h"
 #include "rtc_api.h"
 
-unsigned int _alarm;
+unsigned int _alarm=0;                  // Value at which tha alarm is set.
+volatile unsigned int _secIRQ_Done;
+volatile unsigned int _alrmIRQ_Done;
 
-void (*user2_fptr)(void);               // Pointers to user function called after
-void (*user1_fptr)(void);               // IRQ assertion.
+void (*RTC_usr2_fptr)(void);               // Pointers to user function called after
+void (*RTC_usr1_fptr)(void);               // IRQ assertion.
 
 
 KL25Z_RTC::KL25Z_RTC( unsigned int alarm)
 {
-    _alarm = alarm;
+    if ( alarm != 0)
+        _alarm = alarm;
+}
+
+KL25Z_RTC::~KL25Z_RTC() 
+{
+    NVIC_DisableIRQ( RTC_Seconds_IRQn);
+    RTC_usr1_fptr = NULL;
+    RTC->IER &= ~RTC_IER_TSIE_MASK;
+    
+    NVIC_DisableIRQ( RTC_IRQn);
+    RTC_usr2_fptr = NULL;
+    RTC->IER &= ~RTC_IER_TAIE_MASK;
+    
+    // Disable the clock to the RTC module.
+    SIM->SCGC6 &= ~SIM_SCGC6_RTC_MASK;
 }
 
 unsigned int KL25Z_RTC::RTC_GetAlarm( void)
@@ -64,16 +81,22 @@
     if ( sec_ptr != NULL) {
         NVIC_EnableIRQ( RTC_Seconds_IRQn);
         NVIC_SetVector( RTC_Seconds_IRQn, (uint32_t)&_RTC_Seconds_IRQHandler); 
-        user1_fptr = sec_ptr;
+        RTC_usr1_fptr = sec_ptr;
         RTC->IER |= RTC_IER_TSIE_MASK;
+    } else {
+        NVIC_DisableIRQ( RTC_Seconds_IRQn);
+        RTC->IER &= ~RTC_IER_TSIE_MASK;
     }
     
     if ( alrm_ptr != NULL) {
         RTC->TAR = RTC->TSR + _alarm;
         NVIC_EnableIRQ( RTC_IRQn);
         NVIC_SetVector( RTC_IRQn, (uint32_t)&_RTC_IRQHandler); 
-        user2_fptr = alrm_ptr;
+        RTC_usr2_fptr = alrm_ptr;
         RTC->IER |= RTC_IER_TAIE_MASK;
+    } else {
+        NVIC_DisableIRQ( RTC_IRQn);
+        RTC->IER &= ~RTC_IER_TAIE_MASK;
     }
     
 }
@@ -83,22 +106,47 @@
     return RTC->TSR;
 }
 
-void KL25Z_RTC::_RTC_IRQHandler(void) {
-    // error_led = 1;
+void KL25Z_RTC::_RTC_IRQHandler(void) 
+{
+    //
     if ( RTC->SR & 0x04) {
         // printf("RTC_Alarm\r\n");
         RTC->TAR = RTC->TSR + _alarm;
+        // Run the user supplied function
+        if ( RTC_usr2_fptr != NULL)
+            RTC_usr2_fptr();
+        // 
+        _alrmIRQ_Done=1;
     }
-    // Run the user supplied function
-    user2_fptr();
     
 }
 
-
-void KL25Z_RTC::_RTC_Seconds_IRQHandler(void) {
+void KL25Z_RTC::_RTC_Seconds_IRQHandler(void) 
+{
     //
+    _secIRQ_Done=1;
+    
     // printf("RTC_Seconds_IRQHandler [%0d].\r\n", RTC->TSR);
     // Run the user supplied function
-    user1_fptr();
+    if ( RTC_usr1_fptr != NULL)
+        RTC_usr1_fptr();
 }
 
+unsigned int KL25Z_RTC::RTC_isIRQSecondDone( void)
+{
+    if ( _secIRQ_Done) {
+        _secIRQ_Done=0;
+        return 1;
+    } else
+        return 0;        
+}
+
+unsigned int KL25Z_RTC::RTC_isIRQAlarmDone( void)
+{
+    if ( _alrmIRQ_Done) {
+        _alrmIRQ_Done=0;
+        return 1;
+    } else
+        return 0;        
+}
+