Class for the RTC module.

Dependents:   FRDM_RTC

Please pay attention

This library works only with the FRDM board connected to USB via OpenSDA connector The OpenSDA chip has a pin connected, via the resistor R24, to the KL25Z CLOCKIN pin. So this is why it works.

If you use the board alone, you must configure the MCU in a different manner. I follow the instruction in this link: https://community.freescale.com/docs/DOC-94734 but without success.

This is the code I added, for testing purpose, to my library:

Initialization code for RTC use

    // Enable the internal reference clock. MCGIRCLK is active.
    MCG->C1 |= MCG_C1_IRCLKEN_MASK;
    // Select the slow internal reference clock source.
    MCG->C2 &= ~(MCG_C2_IRCS_MASK);
    // Set PTC1 as RTC_CLKIN and select 32 KHz clock source for the RTC module.
    PORTC->PCR[1] &= ~PORT_PCR_MUX_MASK;
    PORTC->PCR[1] = PORT_PCR_MUX(1);    
    SIM->SOPT1 &= ~SIM_SOPT1_OSC32KSEL_MASK;
    SIM->SOPT1 |= SIM_SOPT1_OSC32KSEL(2);
    // Set PTC3 as CLKOUT pin and selects the MCGIRCLK clock to output on the CLKOUT pin.
    SIM->SOPT2 |= SIM_SOPT2_CLKOUTSEL(0x4);
    PORTC->PCR[3] |= (PORT_PCR_MUX(0x5));
    
    // enable RTC clock
    SIM->SCGC6 |= SIM_SCGC6_RTC_MASK;
    RTC->CR = RTC_CR_SWR_MASK;
    RTC->CR &= ~RTC_CR_SWR_MASK;
    
    if (RTC->SR & RTC_SR_TIF_MASK){
         RTC->TSR = 0x00000000;
    }    
    RTC->TCR = RTC_TCR_CIR(1) | RTC_TCR_TCR(0xFF);

    ecc...

But as I said this did not work for me.

I build this class around the rtc api available from mbed. I just added user call back function and the alarm setting.

The demo software use two function to put the MCU in sleep or deepsleep. The MCU will restart for the RTC IRQ.

