/**
  ******************************************************************************
  * @file    stm8l15x_rtc.h
  * @author  MCD Application Team
  * @version V1.6.0
  * @date    28-June-2013
  * @brief   This file contains all the functions prototypes for the RTC 
  *          firmware library.
  ******************************************************************************
  *
  * Licensed under MCD-ST Liberty SW License Agreement V2, (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.st.com/software_license_agreement_liberty_v2
  *
  * 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.
  *
  ****************************************************************************** 
  */
/* Define to prevent recursive inclusion -------------------------------------*/
#ifndef __STM8L15x_RTC_H
#define __STM8L15x_RTC_H

/* Includes ------------------------------------------------------------------*/
#include "stm8l15x.h"

/** @addtogroup STM8L15x_StdPeriph_Driver
  * @{
  */

/** @addtogroup RTC
  * @{
  */ 
  
/* Exported types ------------------------------------------------------------*/
/** @defgroup RTC_Exported_Types
  * @{
  */

/** @defgroup RTC_Weekdays
  * @{
  */ 
typedef enum
{
  RTC_Weekday_Monday      =  ((uint8_t)0x01), /*!< WeekDay is Monday */
  RTC_Weekday_Tuesday     =  ((uint8_t)0x02), /*!< WeekDay is Tuesday */
  RTC_Weekday_Wednesday   =  ((uint8_t)0x03), /*!< WeekDay is Wednesday */
  RTC_Weekday_Thursday    =  ((uint8_t)0x04), /*!< WeekDay is Thursday */
  RTC_Weekday_Friday      =  ((uint8_t)0x05), /*!< WeekDay is Friday */
  RTC_Weekday_Saturday    =  ((uint8_t)0x06), /*!< WeekDay is Saturday */
  RTC_Weekday_Sunday      =  ((uint8_t)0x07)  /*!< WeekDay is Sunday */
}
RTC_Weekday_TypeDef;

/**
  * @}
  */
  
/** @defgroup RTC_Months
  * @{
  */ 
typedef enum
{
  RTC_Month_January   =  ((uint8_t)0x01), /*!< Month is January */
  RTC_Month_February  =  ((uint8_t)0x02), /*!< Month is February */
  RTC_Month_March     =  ((uint8_t)0x03), /*!< Month is March */
  RTC_Month_April     =  ((uint8_t)0x04), /*!< Month is April */
  RTC_Month_May       =  ((uint8_t)0x05), /*!< Month is May */
  RTC_Month_June      =  ((uint8_t)0x06), /*!< Month is June */
  RTC_Month_July      =  ((uint8_t)0x07), /*!< Month is July */
  RTC_Month_August    =  ((uint8_t)0x08), /*!< Month is August */
  RTC_Month_September =  ((uint8_t)0x09), /*!< Month is September */
  RTC_Month_October   =  ((uint8_t)0x10), /*!< Month is October */
  RTC_Month_November  =  ((uint8_t)0x11), /*!< Month is November */
  RTC_Month_December  =  ((uint8_t)0x12)  /*!< Month is December */
}
RTC_Month_TypeDef;

/**
  * @}
  */
  
/** @defgroup RTC_Hour_Format
  * @{
  */ 
typedef enum
{
  RTC_HourFormat_24  = ((uint8_t)0x00), /*!< Hour Format is 24H */
  RTC_HourFormat_12  = ((uint8_t)0x40)  /*!< Hour Format is 12H (using AM/PM) */
}
RTC_HourFormat_TypeDef;

/**
  * @}
  */
  
/** @defgroup RTC_Time
  * @{
  */ 
typedef enum
{
  RTC_H12_AM     = ((uint8_t)0x00), /*!< AM/PM notation is AM or 24 hour format */
  RTC_H12_PM     = ((uint8_t)0x40)  /*!< AM/PM notation is PM  */
}
RTC_H12_TypeDef;

/**
  * @}
  */
  
/** @defgroup RTC_Alarm_WeekDay_Selection
  * @{
  */ 
typedef enum
{
  RTC_AlarmDateWeekDaySel_Date     = ((uint8_t)0x00), /*!< Date/WeekDay selection is Date */
  RTC_AlarmDateWeekDaySel_WeekDay  = ((uint8_t)0x40)  /*!< Date/WeekDay selection is WeekDay */
}
RTC_AlarmDateWeekDaySel_TypeDef;

/**
  * @}
  */
  
/** @defgroup RTC_Alarm_Mask
  * @{
  */ 
typedef enum
{
  RTC_AlarmMask_None         =  ((uint8_t)0x00), /*!< Alarm Masks disabled */
  RTC_AlarmMask_Seconds      =  ((uint8_t)0x80), /*!< Alarm Seconds Mask */
  RTC_AlarmMask_Minutes      =  ((uint8_t)0x40), /*!< Alarm Minutes Mask */
  RTC_AlarmMask_Hours        =  ((uint8_t)0x20), /*!< Alarm Hours Mask */
  RTC_AlarmMask_DateWeekDay  =  ((uint8_t)0x10), /*!< Alarm Date/WeekDay Mask */
  RTC_AlarmMask_All          =  ((uint8_t)0xF0)  /*!< Alarm All Mask are enabled */
}
RTC_AlarmMask_TypeDef;

/**
  * @}
  */
  
/** @defgroup RTC_Sub_Second_Alarm_Mask
  * @{
  */ 
