Class for the RTC module.
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.
KL25Z_RTC.cpp@1:2e81444e49a9, 2013-06-18 (annotated)
- Committer:
- clemente
- Date:
- Tue Jun 18 08:46:50 2013 +0000
- Revision:
- 1:2e81444e49a9
- Parent:
- 0:12422f7c30d3
- Child:
- 2:56a50064749e
added callback function.
Who changed what in which revision?
User | Revision | Line number | New 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 | 0:12422f7c30d3 | 22 | unsigned int _alarm; |
clemente | 0:12422f7c30d3 | 23 | |
clemente | 1:2e81444e49a9 | 24 | void (*user2_fptr)(void); // Pointers to user function called after |
clemente | 1:2e81444e49a9 | 25 | void (*user1_fptr)(void); // IRQ assertion. |
clemente | 1:2e81444e49a9 | 26 | |
clemente | 1:2e81444e49a9 | 27 | |
clemente | 0:12422f7c30d3 | 28 | KL25Z_RTC::KL25Z_RTC( unsigned int alarm) |
clemente | 0:12422f7c30d3 | 29 | { |
clemente | 0:12422f7c30d3 | 30 | _alarm = alarm; |
clemente | 0:12422f7c30d3 | 31 | } |
clemente | 0:12422f7c30d3 | 32 | |
clemente | 0:12422f7c30d3 | 33 | unsigned int KL25Z_RTC::RTC_GetAlarm( void) |
clemente | 0:12422f7c30d3 | 34 | { |
clemente | 0:12422f7c30d3 | 35 | return _alarm; |
clemente | 0:12422f7c30d3 | 36 | } |
clemente | 0:12422f7c30d3 | 37 | |
clemente | 0:12422f7c30d3 | 38 | void KL25Z_RTC::RTC_Start( void) |
clemente | 0:12422f7c30d3 | 39 | { |
clemente | 0:12422f7c30d3 | 40 | rtc_init(); |
clemente | 0:12422f7c30d3 | 41 | |
clemente | 0:12422f7c30d3 | 42 | NVIC_EnableIRQ( RTC_Seconds_IRQn); |
clemente | 0:12422f7c30d3 | 43 | NVIC_EnableIRQ( RTC_IRQn); |
clemente | 0:12422f7c30d3 | 44 | |
clemente | 0:12422f7c30d3 | 45 | NVIC_SetVector( RTC_Seconds_IRQn, (uint32_t)&_RTC_Seconds_IRQHandler); |
clemente | 0:12422f7c30d3 | 46 | NVIC_SetVector( RTC_IRQn, (uint32_t)&_RTC_IRQHandler); |
clemente | 0:12422f7c30d3 | 47 | |
clemente | 0:12422f7c30d3 | 48 | RTC->TAR = RTC->TSR + _alarm; |
clemente | 0:12422f7c30d3 | 49 | RTC->IER = RTC_IER_TSIE_MASK | RTC_IER_TAIE_MASK; |
clemente | 0:12422f7c30d3 | 50 | |
clemente | 0:12422f7c30d3 | 51 | } |
clemente | 0:12422f7c30d3 | 52 | |
clemente | 1:2e81444e49a9 | 53 | void KL25Z_RTC::RTC_Start( void(*sec_ptr)(void), void(*alrm_ptr)(void)) |
clemente | 1:2e81444e49a9 | 54 | { |
clemente | 1:2e81444e49a9 | 55 | rtc_init(); |
clemente | 1:2e81444e49a9 | 56 | |
clemente | 1:2e81444e49a9 | 57 | RTC->IER = 0; |
clemente | 1:2e81444e49a9 | 58 | |
clemente | 1:2e81444e49a9 | 59 | if ( sec_ptr != NULL) { |
clemente | 1:2e81444e49a9 | 60 | NVIC_EnableIRQ( RTC_Seconds_IRQn); |
clemente | 1:2e81444e49a9 | 61 | NVIC_SetVector( RTC_Seconds_IRQn, (uint32_t)&_RTC_Seconds_IRQHandler); |
clemente | 1:2e81444e49a9 | 62 | user1_fptr = sec_ptr; |
clemente | 1:2e81444e49a9 | 63 | RTC->IER |= RTC_IER_TSIE_MASK; |
clemente | 1:2e81444e49a9 | 64 | } |
clemente | 1:2e81444e49a9 | 65 | |
clemente | 1:2e81444e49a9 | 66 | if ( alrm_ptr != NULL) { |
clemente | 1:2e81444e49a9 | 67 | RTC->TAR = RTC->TSR + _alarm; |
clemente | 1:2e81444e49a9 | 68 | NVIC_EnableIRQ( RTC_IRQn); |
clemente | 1:2e81444e49a9 | 69 | NVIC_SetVector( RTC_IRQn, (uint32_t)&_RTC_IRQHandler); |
clemente | 1:2e81444e49a9 | 70 | user2_fptr = alrm_ptr; |
clemente | 1:2e81444e49a9 | 71 | RTC->IER |= RTC_IER_TAIE_MASK; |
clemente | 1:2e81444e49a9 | 72 | } |
clemente | 1:2e81444e49a9 | 73 | |
clemente | 1:2e81444e49a9 | 74 | } |
clemente | 1:2e81444e49a9 | 75 | |
clemente | 1:2e81444e49a9 | 76 | void KL25Z_RTC::RTC_Seconds_CallBack( void(*fptr)(void)) |
clemente | 1:2e81444e49a9 | 77 | { |
clemente | 1:2e81444e49a9 | 78 | } |
clemente | 1:2e81444e49a9 | 79 | |
clemente | 0:12422f7c30d3 | 80 | unsigned int KL25Z_RTC::RTC_Read( void) |
clemente | 0:12422f7c30d3 | 81 | { |
clemente | 0:12422f7c30d3 | 82 | return RTC->TSR; |
clemente | 0:12422f7c30d3 | 83 | } |
clemente | 0:12422f7c30d3 | 84 | |
clemente | 0:12422f7c30d3 | 85 | void KL25Z_RTC::_RTC_IRQHandler(void) { |
clemente | 0:12422f7c30d3 | 86 | // error_led = 1; |
clemente | 0:12422f7c30d3 | 87 | if ( RTC->SR & 0x04) { |
clemente | 0:12422f7c30d3 | 88 | printf("RTC_Alarm\r\n"); |
clemente | 0:12422f7c30d3 | 89 | RTC->TAR = RTC->TSR + _alarm; |
clemente | 0:12422f7c30d3 | 90 | } |
clemente | 1:2e81444e49a9 | 91 | // Run the user supplied function |
clemente | 1:2e81444e49a9 | 92 | user2_fptr(); |
clemente | 1:2e81444e49a9 | 93 | |
clemente | 0:12422f7c30d3 | 94 | } |
clemente | 0:12422f7c30d3 | 95 | |
clemente | 0:12422f7c30d3 | 96 | |
clemente | 0:12422f7c30d3 | 97 | void KL25Z_RTC::_RTC_Seconds_IRQHandler(void) { |
clemente | 0:12422f7c30d3 | 98 | // |
clemente | 0:12422f7c30d3 | 99 | printf("RTC_Seconds_IRQHandler [%0d].\r\n", rtc_read()); |
clemente | 1:2e81444e49a9 | 100 | // Run the user supplied function |
clemente | 1:2e81444e49a9 | 101 | user1_fptr(); |
clemente | 0:12422f7c30d3 | 102 | } |
clemente | 0:12422f7c30d3 | 103 |