NAMote72 Utility Application – Serial Terminal Monitor control for NAMote72 (note: this application replaces the previous na_mote1 test code application)

Dependencies:   SX127x lib_gps lib_mma8451q lib_mpl3115a2 lib_sx9500 mbed

Fork of na_mote1 by wayne roberts

See wiki Page for a detailed

This is a link to the wiki page

rtc_alarm.c

Committer:
dudmuck
Date:
2015-06-25
Revision:
10:a3e2c558c003

File content as of revision 10:a3e2c558c003:

/* mbed 
 * Copyright (c) 
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
#include "rtc_alarm.h"
#include <stdio.h> 

/*
  The MCU can be woken up from low-power mode by an RTC Alarm event, an RTC 
  Wakeup event, a tamper event, a time-stamp event, or a comparator event, 
  without depending on an external interrupt (Auto-wakeup mode).

(+) RTC auto-wakeup (AWU) from the Stop mode
    (++) To wake up from the Stop mode with an RTC alarm event, it is necessary to:
         (+++) Configure the EXTI Line 17 to be sensitive to rising edges (Interrupt 
               or Event modes) and Enable the RTC Alarm Interrupt using the HAL_RTC_SetAlarm_IT()
               function
         (+++) Configure the RTC to generate the RTC alarm using the HAL_RTC_Init() 
               and HAL_RTC_SetTime() functions.
    (++) To wake up from the Stop mode with an RTC Tamper or time stamp event, it 
         is necessary to:
         (+++) Configure the EXTI Line 19 to be sensitive to rising edges (Interrupt or Event modes) and
               Enable the RTC Tamper or time stamp Interrupt using the HAL_RTCEx_SetTamper_IT() 
               or HAL_RTCEx_SetTimeStamp_IT() functions.
    (++) To wake up from the Stop mode with an RTC WakeUp event, it is necessary to:
         (+++) Configure the EXTI Line 20 to be sensitive to rising edges (Interrupt or Event modes) and
               Enable the RTC WakeUp Interrupt using the HAL_RTCEx_SetWakeUpTimer_IT() function.
         (+++) Configure the RTC to generate the RTC WakeUp event using the HAL_RTCEx_SetWakeUpTimer() 
               function.
*/

extern RTC_HandleTypeDef RtcHandle;

#if 0
typedef struct
{
  RTC_TypeDef                 *Instance;  /*!< Register base address    */
  RTC_InitTypeDef             Init;       /*!< RTC required parameters  */ 
  HAL_LockTypeDef             Lock;       /*!< RTC locking object       */
  __IO HAL_RTCStateTypeDef    State;      /*!< Time communication state */
} RTC_HandleTypeDef;

HAL_RTCEx_WakeUpTimerIRQHandler():
    __HAL_RTC_WAKEUPTIMER_GET_IT():
        ->Instance->ISR
    ->Instance->CR
    HAL_RTCEx_WakeUpTimerEventCallback():
        (none)
    __HAL_RTC_WAKEUPTIMER_CLEAR_FLAG():
        ->Instance->ISR
    ->State

HAL_RTCEx_SetWakeUpTimer_IT():
    __HAL_LOCK():
        ->Lock
    ->State
    __HAL_RTC_WRITEPROTECTION_DISABLE():
    __HAL_RTC_WAKEUPTIMER_DISABLE():
    __HAL_RTC_WAKEUPTIMER_GET_FLAG():
    __HAL_RTC_WRITEPROTECTION_ENABLE():
    __HAL_UNLOCK():
    ->Instance->WUTR
    ->Instance->CR
    __HAL_RTC_WAKEUPTIMER_ENABLE():

HAL_RTCEx_DeactivateWakeUpTimer():

#endif /* #if 0 */

static void rtc_wkup_irq(void)
{
    HAL_RTCEx_WakeUpTimerIRQHandler(&RtcHandle);
}

void rtc_alarm_init()
{
    /* Enable Ultra low power mode */
    HAL_PWREx_EnableUltraLowPower();

    /* Enable the fast wake up from Ultra low power mode */
    HAL_PWREx_EnableFastWakeUp();

    NVIC_SetVector(RTC_WKUP_IRQn, (uint32_t)rtc_wkup_irq);
    NVIC_EnableIRQ(RTC_WKUP_IRQn);
}

void rtc_alarm_start(uint32_t seconds)
{
    /* Disable Wakeup Counter */
    HAL_RTCEx_DeactivateWakeUpTimer(&RtcHandle);

/*
RTC_WAKEUPCLOCK_RTCCLK_DIV16        488.3us steps, upto 32s
RTC_WAKEUPCLOCK_RTCCLK_DIV8         244us steps
RTC_WAKEUPCLOCK_RTCCLK_DIV4         122us steps
RTC_WAKEUPCLOCK_RTCCLK_DIV2:        61.035us steps
RTC_WAKEUPCLOCK_CK_SPRE_16BITS      1s steps
RTC_WAKEUPCLOCK_CK_SPRE_17BITS      1s steps
*/
    
    /* ## Setting the Wake up time ############################################*/
    /* see RM0038 section 20.3.4 */
    //HAL_RTCEx_SetWakeUpTimer_IT(&RtcHandle, seconds, RTC_WAKEUPCLOCK_RTCCLK_DIV16);
    HAL_RTCEx_SetWakeUpTimer_IT(&RtcHandle, seconds, RTC_WAKEUPCLOCK_CK_SPRE_16BITS);

}

void rtc_print_subseconds()
{
    printf("ssr:%04x ", RtcHandle.Instance->SSR);
}

time_t rtc_read_with_subseconds(void)
{
    RTC_DateTypeDef dateStruct;
    RTC_TimeTypeDef timeStruct;
    struct tm timeinfo;

    RtcHandle.Instance = RTC;

    // Read actual date and time
    // Warning: the time must be read first!
    HAL_RTC_GetTime(&RtcHandle, &timeStruct, FORMAT_BIN);
    HAL_RTC_GetDate(&RtcHandle, &dateStruct, FORMAT_BIN);

    // Setup a tm structure based on the RTC
    timeinfo.tm_wday = dateStruct.WeekDay;
    timeinfo.tm_mon  = dateStruct.Month - 1;
    timeinfo.tm_mday = dateStruct.Date;
    timeinfo.tm_year = dateStruct.Year + 100;
    timeinfo.tm_hour = timeStruct.Hours;
    timeinfo.tm_min  = timeStruct.Minutes;
    timeinfo.tm_sec  = timeStruct.Seconds;

    // Convert to timestamp
    time_t t = mktime(&timeinfo);

    t <<= 14;
    printf("14:%08x ", t);

    //return (t << 14) | timeStruct.Seconds;
    return t | timeStruct.SubSeconds;
}

/**
  * @brief  RTC Wake Up callback
  * @param  None
  * @retval None
  */
void HAL_RTCEx_WakeUpTimerEventCallback(RTC_HandleTypeDef *hrtc)
{
  /* Clear Wake Up Flag */
  __HAL_PWR_CLEAR_FLAG(PWR_FLAG_WU);
}