typedef enum
{
  RTC_AlarmSubSecondMask_All      =  ((uint8_t)0x00), /*!< All Alarm SS fields are masked. There is no comparison on sub seconds for Alarm */
  RTC_AlarmSubSecondMask_None     =  ((uint8_t)0x0F), /*!< SS[14:0] are compared and must match to activate alarm. */
  RTC_AlarmSubSecondMask_SS14_1   =  ((uint8_t)0x01), /*!< SS[14:1] are not used in Alarm comparison. Only SS[0] is compared. */
  RTC_AlarmSubSecondMask_SS14_2   =  ((uint8_t)0x02), /*!< SS[14:2] are not used in Alarm comparison. Only SS[1:0] are compared */
  RTC_AlarmSubSecondMask_SS14_3   =  ((uint8_t)0x03), /*!< SS[14:3] are not used in Alarm comparison. Only SS[1:0] are compared */
  RTC_AlarmSubSecondMask_SS14_4   =  ((uint8_t)0x04), /*!< SS[14:4] are not used in Alarm comparison. Only SS[1:0] are compared */
  RTC_AlarmSubSecondMask_SS14_5   =  ((uint8_t)0x05), /*!< SS[14:5] are not used in Alarm comparison. Only SS[1:0] are compared */
  RTC_AlarmSubSecondMask_SS14_6   =  ((uint8_t)0x06), /*!< SS[14:6] are not used in Alarm comparison. Only SS[1:0] are compared */
  RTC_AlarmSubSecondMask_SS14_7   =  ((uint8_t)0x07), /*!< SS[14:7] are not used in Alarm comparison. Only SS[1:0] are compared */
  RTC_AlarmSubSecondMask_SS14_8   =  ((uint8_t)0x08), /*!< SS[14:8] are not used in Alarm comparison. Only SS[1:0] are compared */
  RTC_AlarmSubSecondMask_SS14_9   =  ((uint8_t)0x09), /*!< SS[14:9] are not used in Alarm comparison. Only SS[1:0] are compared */
  RTC_AlarmSubSecondMask_SS14_10  =  ((uint8_t)0x0A), /*!< SS[14:10] are not used in Alarm comparison. Only SS[1:0] are compared */
  RTC_AlarmSubSecondMask_SS14_11  =  ((uint8_t)0x0B), /*!< SS[14:11] are not used in Alarm comparison. Only SS[1:0] are compared */
  RTC_AlarmSubSecondMask_SS14_12  =  ((uint8_t)0x0C), /*!< SS[14:12] are not used in Alarm comparison. Only SS[1:0] are compared */
  RTC_AlarmSubSecondMask_SS14_13  =  ((uint8_t)0x0D), /*!< SS[14:13] are not used in Alarm comparison. Only SS[1:0] are compared */
  RTC_AlarmSubSecondMask_SS14     =  ((uint8_t)0x0E) /*!< SS[14] is not used in Alarm comparison. Only SS[13:0] are compared */
}
RTC_AlarmSubSecondMask_TypeDef;

/**
  * @}
  */
  
/** @defgroup RTC_Wakeup_Clock
  * @{
  */ 
typedef enum
{
  RTC_WakeUpClock_RTCCLK_Div16    = ((uint8_t)0x00), /*!< (RTC clock) div 16*/
  RTC_WakeUpClock_RTCCLK_Div8     = ((uint8_t)0x01), /*!< (RTC clock) div 8*/
  RTC_WakeUpClock_RTCCLK_Div4     = ((uint8_t)0x02), /*!< (RTC clock) div 4*/
  RTC_WakeUpClock_RTCCLK_Div2     = ((uint8_t)0x03), /*!< (RTC clock) div 2*/
  RTC_WakeUpClock_CK_SPRE_16bits  = ((uint8_t)0x04), /*!< CK SPRE with a counter from 0x0000 to 0xFFFF */
  RTC_WakeUpClock_CK_SPRE_17bits  = ((uint8_t)0x06)  /*!< CK SPRE with a counter from 0x10000 to 0x1FFFF */
}
RTC_WakeUpClock_TypeDef;

/**
  * @}
  */
  
/** @defgroup RTC_Output_Selection
  * @{
  */ 
typedef enum
{
  RTC_Output_Disable = ((uint8_t)0x00), /*!< RTC Alternate function Output is disabled  */
  RTC_Output_Alarm   = ((uint8_t)0x20), /*!< RTC Alternate function Output is the Alarm A event*/
  RTC_Output_WakeUp  = ((uint8_t)0x60)  /*!< RTC Alternate function Output is the WakeUp event */
}
RTC_Output_TypeDef;

/**
  * @}
  */
  
/** @defgroup RTC_Output_Polarity
  * @{
  */ 
typedef enum
{
  RTC_OutputPolarity_High  = ((uint8_t)0x00), /*!< RTC Alternate function Output Polarity is High  */
  RTC_OutputPolarity_Low   = ((uint8_t)0x10)  /*!< RTC Alternate function Output Polarity is Low  */
}
RTC_OutputPolarity_TypeDef;

/**
  * @}
  */
  
/** @defgroup RTC_Calibration_Output
  * @{
  */ 
typedef enum
{
  RTC_CalibOutput_512Hz  = ((uint8_t)0x00), /*!< RTC Calibration Output is 512Hz */
  RTC_CalibOutput_1Hz    = ((uint8_t)0x80)  /*!< RTC Calibration Output is 1Hz */
}
RTC_CalibOutput_TypeDef;

/**
  * @}
  */
  
/** @defgroup RTC_DayLight_Saving
  * @{
  */ 
typedef enum
{
  RTC_DayLightSaving_SUB1H  = ((uint8_t)0x02), /*!< Substract 1 hour to the current Time (Winter Time Adjustment) */
  RTC_DayLightSaving_ADD1H  = ((uint8_t)0x01)  /*!< Add 1 hour to the current Time (Summer Time Adjustment) */
}
RTC_DayLightSaving_TypeDef;