Committer:
clemente
Date:
Sun Aug 25 22:13:55 2013 +0000
Revision:
4:3bd0dc0c2b2e
Parent:
3:2cee0b9ac1ff
First release.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
clemente 0:12422f7c30d3 1 /* Copyright (c) 2010-2011 mbed.org, MIT License
clemente 0:12422f7c30d3 2 *
clemente 0:12422f7c30d3 3 * Permission is hereby granted, free of charge, to any person obtaining a copy of this software
clemente 0:12422f7c30d3 4 * and associated documentation files (the "Software"), to deal in the Software without
clemente 0:12422f7c30d3 5 * restriction, including without limitation the rights to use, copy, modify, merge, publish,
clemente 0:12422f7c30d3 6 * distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the
clemente 0:12422f7c30d3 7 * Software is furnished to do so, subject to the following conditions:
clemente 0:12422f7c30d3 8 *
clemente 0:12422f7c30d3 9 * The above copyright notice and this permission notice shall be included in all copies or
clemente 0:12422f7c30d3 10 * substantial portions of the Software.
clemente 0:12422f7c30d3 11 *
clemente 0:12422f7c30d3 12 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING
clemente 0:12422f7c30d3 13 * BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
clemente 0:12422f7c30d3 14 * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
clemente 0:12422f7c30d3 15 * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
clemente 0:12422f7c30d3 16 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
clemente 0:12422f7c30d3 17 */
clemente 0:12422f7c30d3 18
clemente 0:12422f7c30d3 19 #include "KL25Z_RTC.h"
clemente 0:12422f7c30d3 20 #include "rtc_api.h"
clemente 0:12422f7c30d3 21
clemente 4:3bd0dc0c2b2e 22 unsigned int _alarm=0; // Value at which tha alarm is set.
clemente 4:3bd0dc0c2b2e 23 volatile unsigned int _secIRQ_Done;
clemente 4:3bd0dc0c2b2e 24 volatile unsigned int _alrmIRQ_Done;
clemente 0:12422f7c30d3 25
clemente 4:3bd0dc0c2b2e 26 void (*RTC_usr2_fptr)(void); // Pointers to user function called after
clemente 4:3bd0dc0c2b2e 27 void (*RTC_usr1_fptr)(void); // IRQ assertion.
clemente 1:2e81444e49a9 28
clemente 1:2e81444e49a9 29
clemente 0:12422f7c30d3 30 KL25Z_RTC::KL25Z_RTC( unsigned int alarm)
clemente 0:12422f7c30d3 31 {
clemente 4:3bd0dc0c2b2e 32 if ( alarm != 0)
clemente 4:3bd0dc0c2b2e 33 _alarm = alarm;
clemente 4:3bd0dc0c2b2e 34 }
clemente 4:3bd0dc0c2b2e 35
clemente 4:3bd0dc0c2b2e 36 KL25Z_RTC::~KL25Z_RTC()
clemente 4:3bd0dc0c2b2e 37 {
clemente 4:3bd0dc0c2b2e 38 NVIC_DisableIRQ( RTC_Seconds_IRQn);
clemente 4:3bd0dc0c2b2e 39 RTC_usr1_fptr = NULL;
clemente 4:3bd0dc0c2b2e 40 RTC->IER &= ~RTC_IER_TSIE_MASK;
clemente 4:3bd0dc0c2b2e 41
clemente 4:3bd0dc0c2b2e 42 NVIC_DisableIRQ( RTC_IRQn);
clemente 4:3bd0dc0c2b2e 43 RTC_usr2_fptr = NULL;
clemente 4:3bd0dc0c2b2e 44 RTC->IER &= ~RTC_IER_TAIE_MASK;
clemente 4:3bd0dc0c2b2e 45
clemente 4:3bd0dc0c2b2e 46 // Disable the clock to the RTC module.
clemente 4:3bd0dc0c2b2e 47 SIM->SCGC6 &= ~SIM_SCGC6_RTC_MASK;
clemente 0:12422f7c30d3 48 }
clemente 0:12422f7c30d3 49
clemente 0:12422f7c30d3 50 unsigned int KL25Z_RTC::RTC_GetAlarm( void)
clemente 0:12422f7c30d3 51 {
clemente 0:12422f7c30d3 52 return _alarm;
clemente 0:12422f7c30d3 53 }
clemente 0:12422f7c30d3 54
clemente 2:56a50064749e 55 void KL25Z_RTC::RTC_SetAlarm( unsigned int alarm)
clemente 2:56a50064749e 56 {
clemente 2:56a50064749e 57 _alarm = alarm;
clemente 2:56a50064749e 58 }
clemente 2:56a50064749e 59
clemente 0:12422f7c30d3 60 void KL25Z_RTC::RTC_Start( void)
clemente 0:12422f7c30d3 61 {
clemente 0:12422f7c30d3 62 rtc_init();
clemente 0:12422f7c30d3 63
clemente 0:12422f7c30d3 64 NVIC_EnableIRQ( RTC_Seconds_IRQn);
clemente 0:12422f7c30d3 65 NVIC_EnableIRQ( RTC_IRQn);
clemente 0:12422f7c30d3 66
clemente 0:12422f7c30d3 67 NVIC_SetVector( RTC_Seconds_IRQn, (uint32_t)&_RTC_Seconds_IRQHandler);
clemente 0:12422f7c30d3 68 NVIC_SetVector( RTC_IRQn, (uint32_t)&_RTC_IRQHandler);
clemente 0:12422f7c30d3 69
clemente 0:12422f7c30d3 70 RTC->TAR = RTC->TSR + _alarm;
clemente 0:12422f7c30d3 71 RTC->IER = RTC_IER_TSIE_MASK | RTC_IER_TAIE_MASK;
clemente 0:12422f7c30d3 72
clemente 0:12422f7c30d3 73 }
clemente 0:12422f7c30d3 74
clemente 1:2e81444e49a9 75 void KL25Z_RTC::RTC_Start( void(*sec_ptr)(void), void(*alrm_ptr)(void))
clemente 1:2e81444e49a9 76 {
clemente 1:2e81444e49a9 77 rtc_init();
clemente 1:2e81444e49a9 78
clemente 1:2e81444e49a9 79 RTC->IER = 0;
clemente 1:2e81444e49a9 80
clemente 1:2e81444e49a9 81 if ( sec_ptr != NULL) {
clemente 1:2e81444e49a9 82 NVIC_EnableIRQ( RTC_Seconds_IRQn);
clemente 1:2e81444e49a9 83 NVIC_SetVector( RTC_Seconds_IRQn, (uint32_t)&_RTC_Seconds_IRQHandler);
clemente 4:3bd0dc0c2b2e 84 RTC_usr1_fptr = sec_ptr;
clemente 1:2e81444e49a9 85 RTC->IER |= RTC_IER_TSIE_MASK;
clemente 4:3bd0dc0c2b2e 86 } else {
clemente 4:3bd0dc0c2b2e 87 NVIC_DisableIRQ( RTC_Seconds_IRQn);
clemente 4:3bd0dc0c2b2e 88 RTC->IER &= ~RTC_IER_TSIE_MASK;
clemente 1:2e81444e49a9 89 }
clemente 1:2e81444e49a9 90
clemente 1:2e81444e49a9 91 if ( alrm_ptr != NULL) {
clemente 1:2e81444e49a9 92 RTC->TAR = RTC->TSR + _alarm;
clemente 1:2e81444e49a9 93 NVIC_EnableIRQ( RTC_IRQn);
clemente 1:2e81444e49a9 94 NVIC_SetVector( RTC_IRQn, (uint32_t)&_RTC_IRQHandler);
clemente 4:3bd0dc0c2b2e 95 RTC_usr2_fptr = alrm_ptr;
clemente 1:2e81444e49a9 96 RTC->IER |= RTC_IER_TAIE_MASK;
clemente 4:3bd0dc0c2b2e 97 } else {
clemente 4:3bd0dc0c2b2e 98 NVIC_DisableIRQ( RTC_IRQn);
clemente 4:3bd0dc0c2b2e 99 RTC->IER &= ~RTC_IER_TAIE_MASK;
clemente 1:2e81444e49a9 100 }
clemente 1:2e81444e49a9 101
clemente 1:2e81444e49a9 102 }
clemente 1:2e81444e49a9 103
clemente 0:12422f7c30d3 104 unsigned int KL25Z_RTC::RTC_Read( void)
clemente 0:12422f7c30d3 105 {
clemente 0:12422f7c30d3 106 return RTC->TSR;
clemente 0:12422f7c30d3 107 }
clemente 0:12422f7c30d3 108
clemente 4:3bd0dc0c2b2e 109 void KL25Z_RTC::_RTC_IRQHandler(void)
clemente 4:3bd0dc0c2b2e 110 {
clemente 4:3bd0dc0c2b2e 111 //
clemente 0:12422f7c30d3 112 if ( RTC->SR & 0x04) {
clemente 3:2cee0b9ac1ff 113 // printf("RTC_Alarm\r\n");
clemente 0:12422f7c30d3 114 RTC->TAR = RTC->TSR + _alarm;
clemente 4:3bd0dc0c2b2e 115 // Run the user supplied function
clemente 4:3bd0dc0c2b2e 116 if ( RTC_usr2_fptr != NULL)
clemente 4:3bd0dc0c2b2e 117 RTC_usr2_fptr();
clemente 4:3bd0dc0c2b2e 118 //
clemente 4:3bd0dc0c2b2e 119 _alrmIRQ_Done=1;
clemente 0:12422f7c30d3 120 }
clemente 1:2e81444e49a9 121
clemente 0:12422f7c30d3 122 }
clemente 0:12422f7c30d3 123
clemente 4:3bd0dc0c2b2e 124 void KL25Z_RTC::_RTC_Seconds_IRQHandler(void)
clemente 4:3bd0dc0c2b2e 125 {
clemente 0:12422f7c30d3 126 //
clemente 4:3bd0dc0c2b2e 127 _secIRQ_Done=1;
clemente 4:3bd0dc0c2b2e 128
clemente 3:2cee0b9ac1ff 129 // printf("RTC_Seconds_IRQHandler [%0d].\r\n", RTC->TSR);
clemente 1:2e81444e49a9 130 // Run the user supplied function
clemente 4:3bd0dc0c2b2e 131 if ( RTC_usr1_fptr != NULL)
clemente 4:3bd0dc0c2b2e 132 RTC_usr1_fptr();
clemente 0:12422f7c30d3 133 }
clemente 0:12422f7c30d3 134
clemente 4:3bd0dc0c2b2e 135 unsigned int KL25Z_RTC::RTC_isIRQSecondDone( void)
clemente 4:3bd0dc0c2b2e 136 {
clemente 4:3bd0dc0c2b2e 137 if ( _secIRQ_Done) {
clemente 4:3bd0dc0c2b2e 138 _secIRQ_Done=0;
clemente 4:3bd0dc0c2b2e 139 return 1;
clemente 4:3bd0dc0c2b2e 140 } else
clemente 4:3bd0dc0c2b2e 141 return 0;
clemente 4:3bd0dc0c2b2e 142 }
clemente 4:3bd0dc0c2b2e 143
clemente 4:3bd0dc0c2b2e 144 unsigned int KL25Z_RTC::RTC_isIRQAlarmDone( void)
clemente 4:3bd0dc0c2b2e 145 {
clemente 4:3bd0dc0c2b2e 146 if ( _alrmIRQ_Done) {
clemente 4:3bd0dc0c2b2e 147 _alrmIRQ_Done=0;
clemente 4:3bd0dc0c2b2e 148 return 1;
clemente 4:3bd0dc0c2b2e 149 } else
clemente 4:3bd0dc0c2b2e 150 return 0;
clemente 4:3bd0dc0c2b2e 151 }
clemente 4:3bd0dc0c2b2e 152