/**
  * @}
  */
  
/** @defgroup RTC_Store_Operation
  * @{
  */ 
typedef enum
{
  RTC_StoreOperation_Set   = ((uint8_t)0x04), /*!< Store Operation Set */
  RTC_StoreOperation_Reset = ((uint8_t)0x00)  /*!< Store Operation Reset */
}
RTC_StoreOperation_TypeDef;

/**
  * @}
  */
  
/** @defgroup RTC_Input_Parameter_Format
  * @{
  */ 
typedef enum
{
  RTC_Format_BIN  = ((uint8_t)0x00), /*!< Binary Format is used  */
  RTC_Format_BCD  = ((uint8_t)0x01)  /*!< BCD Format is used  */
}
RTC_Format_TypeDef;

/**
  * @}
  */
  
/** @defgroup RTC_Flags
  * @{
  */ 
typedef enum
{
  RTC_FLAG_TAMP3F  = ((uint16_t)0x0080), /*!< TAMPER3 detection  Flag. If set, tamper detection event is detected on tamper input 3 */
  RTC_FLAG_TAMP2F  = ((uint16_t)0x0040), /*!< TAMPER2 detection  Flag. If set, tamper detection event is detected on tamper input 2 */
  RTC_FLAG_TAMP1F  = ((uint16_t)0x0020), /*!< TAMPER1 detection  Flag. If set, tamper detection event is detected on tamper input 1 */

  RTC_FLAG_WUTF    = ((uint16_t)0x0004), /*!< Wake up Timer Flag. If set, the Wake Up down counter reaches 0 */
  RTC_FLAG_ALRAF   = ((uint16_t)0x0001), /*!< Alarm A Flag. If set, the Time/Date registers matches Alarm A registers */

  RTC_FLAG_INITF   = ((uint16_t)0x4000), /*!< Initialisation Flag. If set,Calender registers has been initialized  */
  RTC_FLAG_RSF     = ((uint16_t)0x2000), /*!< Registers Synchronization Flag. If set,Calender registers synchronized  */
  RTC_FLAG_INITS   = ((uint16_t)0x1000), /*!< Initialisation Status Flag. If set,Calender  update is allowed  */

  RTC_FLAG_SHPF    = ((uint16_t)0x0800), /*!< Shift operation pending Flag. This flag is set by hardware as soon as a shift operation is
                                              initiated by a write to the RTC_SHIFTRL. It is cleared by hardware as soon as the corresponding
                                              shift operation has completed.  */

  RTC_FLAG_WUTWF   = ((uint16_t)0x0400), /*!< Wake up Timer write Flag. If set, Wake up Timer update is allowed */
  RTC_FLAG_RECALPF = ((uint16_t)0x0200), /*!<   Recalibration pending Flag, The status flag RECALPF is automatically set to ‘1’ when software
                                                writes to the register RTC_CALRL, indicating that the RTC_CALRx registers are blocked.
                                                When the new calibration settings are taken into account, this Flag returns by hardware to ‘0’. */
  RTC_FLAG_ALRAWF  = ((uint16_t)0x0100)  /*!< Alarm  A write Flag. If set, Alarm A update is allowed   */
}
RTC_Flag_TypeDef;

/**
  * @}
  */
  
/** @defgroup RTC_Interrupts
  * @{
  */ 
typedef enum
{
  RTC_IT_WUT  = ((uint16_t)0x0040),  /*!< Wake up Timer Interrupt */
  RTC_IT_ALRA = ((uint16_t)0x0010),  /*!< Alarm A Interrupt */
  RTC_IT_TAMP = ((uint16_t)0x0F01)   /*!< Tamper Interrupt */
}
RTC_IT_TypeDef;

/**
  * @}
  */

/** @defgroup RTC_Tamper_Level
  * @{
  */ 
typedef enum
{
  RTC_TamperLevel_Low    = ((uint8_t)0x00), /*!< Tamper staying low triggers a tamper detection event. */
  RTC_TamperLevel_High   = ((uint8_t)0x54)  /*!< Tamper staying high triggers a tamper detection event. */
}
RTC_TamperLevel_TypeDef;

/**
  * @}
  */
  
/** @defgroup RTC_Tamper_State
  * @{
  */ 
typedef enum
{
  RTC_TamperState_Disable  = ((uint8_t)0x00), /*!< Tamper State is Disable */
  RTC_TamperState_Enable   = ((uint8_t)0x01)  /*!< Tamper State is Enable  */
}
RTC_TamperState_TypeDef;

/**
  * @}
  */
  
/** @defgroup RTC_Tamper_definition
  * @{
  */ 
typedef enum
{
  RTC_Tamper_1 = ((uint8_t)0x02),  /*!< Tamper 1 selection */
  RTC_Tamper_2 = ((uint8_t)0x08),  /*!< Tamper 2 selection */
  RTC_Tamper_3 = ((uint8_t)0x20)   /*!< Tamper 3 selection */
}
RTC_Tamper_TypeDef;

/**
  * @}
  */
  
/** @defgroup RTC_Tamper_Precharge_Duration
  * @{
  */ 
typedef enum
{
  RTC_TamperPrechargeDuration_None    = ((uint8_t)0x80),  /*!< Tamper pins are not precharged before sampling */
  RTC_TamperPrechargeDuration_1RTCCLK = ((uint8_t)0x00),  /*!< Tamper pins are precharged before sampling during 1 RTCCLK cycle  */
  RTC_TamperPrechargeDuration_2RTCCLK = ((uint8_t)0x20),  /*!< Tamper pins are precharged before sampling during 2 RTCCLK cycles */
  RTC_TamperPrechargeDuration_4RTCCLK = ((uint8_t)0x40),  /*!< Tamper pins are precharged before sampling during 4 RTCCLK cycles */
  RTC_TamperPrechargeDuration_8RTCCLK = ((uint8_t)0x60)   /*!< Tamper pins are precharged before sampling during 8 RTCCLK cycles */
}
RTC_TamperPrechargeDuration_TypeDef;

/**
  * @}
  */
  
/** @defgroup RTC_Tamper_Filter
  * @{
  */ 
typedef enum
{
  RTC_TamperFilter_1Sample    = ((uint8_t)0x00), /*!< Tamper is activated after 1 sample at the active level */
  RTC_TamperFilter_2Sample    = ((uint8_t)0x08), /*!< Tamper is activated after 2 consecutive samples at the active level. */
  RTC_TamperFilter_4Sample    = ((uint8_t)0x10), /*!< Tamper is activated after 4 consecutive samples at the active level. */
  RTC_TamperFilter_8Sample    = ((uint8_t)0x18)  /*!< Tamper is activated after 8 consecutive samples at the active level. */
}
RTC_TamperFilter_TypeDef;

/**
  * @}
  */
  
/** @defgroup RTC_Tamper_Sampling_Frequency
  * @{
  */ 
typedef enum
{
  RTC_TamperSamplingFreq_RTCCLK_Div32768  = ((uint8_t)0x00), /*!< Tamper inputs are sampled with a frequency =  RTCCLK / 32768 */
  RTC_TamperSamplingFreq_RTCCLK_Div16384  = ((uint8_t)0x01), /*!< Tamper inputs are sampled with a frequency =  RTCCLK / 16384 */
  RTC_TamperSamplingFreq_RTCCLK_Div8192   = ((uint8_t)0x02), /*!< Tamper inputs are sampled with a frequency =  RTCCLK / 8192  */
  RTC_TamperSamplingFreq_RTCCLK_Div4096   = ((uint8_t)0x03), /*!< Tamper inputs are sampled with a frequency =  RTCCLK / 4096  */
  RTC_TamperSamplingFreq_RTCCLK_Div2048   = ((uint8_t)0x04), /*!< Tamper inputs are sampled with a frequency =  RTCCLK / 2048  */
  RTC_TamperSamplingFreq_RTCCLK_Div1024   = ((uint8_t)0x05), /*!< Tamper inputs are sampled with a frequency =  RTCCLK / 1024  */
  RTC_TamperSamplingFreq_RTCCLK_Div512    = ((uint8_t)0x06), /*!< Tamper inputs are sampled with a frequency =  RTCCLK / 512   */
  RTC_TamperSamplingFreq_RTCCLK_Div256    = ((uint8_t)0x07)  /*!< Tamper inputs are sampled with a frequency =  RTCCLK / 256   */
}
RTC_TamperSamplingFreq_TypeDef;

/**
  * @}
  */
  
/** @defgroup RTC_Shift_Add_1s
  * @{
  */ 
typedef enum
{
  RTC_ShiftAdd1S_Set    = ((uint8_t)0x80), /*!< Add 1 Second */
  RTC_ShiftAdd1S_Reset  = ((uint8_t)0x00)  /*!< Do not Add 1 Second */
}
RTC_ShiftAdd1S_TypeDef;

/**
  * @}
  */
  
/** @defgroup RTC_Smooth_Calibration_Period
  * @{
  */ 
typedef enum
{
  RTC_SmoothCalibPeriod_32sec  = ((uint8_t)0x00), /*!<  if RTCCLK = 32768 Hz, Smooth calibration period is 32s,  else 2exp20 RTCCLK seconds */
  RTC_SmoothCalibPeriod_16sec  = ((uint8_t)0x20), /*!<  if RTCCLK = 32768 Hz, Smooth calibration period is 16s, else 2exp19 RTCCLK seconds */
  RTC_SmoothCalibPeriod_8sec   = ((uint8_t)0x40)  /*!<  if RTCCLK = 32768 Hz, Smooth calibration period is 8s, else 2exp18 RTCCLK seconds */
}
RTC_SmoothCalibPeriod_TypeDef;

/**
  * @}
  */
  
/** @defgroup RTC_Smooth_Calibration_Pulses
  * @{
  */ 
typedef enum
{
  RTC_SmoothCalibPlusPulses_Set    = ((uint8_t)0x80), /*!<  The number of RTCCLK pulses added during a X -second window =  Y  - CALM[8:0].  
                                                             with Y = 512, 256, 128 when X = 32, 16, 8 */
  RTC_SmoothCalibPlusPulses_Reset  = ((uint8_t)0x00)  /*!<  The number of RTCCLK pulses substituted during a 32-second window =  CALM[8:0]. */

}
RTC_SmoothCalibPlusPulses_TypeDef;

/**
  * @}
  */

/**
  * @brief RTC Init structure definition
  */

typedef struct
{

  RTC_HourFormat_TypeDef RTC_HourFormat; /*!< RTC Hour Format */

  uint8_t RTC_AsynchPrediv;   /*!< RTC Asynchronous Predivider.
                                   This parameter can be any value from 
                                   0x00 to 0x7F.*/

  uint16_t RTC_SynchPrediv;   /*!< RTC Synchronous Predivider.
                                   This parameter can be any value from 
                                   0x0000 to 0x7FFF.*/
}
RTC_InitTypeDef;


/**
  * @brief RTC Time structure definition
  */
typedef struct
{
  uint8_t RTC_Hours;       /*!< RTC Hours.
                            If Binary format is selected :
                               - If RTC_Hour format is RTC_Hour format_12, 
                                 this parameter can be any value from 1 to 12.
                               - If RTC_Hour format is RTC_Hour format_24, 
                                 this parameter can be any value from 0 to 23.
                            If BCD format is selected :
                               - If RTC_Hour format is RTC_Hour format_12, 
                                 this parameter can be any BCD value from 
                                 0x01 to 0x12.
                               - If RTC_Hour format is RTC_Hour format_24, 
                                 this parameter can be any BCD value  from 
                                 0x00 to 0x23.*/
  uint8_t RTC_Minutes;     /*!< RTC Minutes.
                             If Binary format is selected, this parameter can
                                be any value from 0 to 59.
                             If BCD format is selected, this parameter can
                                be any BCD value from 0x00 to 0x59.*/
  uint8_t RTC_Seconds;     /*!< RTC Seconds.
                             If Binary format is selected, this parameter can
                                be any value from 0 to 59.
                             If BCD format is selected, this parameter can
                                be any BCD value from 0x00 to 0x59.*/
  RTC_H12_TypeDef RTC_H12;  /*!< RTC 12-hour clock period (AM/PM) */
}
RTC_TimeTypeDef;

/**
  * @brief RTC Date structure definition
  */
typedef struct
{
  RTC_Weekday_TypeDef  RTC_WeekDay; /*!< The RTC Calender Weekday. */

  RTC_Month_TypeDef RTC_Month;      /*!< The RTC Calender Month. */

  uint8_t RTC_Date;                 /*!< The RTC Calender Date.
                                      If Binary format is selected, this 
                                         parameter can be any value from 1 to 31.
                                      If BCD format is selected, this parameter
                                         can be any BCD value from 0x01 to 0x31.*/

  uint8_t RTC_Year;                 /*!< The RTC Calender Date.
                                      If Binary format is selected, this parameter
                                         can be any value from 0 to 99.
                                      If BCD format is selected, this parameter
                                         can be any BCD value from 0x00 to 0x99.*/
}
RTC_DateTypeDef;

/**
  * @brief RTC Alarm structure definition
  */
typedef struct
{
  RTC_TimeTypeDef RTC_AlarmTime;                           /*!< RTC Alarm Time */

  uint8_t RTC_AlarmMask;                                   /*!< The RTC Alarm Fields Masks. */

  RTC_AlarmDateWeekDaySel_TypeDef RTC_AlarmDateWeekDaySel; /*!< The RTC Alarm Date/WeekDay selection. */

  uint8_t RTC_AlarmDateWeekDay;                            /*!< The RTC Alarm Date/WeekDay value.
                                                               - If RTC Alarm Date/WeekDay selection is Date
                                                                and if If Binary format is selected, this
                                                                parameter can be any value from 1 to 31.
                                                               - If RTC Alarm Date/WeekDay selection is WeekDay,
                                                                 this parameter can be one of the
                                                                 @ref RTC_Weekday_TypeDef enumeration.*/
}
RTC_AlarmTypeDef;
  /**
  * @}
  */
/* Exported constants --------------------------------------------------------*/
/* Exported macros -----------------------------------------------------------*/
/** @defgroup RTC_Exported_Macros
* @{
*/

/**
  * @brief Macro used by the assert_param function in order to check the used 
  *        Calender Hour format
  */

#define IS_RTC_HOUR_FORMAT(FORMAT) (((FORMAT) == RTC_HourFormat_12) || \
                                    ((FORMAT) == RTC_HourFormat_24))

/**
  * @brief Macro used by the assert_param function in order to check the used 
  *        Asynchronous Predivider
  */
#define IS_RTC_ASYNCH_PREDIV(PREDIV) ((PREDIV) <= 0x7F)

/**
  * @brief Macro used by the assert_param function in order to check the used 
  *        Synchronous Predivider
  */
#define IS_RTC_SYNCH_PREDIV(PREDIV) ((PREDIV) <= 0x7FFF)

/**
  * @brief Macro used by the assert_param function in order to check the used 
  *        Calender Hours value (format 12h)
  */
#define IS_RTC_HOUR12_MAX(HOUR) ((HOUR) <= (uint8_t)12)
#define IS_RTC_HOUR12_MIN(HOUR) ((HOUR) > (uint8_t)0)

/**
  * @brief Macro used by the assert_param function in order to check the used 
  *        Calender Hours value (format 24h)
  */
#define IS_RTC_HOUR24(HOUR) ((HOUR) <= 23)

/**
  * @brief Macro used by the assert_param function in order to check the used 
  *        Calender minutes value
  */
#define IS_RTC_MINUTES(MINUTES) ((MINUTES) <= 59)

/**
  * @brief Macro used by the assert_param function in order to check the used 
  *        Calender seconds value
  */
#define IS_RTC_SECONDS(SECONDS) ((SECONDS) <= 59)

/**
  * @brief Macro used by the assert_param function in order to check the used 
  *        Calender H12 mode
  */
#define IS_RTC_H12(PM) (((PM) == (RTC_H12_AM)) || ((PM) == (RTC_H12_PM)))


/**
  * @brief Macro used by the assert_param function in order to check the used 
  *        Calender Year value
  */
#define IS_RTC_YEAR(YEAR) ((YEAR) <= 99)

/**
  * @brief Macro used by the assert_param function in order to check the used 
  *        Calender month value
  */
#define IS_RTC_MONTH_MAX(MONTH) ((MONTH) <= (uint8_t)12)
#define IS_RTC_MONTH_MIN(MONTH) ((MONTH) >= (uint8_t)1)

/**
  * @brief Macro used by the assert_param function in order to check the used 
  *        Calender Date value
  */
#define IS_RTC_DATE_MAX(DATE) ((DATE) <= (uint8_t)31)
#define IS_RTC_DATE_MIN(DATE) ((DATE) >= (uint8_t)1)

/**
  * @brief Macro used by the assert_param function in order to check the used 
  *        Calender Week day value
  */
#define IS_RTC_WEEKDAY(WEEKDAY) (((WEEKDAY) ==   RTC_Weekday_Monday)    || \
                                 ((WEEKDAY) ==   RTC_Weekday_Tuesday)   || \
                                 ((WEEKDAY) ==   RTC_Weekday_Wednesday) || \
                                 ((WEEKDAY) ==   RTC_Weekday_Thursday)  || \
                                 ((WEEKDAY) ==   RTC_Weekday_Friday)    || \
                                 ((WEEKDAY) ==   RTC_Weekday_Saturday)  || \
                                 ((WEEKDAY) ==   RTC_Weekday_Sunday))

/**
  * @brief Macro used by the assert_param function in order to check the used 
  *        Alarm Date/week day  selection
  */
#define IS_RTC_ALARM_DATEWEEKDAY_SEL(SEL) (((SEL) == RTC_AlarmDateWeekDaySel_Date) || \
                                           ((SEL) == RTC_AlarmDateWeekDaySel_WeekDay))

/**
  * @brief Macro used by the assert_param function in order to check the used 
  *        Alarm Mask
  */
#define IS_RTC_ALARM_MASK(MASK) (((MASK) & 0x0F) == (uint8_t)(RESET))

/**
  * @brief Macro used by the assert_param function in order to check the used 
  *        wakeup clock source
  */
#define IS_RTC_WAKEUP_CLOCK(CLOCK) (((CLOCK) == RTC_WakeUpClock_RTCCLK_Div16) || \
                                    ((CLOCK) == RTC_WakeUpClock_RTCCLK_Div8)  || \
                                    ((CLOCK) == RTC_WakeUpClock_RTCCLK_Div4)  || \
                                    ((CLOCK) == RTC_WakeUpClock_RTCCLK_Div2)  || \
                                    ((CLOCK) == RTC_WakeUpClock_CK_SPRE_16bits) || \
                                    ((CLOCK) == RTC_WakeUpClock_CK_SPRE_17bits))

/**
  * @brief Macro used by the assert_param function in order to check the used 
  *        Output selection
  */
#define IS_RTC_OUTPUT_SEL(SEL) (((SEL) == RTC_Output_Disable) || \
                                ((SEL) == RTC_Output_Alarm) || \
                                ((SEL) == RTC_Output_WakeUp))
/**
  * @brief Macro used by the assert_param function in order to check the used 
  *        Output polarity
  */
#define IS_RTC_OUTPUT_POL(POL) (((POL) == RTC_OutputPolarity_High) || \
                                ((POL) == RTC_OutputPolarity_Low))

/**
  * @brief Macro used by the assert_param function in order to check the used 
  *        Daylight saving mode
  */
#define IS_RTC_DAYLIGHT_SAVING(SAVE) (((SAVE) ==  RTC_DayLightSaving_SUB1H) || \
                                      ((SAVE) == RTC_DayLightSaving_ADD1H))

/**
  * @brief Macro used by the assert_param function in order to check the used 
  *        Store Operation status
  */
#define IS_RTC_STORE_OPERATION(OP) (((OP) ==  RTC_StoreOperation_Set) || \
                                    ((OP) == RTC_StoreOperation_Reset))


/**
  * @brief Macro used by the assert_param function in order to check the used 
  *        format (bin/bcd) for data user insert
  */
#define IS_RTC_FORMAT(FORMAT) (((FORMAT) == RTC_Format_BIN) || \
                               ((FORMAT) == RTC_Format_BCD))

/**
  * @brief Macro used by the assert_param function in order to check the used 
  *        Flag to get
  */
#define IS_RTC_GET_FLAG(FLAG) (((FLAG) == RTC_FLAG_WUTF)  || \
                               ((FLAG) == RTC_FLAG_ALRAF) || \
                               ((FLAG) == RTC_FLAG_INITF) || \
                               ((FLAG) == RTC_FLAG_RSF)   || \
                               ((FLAG) == RTC_FLAG_INITS) || \
                               ((FLAG) == RTC_FLAG_WUTWF) || \
                               ((FLAG) == RTC_FLAG_TAMP3F)|| \
                               ((FLAG) == RTC_FLAG_TAMP2F)|| \
                               ((FLAG) == RTC_FLAG_TAMP1F)|| \
                               ((FLAG) == RTC_FLAG_SHPF)  || \
                               ((FLAG) == RTC_FLAG_RECALPF) || \
                               ((FLAG) == RTC_FLAG_ALRAWF))

/* RTC_FLAG_ALRAWF is for Medium Density only but supported by High Density 
   Devices*/

/**
  * @brief Macro used by the assert_param function in order to check the used 
  *        Flag to clear
  */
#define RTC_FLAG_CLRBLE (RTC_FLAG_RSF | RTC_FLAG_ALRAF | RTC_FLAG_WUTF| RTC_FLAG_TAMP1F|RTC_FLAG_TAMP2F|RTC_FLAG_TAMP3F)
#define IS_RTC_CLEAR_FLAG(FLAG) (((FLAG) != RESET) && ((uint16_t)((FLAG) & (uint16_t)(~(RTC_FLAG_CLRBLE))) == RESET))

/**
  * @brief Macro used by the assert_param function in order to check the used 
  *       Interrupt to configure
  */
#define IS_RTC_CONFIG_IT(IT) (((uint16_t)(IT) != (uint8_t)RESET) && ((uint16_t)((uint16_t)(IT) & (uint16_t)(~(uint16_t)(RTC_IT_WUT|RTC_IT_ALRA|RTC_IT_TAMP))) == (uint8_t)RESET))

/**
  * @brief Macro used by the assert_param function in order to check the used 
  *        Interrupt to get
  */
#define IS_RTC_GET_IT(IT) (((IT) == RTC_IT_WUT) || \
                           ((IT) == RTC_IT_ALRA)|| \
                           ((IT) == RTC_IT_TAMP) )

/**
  * @brief Macro used by the assert_param function in order to check the used 
  *        Interrupt to clear
  */
#define IS_RTC_CLEAR_IT(IT)  (((IT) != RESET) && ((uint16_t)((IT) & (uint16_t)(~(uint16_t)(RTC_IT_WUT|RTC_IT_ALRA|RTC_IT_TAMP))) == RESET))

/**
  * @brief Macro used by the assert_param function in order to check the used 
  *        Tamper Levels
  */
#define IS_RTC_TAMPER_LEVEL(LEVEL) (((LEVEL) == RTC_TamperLevel_Low) || \
                                    ((LEVEL) == RTC_TamperLevel_High))

/**
  * @brief Macro used by the assert_param function in order to check the used 
  *       Tamper
  */
#define NOT_CORRECT_TAMPER  (uint8_t)~(uint8_t)( RTC_Tamper_1 | \
                                                 RTC_Tamper_2 | \
                                                 RTC_Tamper_3)
#define IS_RTC_TAMPER(TAMPER) (((uint8_t)((TAMPER) & NOT_CORRECT_TAMPER) == RESET) && ((TAMPER) != RESET))

/**
  * @brief Macro used by the assert_param function in order to check the used 
  *        Tampers Filter
  */
#define IS_RTC_TAMPER_FILTER(SEL) (((SEL) == RTC_TamperFilter_1Sample) || \
                                   ((SEL) == RTC_TamperFilter_2Sample) || \
                                   ((SEL) == RTC_TamperFilter_4Sample) || \
                                   ((SEL) == RTC_TamperFilter_8Sample))

/**
  * @brief Macro used by the assert_param function in order to check the used 
  *        Tampers Sampling Frequencies
  */
#define IS_RTC_TAMPER_SAMPLING_FREQ(SEL) ((SEL) <= RTC_TamperSamplingFreq_RTCCLK_Div256)


/**
  * @brief Macro used by the assert_param function in order to check the used 
  *        Tampers Pins precharge duration
  */
#define IS_RTC_TAMPER_PINS_PRECHAR_DURATION(SEL) (((SEL) == RTC_TamperPrechargeDuration_None) || \
                                                  ((SEL) == RTC_TamperPrechargeDuration_1RTCCLK) || \
                                                  ((SEL) == RTC_TamperPrechargeDuration_2RTCCLK) || \
                                                  ((SEL) == RTC_TamperPrechargeDuration_4RTCCLK) || \
                                                  ((SEL) == RTC_TamperPrechargeDuration_8RTCCLK))

/**
  * @brief Macro used by the assert_param function in order to check the used 
  *        Smooth calibration period
  */
#define  IS_RTC_SMOOTH_CALIB_PERIOD(SEL) (((SEL) == RTC_SmoothCalibPeriod_32sec) || \
                                          ((SEL) == RTC_SmoothCalibPeriod_16sec) || \
                                          ((SEL) == RTC_SmoothCalibPeriod_8sec))
    
/**
  * @brief Macro used by the assert_param function in order to check the used 
  *        Smooth calibration Plus pulses
  */
#define  IS_RTC_SMOOTH_CALIB_PLUS(SEL) (((SEL) == RTC_SmoothCalibPlusPulses_Set) || \
                                        ((SEL) == RTC_SmoothCalibPlusPulses_Reset))
/**
  * @brief Macro used by the assert_param function in order to check the used  
  *        Smooth calibration Minus  pulses
  */
#define  IS_RTC_SMOOTH_CALIB_MINUS(VALUE) ((VALUE) <= 0x01FF)

/**
  * @brief Macro used by the assert_param function in order to check the used 
  *        Output Selection
  */
#define  IS_RTC_OUTPUT_SELECT(SEL) (((SEL) == RTC_Output_Disable) || \
                                    ((SEL) == RTC_Output_Alarm) || \
                                    ((SEL) == RTC_Output_WakeUp))

/**
  * @brief Macro used by the assert_param function in order to check the 
  *        used calibration Output Selection
  */
#define  IS_RTC_CALOUTPUT_SELECT(SEL) (((SEL) == RTC_CalibOutput_512Hz) || \
                                       ((SEL) == RTC_CalibOutput_1Hz))
                                       
/**
  * @brief Macro used by the assert_param function in order to check the used 
  *        Alarm sub second value
  */
#define IS_RTC_ALARM_SS_VALUE(SS) ((SS) <= 0x7FFF)

/**
  * @brief Macro used by the assert_param function in order to check the used 
  *        Alarm sub second mask
  */
#define IS_RTC_ALARM_SS_MASK(MASK) ((MASK) <= 0x0F)

/**
  * @brief Macro used by the assert_param function in order to check the used 
  *        fraction of seconds to sub
  */
#define IS_RTC_SHIFT_SUBFS(FS) ((FS) <= 0x7FFF)

/**
  * @brief Macro used by the assert_param function in order to check the 
  *        parameter of 1 second to add
  */
#define IS_RTC_SHIFT_ADD1S(VAL) (((VAL) == RTC_ShiftAdd1S_Set) || \
                                 ((VAL) == RTC_ShiftAdd1S_Reset))
                                 
/**
  * @}
  */
/* Exported functions ------------------------------------------------------- */

/*  Function used to set the RTC configuration to the default reset state *****/ 
ErrorStatus RTC_DeInit(void);

/* Initialization and Configuration functions *********************************/ 
ErrorStatus RTC_Init(RTC_InitTypeDef* RTC_InitStruct);
void RTC_StructInit(RTC_InitTypeDef* RTC_InitStruct);
void RTC_WriteProtectionCmd(FunctionalState NewState);
ErrorStatus RTC_EnterInitMode(void);
void RTC_ExitInitMode(void);
ErrorStatus RTC_WaitForSynchro(void);
void RTC_RatioCmd(FunctionalState NewState);
void RTC_BypassShadowCmd(FunctionalState NewState);

/* Time and Date configuration functions **************************************/ 
ErrorStatus RTC_SetTime(RTC_Format_TypeDef RTC_Format, RTC_TimeTypeDef* RTC_TimeStruct);
void RTC_TimeStructInit(RTC_TimeTypeDef* RTC_TimeStruct);
void RTC_GetTime(RTC_Format_TypeDef RTC_Format, RTC_TimeTypeDef* RTC_TimeStruct);
uint16_t RTC_GetSubSecond(void);
ErrorStatus RTC_SetDate(RTC_Format_TypeDef RTC_Format, RTC_DateTypeDef* RTC_DateStruct);
void RTC_DateStructInit(RTC_DateTypeDef* RTC_DateStruct);
void RTC_GetDate(RTC_Format_TypeDef RTC_Format, RTC_DateTypeDef* RTC_DateStruct);

/* Alarm configuration functions  *********************************************/ 
void RTC_SetAlarm(RTC_Format_TypeDef RTC_Format,  RTC_AlarmTypeDef* RTC_AlarmStruct);
void RTC_AlarmStructInit(RTC_AlarmTypeDef* RTC_AlarmStruct);
void RTC_GetAlarm(RTC_Format_TypeDef RTC_Format,  RTC_AlarmTypeDef* RTC_AlarmStruct);
ErrorStatus RTC_AlarmCmd(FunctionalState NewState);
ErrorStatus RTC_AlarmSubSecondConfig(uint16_t RTC_AlarmSubSecondValue,
                                     RTC_AlarmSubSecondMask_TypeDef RTC_AlarmSubSecondMask);

/* WakeUp Timer configuration functions ***************************************/ 
void RTC_WakeUpClockConfig(RTC_WakeUpClock_TypeDef RTC_WakeUpClock);
void RTC_SetWakeUpCounter(uint16_t RTC_WakeupCounter);
uint16_t RTC_GetWakeUpCounter(void);
ErrorStatus RTC_WakeUpCmd(FunctionalState NewState);

/* Daylight Saving configuration functions ************************************/ 
void RTC_DayLightSavingConfig(RTC_DayLightSaving_TypeDef RTC_DayLightSaving,
                              RTC_StoreOperation_TypeDef RTC_StoreOperation);
RTC_StoreOperation_TypeDef  RTC_GetStoreOperation(void);

/* Output pin Configuration function ******************************************/ 
void RTC_OutputConfig(RTC_Output_TypeDef RTC_Output,
                      RTC_OutputPolarity_TypeDef RTC_OutputPolarity);

/* Shift control  synchronisation function ************************************/ 
ErrorStatus RTC_SynchroShiftConfig(RTC_ShiftAdd1S_TypeDef RTC_ShiftAdd1S,
                                   uint16_t RTC_ShiftSubFS);

/* Smooth Calibration functions  **********************************************/
ErrorStatus RTC_SmoothCalibConfig(RTC_SmoothCalibPeriod_TypeDef RTC_SmoothCalibPeriod,
                                  RTC_SmoothCalibPlusPulses_TypeDef RTC_SmoothCalibPlusPulses,
                                  uint16_t RTC_SmouthCalibMinusPulsesValue);

/* Calibration configuration functions ****************************************/ 
void RTC_CalibOutputConfig(RTC_CalibOutput_TypeDef RTC_CalibOutput);
void RTC_CalibOutputCmd(FunctionalState NewState);

/* Tampers configuration functions ********************************************/ 
void RTC_TamperLevelConfig(RTC_Tamper_TypeDef RTC_Tamper,
                           RTC_TamperLevel_TypeDef RTC_TamperLevel);
void RTC_TamperFilterConfig(RTC_TamperFilter_TypeDef RTC_TamperFilter);
void RTC_TamperSamplingFreqConfig(RTC_TamperSamplingFreq_TypeDef RTC_TamperSamplingFreq);
void RTC_TamperPinsPrechargeDuration(RTC_TamperPrechargeDuration_TypeDef RTC_TamperPrechargeDuration);
void RTC_TamperCmd(RTC_Tamper_TypeDef RTC_Tamper,
                   FunctionalState NewState);

/* Interrupts and flags management functions **********************************/ 
void RTC_ITConfig(RTC_IT_TypeDef RTC_IT, FunctionalState NewState);
FlagStatus RTC_GetFlagStatus(RTC_Flag_TypeDef RTC_FLAG);
void RTC_ClearFlag(RTC_Flag_TypeDef RTC_FLAG);
ITStatus RTC_GetITStatus(RTC_IT_TypeDef RTC_IT);
void RTC_ClearITPendingBit(RTC_IT_TypeDef RTC_IT);

#endif /*__STM8L15x_RTC_H */

/**
  * @}
  */
  
/**
  * @}
  */

/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
