/**
  ******************************************************************************
  * @file    stm8l15x_tim2.h
  * @author  MCD Application Team
  * @version V1.6.0
  * @date    28-June-2013
  * @brief   This file contains all the functions prototypes for the TIM2 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_TIM2_H
#define __STM8L15x_TIM2_H


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

/** @addtogroup STM8L15x_StdPeriph_Driver
  * @{
  */
  
/** @addtogroup TIM2
  * @{
  */
   
/* Exported types ------------------------------------------------------------*/

/** @defgroup TIM2_Exported_Types
  * @{
  */

/** @defgroup TIM2_Forced_Action
  * @{
  */
typedef enum
{
  TIM2_ForcedAction_Active   = ((uint8_t)0x50),   /*!< Output Reference is forced low */
  TIM2_ForcedAction_Inactive = ((uint8_t)0x40)    /*!< Output Reference is forced high */
}
TIM2_ForcedAction_TypeDef;

/**
  * @}
  */
  
/** @defgroup TIM2_Prescaler
  * @{
  */
typedef enum
{
  TIM2_Prescaler_1     = ((uint8_t)0x00),   /*!< Time base Prescaler = 1 (No effect)*/
  TIM2_Prescaler_2     = ((uint8_t)0x01),   /*!< Time base Prescaler = 2 */
  TIM2_Prescaler_4     = ((uint8_t)0x02),   /*!< Time base Prescaler = 4 */
  TIM2_Prescaler_8     = ((uint8_t)0x03),   /*!< Time base Prescaler = 8 */
  TIM2_Prescaler_16    = ((uint8_t)0x04),   /*!< Time base Prescaler = 16 */
  TIM2_Prescaler_32    = ((uint8_t)0x05),   /*!< Time base Prescaler = 32 */
  TIM2_Prescaler_64    = ((uint8_t)0x06),   /*!< Time base Prescaler = 64 */
  TIM2_Prescaler_128   = ((uint8_t)0x07)    /*!< Time base Prescaler = 128 */
}TIM2_Prescaler_TypeDef;

/**
  * @}
  */
  
/** @defgroup TIM2_OCMode
  * @{
  */
typedef enum
{
  TIM2_OCMode_Timing    = ((uint8_t)0x00),   /*!< Timing (Frozen) Mode*/
  TIM2_OCMode_Active    = ((uint8_t)0x10),   /*!< Active Mode*/
  TIM2_OCMode_Inactive  = ((uint8_t)0x20),   /*!< Inactive Mode*/
  TIM2_OCMode_Toggle    = ((uint8_t)0x30),   /*!< Toggle Mode*/
  TIM2_OCMode_PWM1      = ((uint8_t)0x60),   /*!< PWM Mode 1*/
  TIM2_OCMode_PWM2      = ((uint8_t)0x70)    /*!< PWM Mode 2*/
}TIM2_OCMode_TypeDef;

/**
  * @}
  */
  
/** @defgroup TIM2_OnePulseMode
  * @{
  */
typedef enum
{
  TIM2_OPMode_Single      = ((uint8_t)0x01), /*!< Single one Pulse mode (OPM Active) */
  TIM2_OPMode_Repetitive  = ((uint8_t)0x00)  /*!< Repetitive Pulse mode (OPM inactive) */
}TIM2_OPMode_TypeDef;

/**
  * @}
  */
  
/** @defgroup TIM2_Channel
  * @{
  */
typedef enum
{
  TIM2_Channel_1  = ((uint8_t)0x00),  /*!< Channel 1*/
  TIM2_Channel_2  = ((uint8_t)0x01)   /*!< Channel 2*/
}TIM2_Channel_TypeDef;

/**
  * @}
  */
  
/** @defgroup TIM2_CounterMode
  * @{
  */
typedef enum
{
  TIM2_CounterMode_Up               = ((uint8_t)0x00),   /*!< Counter Up Mode */
  TIM2_CounterMode_Down             = ((uint8_t)0x10),   /*!< Counter Down Mode */
  TIM2_CounterMode_CenterAligned1   = ((uint8_t)0x20),   /*!< Counter Central aligned Mode 1 */
  TIM2_CounterMode_CenterAligned2   = ((uint8_t)0x40),   /*!< Counter Central aligned Mode 2 */
  TIM2_CounterMode_CenterAligned3   = ((uint8_t)0x60)    /*!< Counter Central aligned Mode 3 */
}TIM2_CounterMode_TypeDef;

/**
  * @}
  */
  
/** @defgroup TIM2_Output_Compare_Polarity
  * @{
  */
typedef enum
{
  TIM2_OCPolarity_High   = ((uint8_t)0x00),   /*!< Output compare polarity  = High */
  TIM2_OCPolarity_Low    = ((uint8_t)0x01)    /*!< Output compare polarity  = Low */
}TIM2_OCPolarity_TypeDef;

/**
  * @}
  */
  
/** @defgroup TIM2_Output_State
  * @{
  */
typedef enum
{
  TIM2_OutputState_Disable   = ((uint8_t)0x00),   /*!< Output compare State disabled (channel output disabled) */
  TIM2_OutputState_Enable    = ((uint8_t)0x01)    /*!< Output compare State enabled (channel output enabled) */
}TIM2_OutputState_TypeDef;

/**
  * @}
  */
  
/** @defgroup TIM2_Break_State
  * @{
  */
typedef enum
{
  TIM2_BreakState_Disable  = ((uint8_t)0x00),   /*!< Break State disabled (break option disabled) */
  TIM2_BreakState_Enable   = ((uint8_t)0x10)    /*!< Break State enabled (break option enabled) */

}TIM2_BreakState_TypeDef;

/**
  * @}
  */
  
/** @defgroup TIM2_Break_Polarity
  * @{
  */
typedef enum
{
  TIM2_BreakPolarity_High  = ((uint8_t)0x20),  /*!< if Break, channel polarity = High */
  TIM2_BreakPolarity_Low   = ((uint8_t)0x00)   /*!< if Break, channel polarity = Low */

}TIM2_BreakPolarity_TypeDef;

/**
  * @}
  */
  
/** @defgroup TIM2_Automatic_Output
  * @{
  */  
typedef enum
{
  TIM2_AutomaticOutput_Enable    = ((uint8_t)0x40),   /*!< Automatic Output option enabled */
  TIM2_AutomaticOutput_Disable   = ((uint8_t)0x00)    /*!< Automatic Output option disabled */
}TIM2_AutomaticOutput_TypeDef;

/**
  * @}
  */
  
/** @defgroup TIM2_Lock_Level
  * @{
  */
typedef enum
{
  TIM2_LockLevel_Off  = ((uint8_t)0x00),   /*!< Lock option disabled */
  TIM2_LockLevel_1    = ((uint8_t)0x01),   /*!< Select Lock Level 1  */
  TIM2_LockLevel_2    = ((uint8_t)0x02),   /*!< Select Lock Level 2  */
  TIM2_LockLevel_3    = ((uint8_t)0x03)    /*!< Select Lock Level 3  */
}TIM2_LockLevel_TypeDef;

/**
  * @}
  */
  
/** @defgroup TIM2_OSSI_State
  * @{
  */
typedef enum
{
  TIM2_OSSIState_Enable    = ((uint8_t)0x04),   /*!< Off-State Selection for Idle mode enabled  */
  TIM2_OSSIState_Disable   = ((uint8_t)0x00)    /*!< Off-State Selection for Idle mode disabled  */
}TIM2_OSSIState_TypeDef;

/**
  * @}
  */
  
/** @defgroup TIM2_Output_Compare_Idle_state
  * @{
  */
typedef enum
{
  TIM2_OCIdleState_Reset  = ((uint8_t)0x00),   /*!< Output Compare Idle state  = Reset */
  TIM2_OCIdleState_Set    = ((uint8_t)0x01)    /*!< Output Compare Idle state  = Set */
}TIM2_OCIdleState_TypeDef;

/**
  * @}
  */
  
/** @defgroup TIM2_Input_Capture_Polarity
  * @{
  */
typedef enum
{
  TIM2_ICPolarity_Rising   = ((uint8_t)0x00),   /*!< Input Capture on Rising Edge*/
  TIM2_ICPolarity_Falling  = ((uint8_t)0x01)    /*!< Input Capture on Falling Edge*/
}TIM2_ICPolarity_TypeDef;

/**
  * @}
  */
  
/** @defgroup TIM2_Input_Capture_Selection
  * @{
  */
typedef enum
{
  TIM2_ICSelection_DirectTI    = ((uint8_t)0x01),   /*!< Input Capture mapped on the direct input*/
  TIM2_ICSelection_IndirectTI  = ((uint8_t)0x02),   /*!< Input Capture mapped on the indirect input*/
  TIM2_ICSelection_TRGI        = ((uint8_t)0x03)    /*!< Input Capture mapped on the Trigger Input*/
}TIM2_ICSelection_TypeDef;

/**
  * @}
  */
  
/** @defgroup TIM2_Input_Capture_Prescaler
  * @{
  */
typedef enum
{
  TIM2_ICPSC_DIV1  = ((uint8_t)0x00),  /*!< Input Capture Prescaler = 1 (one capture every 1 event) */
  TIM2_ICPSC_DIV2  = ((uint8_t)0x04),  /*!< Input Capture Prescaler = 2 (one capture every 2 events) */
  TIM2_ICPSC_DIV4  = ((uint8_t)0x08),  /*!< Input Capture Prescaler = 4 (one capture every 4 events) */
  TIM2_ICPSC_DIV8  = ((uint8_t)0x0C)   /*!< Input Capture Prescaler = 8 (one capture every 8 events) */
}TIM2_ICPSC_TypeDef;

/**
  * @}
  */
  
/** @defgroup TIM2_Interrupts
  * @{
  */
typedef enum
{
  TIM2_IT_Update   = ((uint8_t)0x01),   /*!< Update Interrupt*/
  TIM2_IT_CC1      = ((uint8_t)0x02),   /*!< Capture Compare Channel1 Interrupt*/
  TIM2_IT_CC2      = ((uint8_t)0x04),   /*!< Capture Compare Channel2 Interrupt*/
  TIM2_IT_Trigger  = ((uint8_t)0x40),   /*!< Trigger  Interrupt*/
  TIM2_IT_Break    = ((uint8_t)0x80)    /*!< Break Interrupt*/
}TIM2_IT_TypeDef;

/**
  * @}
  */
  
/** @defgroup TIM2_External_Trigger_Prescaler
  * @{
  */
typedef enum
{
  TIM2_ExtTRGPSC_OFF   = ((uint8_t)0x00),   /*!< No External Trigger prescaler  */
  TIM2_ExtTRGPSC_DIV2  = ((uint8_t)0x10),   /*!< External Trigger prescaler = 2 (ETRP frequency divided by 2) */
  TIM2_ExtTRGPSC_DIV4  = ((uint8_t)0x20),   /*!< External Trigger prescaler = 4 (ETRP frequency divided by 4) */
  TIM2_ExtTRGPSC_DIV8  = ((uint8_t)0x30)    /*!< External Trigger prescaler = 8 (ETRP frequency divided by 8) */
}TIM2_ExtTRGPSC_TypeDef;

/**
  * @}
  */
  
/** @defgroup TIM2_Internal_Trigger_Selection
  * @{
  */
typedef enum
{
  TIM2_TRGSelection_TIM4     = ((uint8_t)0x00),  /*!< TRIG Input source =  TIM TRIG Output  */
  TIM2_TRGSelection_TIM1     = ((uint8_t)0x10),  /*!< TRIG Input source =  TIM TRIG Output  */
  TIM2_TRGSelection_TIM3     = ((uint8_t)0x20),  /*!< TRIG Input source =  TIM TRIG Output  */
  TIM2_TRGSelection_TIM5     = ((uint8_t)0x30),  /*!< TRIG Input source =  TIM TRIG Output  */
  TIM2_TRGSelection_TI1F_ED  = ((uint8_t)0x40),  /*!< TRIG Input source = TI1F_ED (TI1 Edge Detector)  */
  TIM2_TRGSelection_TI1FP1   = ((uint8_t)0x50),  /*!< TRIG Input source = TI1FP1 (Filtred Timer Input 1) */
  TIM2_TRGSelection_TI2FP2   = ((uint8_t)0x60),  /*!< TRIG Input source = TI2FP2 (Filtred Timer Input 2)  */
  TIM2_TRGSelection_ETRF     = ((uint8_t)0x70)   /*!< TRIG Input source =  ETRF (External Trigger Input ) */
}TIM2_TRGSelection_TypeDef;

/**
  * @}
  */
  
/** @defgroup TIM2_TI_External_Clock_Source
  * @{
  */
typedef enum
{
  TIM2_TIxExternalCLK1Source_TI1ED  = ((uint8_t)0x40),   /*!< External Clock mode 1 source = TI1ED */
  TIM2_TIxExternalCLK1Source_TI1    = ((uint8_t)0x50),   /*!< External Clock mode 1 source = TI1 */
  TIM2_TIxExternalCLK1Source_TI2    = ((uint8_t)0x60)    /*!< External Clock mode 1 source = TI2 */
}TIM2_TIxExternalCLK1Source_TypeDef;

/**
  * @}
  */
  
/** @defgroup TIM2_External_Trigger_Polarity
  * @{
  */
typedef enum
{
  TIM2_ExtTRGPolarity_Inverted     = ((uint8_t)0x80),   /*!< External Trigger Polarity = inverted */
  TIM2_ExtTRGPolarity_NonInverted  = ((uint8_t)0x00)    /*!< External Trigger Polarity = non inverted */
}TIM2_ExtTRGPolarity_TypeDef;

/**
  * @}
  */
  
/** @defgroup TIM2_Prescaler_Reload_Mode
  * @{
  */
typedef enum
{
  TIM2_PSCReloadMode_Update      = ((uint8_t)0x00),   /*!< Prescaler value is reloaded at every update*/
  TIM2_PSCReloadMode_Immediate   = ((uint8_t)0x01)    /*!< Prescaler value is reloaded immediatly*/
}TIM2_PSCReloadMode_TypeDef;

/**
  * @}
  */
  
/** @defgroup TIM2_Encoder_Mode
  * @{
  */
typedef enum
{
  TIM2_EncoderMode_TI1     = ((uint8_t)0x01),   /*!< Encoder mode 1*/
  TIM2_EncoderMode_TI2     = ((uint8_t)0x02),   /*!< Encoder mode 2*/
  TIM2_EncoderMode_TI12    = ((uint8_t)0x03)    /*!< Encoder mode 3*/
}TIM2_EncoderMode_TypeDef;

/**
  * @}
  */
  
/** @defgroup TIM2_Event_Source
  * @{
  */
typedef enum
{
  TIM2_EventSource_Update   = ((uint8_t)0x01),   /*!< Update Event*/
  TIM2_EventSource_CC1      = ((uint8_t)0x02),   /*!< Capture Compare Channel1  Event*/
  TIM2_EventSource_CC2      = ((uint8_t)0x04),   /*!< Capture Compare Channel2 Event*/
  TIM2_EventSource_Trigger  = ((uint8_t)0x40),   /*!< Trigger Event*/
  TIM2_EventSource_Break    = ((uint8_t)0x80)    /*!< Break Event*/
}TIM2_EventSource_TypeDef;

/**
  * @}
  */
  
/** @defgroup TIM2_Update_Source
  * @{
  */
typedef enum
{
  TIM2_UpdateSource_Global   = ((uint8_t)0x00),   /*!< Global Update request source */
  TIM2_UpdateSource_Regular  = ((uint8_t)0x01)    /*!< Regular Update request source */
}TIM2_UpdateSource_TypeDef;

/**
  * @}
  */
  
/** @defgroup TIM2_Trigger_Output_Source
  * @{
  */
typedef enum
{
  TIM2_TRGOSource_Reset    = ((uint8_t)0x00),   /*!< Trigger Output source = Reset*/
  TIM2_TRGOSource_Enable   = ((uint8_t)0x10),   /*!< Trigger Output source = TIM2 is enabled*/
  TIM2_TRGOSource_Update   = ((uint8_t)0x20),   /*!< Trigger Output source = Update event*/
  TIM2_TRGOSource_OC1      = ((uint8_t)0x30),   /*!< Trigger Output source = output compare channel1  */
  TIM2_TRGOSource_OC1REF   = ((uint8_t)0x40),   /*!< Trigger Output source = output compare channel 1 reference */
  TIM2_TRGOSource_OC2REF   = ((uint8_t)0x50)    /*!< Trigger Output source = output compare channel 2 reference */
}TIM2_TRGOSource_TypeDef;

/**
  * @}
  */
  
/** @defgroup TIM2_Slave_Mode
  * @{
  */
typedef enum
{
  TIM2_SlaveMode_Reset      = ((uint8_t)0x04),  /*!< Slave Mode Selection  = Reset*/
  TIM2_SlaveMode_Gated      = ((uint8_t)0x05),  /*!< Slave Mode Selection  = Gated*/
  TIM2_SlaveMode_Trigger    = ((uint8_t)0x06),  /*!< Slave Mode Selection  = Trigger*/
  TIM2_SlaveMode_External1  = ((uint8_t)0x07)   /*!< Slave Mode Selection  = External 1*/
}TIM2_SlaveMode_TypeDef;

/**
  * @}
  */
  
/** @defgroup TIM2_Flags
  * @{
  */
typedef enum
{
  TIM2_FLAG_Update   = ((uint16_t)0x0001),  /*!< Update Flag */
  TIM2_FLAG_CC1      = ((uint16_t)0x0002),  /*!< Capture compare 1 Flag */
  TIM2_FLAG_CC2      = ((uint16_t)0x0004),  /*!< Capture compare 2 Flag */
  TIM2_FLAG_Trigger  = ((uint16_t)0x0040),  /*!< Trigger Flag */
  TIM2_FLAG_Break    = ((uint16_t)0x0080),  /*!< Break Flag */
  TIM2_FLAG_CC1OF    = ((uint16_t)0x0200),  /*!< Capture compare 1 over capture Flag */
  TIM2_FLAG_CC2OF    = ((uint16_t)0x0400)   /*!< Capture compare 2 over capture Flag */
}TIM2_FLAG_TypeDef;

/**
  * @}
  */
  
/** @defgroup TIM2_DMA_Source_Requests
  * @{
  */
typedef enum
{
  TIM2_DMASource_Update   = ((uint8_t)0x01),  /*!< TIM2 DMA Update Request*/
  TIM2_DMASource_CC1      = ((uint8_t)0x02),  /*!< TIM2 DMA CC1 Request*/
  TIM2_DMASource_CC2      = ((uint8_t)0x04)   /*!< TIM2 DMA CC2 Request*/
}TIM2_DMASource_TypeDef;

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

/* Exported constants --------------------------------------------------------*/
/* Exported macros -----------------------------------------------------------*/

/** @defgroup TIM2_Exported_Macros
  * @{
  */

/**
  * @brief Macro used by the assert function to check the different functions parameters.
  */

/**
  * @brief Macro TIM2 Forced Action
  */
#define IS_TIM2_FORCED_ACTION(ACTION) \
  (((ACTION) == TIM2_ForcedAction_Active) || \
   ((ACTION) == TIM2_ForcedAction_Inactive))

/**
  * @brief Macro TIM2 Prescaler
  */
#define IS_TIM2_PRESCALER(PRESCALER) \
  (((PRESCALER) == TIM2_Prescaler_1)  || \
   ((PRESCALER) == TIM2_Prescaler_2)  || \
   ((PRESCALER) == TIM2_Prescaler_4)  || \
   ((PRESCALER) == TIM2_Prescaler_8)  || \
   ((PRESCALER) == TIM2_Prescaler_16) || \
   ((PRESCALER) == TIM2_Prescaler_32) || \
   ((PRESCALER) == TIM2_Prescaler_64) || \
   ((PRESCALER) == TIM2_Prescaler_128))

/**
  * @brief Macro TIM2 Output Compare and PWM modes
  */
#define IS_TIM2_OC_MODE(MODE) \
  (((MODE) ==  TIM2_OCMode_Timing)  || \
   ((MODE) == TIM2_OCMode_Active)   || \
   ((MODE) == TIM2_OCMode_Inactive) || \
   ((MODE) == TIM2_OCMode_Toggle)   || \
   ((MODE) == TIM2_OCMode_PWM1)     || \
   ((MODE) == TIM2_OCMode_PWM2))

#define IS_TIM2_OCM(MODE) \
  (((MODE) ==  TIM2_OCMode_Timing)  || \
   ((MODE) == TIM2_OCMode_Active)   || \
   ((MODE) == TIM2_OCMode_Inactive) || \
   ((MODE) == TIM2_OCMode_Toggle)   || \
   ((MODE) == TIM2_OCMode_PWM1)     || \
   ((MODE) == TIM2_OCMode_PWM2)     || \
   ((MODE) == (uint8_t)TIM2_ForcedAction_Active) || \
   ((MODE) == (uint8_t)TIM2_ForcedAction_Inactive))
/**
  * @brief Macro TIM2 One Pulse Mode
  */
#define IS_TIM2_OPM_MODE(MODE) \
  (((MODE) == TIM2_OPMode_Single) || \
   ((MODE) == TIM2_OPMode_Repetitive))

/**
  * @brief Macro TIM2 Channel
  */
#define IS_TIM2_CHANNEL(CHANNEL) \
  (((CHANNEL) == TIM2_Channel_1) || \
   ((CHANNEL) == TIM2_Channel_2) )

/**
  * @brief Macro TIM2 Counter Mode
  */
#define IS_TIM2_COUNTER_MODE(MODE) \
  (((MODE) == TIM2_CounterMode_Up)   || \
   ((MODE) == TIM2_CounterMode_Down) || \
   ((MODE) == TIM2_CounterMode_CenterAligned1) || \
   ((MODE) == TIM2_CounterMode_CenterAligned2) || \
   ((MODE) == TIM2_CounterMode_CenterAligned3))

/**
  * @brief Macro TIM2 Output Compare Polarity
  */
#define IS_TIM2_OC_POLARITY(POLARITY) \
  (((POLARITY) == TIM2_OCPolarity_High) || \
   ((POLARITY) == TIM2_OCPolarity_Low))

/**
  * @brief Macro TIM2 Output Compare states
  */
#define IS_TIM2_OUTPUT_STATE(STATE) \
  (((STATE) == TIM2_OutputState_Disable) || \
   ((STATE) == TIM2_OutputState_Enable))

/**
 * @brief Macro Break Input enable/disable
 */
#define IS_TIM2_BREAK_STATE(STATE) \
  (((STATE) == TIM2_BreakState_Enable) || \
   ((STATE) == TIM2_BreakState_Disable))

/**
  * @brief Macro Break Polarity
  */
#define IS_TIM2_BREAK_POLARITY(POLARITY) \
  (((POLARITY) == TIM2_BreakPolarity_Low) || \
   ((POLARITY) == TIM2_BreakPolarity_High))

/**
  * @brief Macro TIM2 AOE Bit Set/Reset
  */
#define IS_TIM2_AUTOMATIC_OUTPUT_STATE(STATE) \
  (((STATE) == TIM2_AutomaticOutput_Enable) || \
   ((STATE) == TIM2_AutomaticOutput_Disable))

/**
  * @brief Macro Lock levels
  */
#define IS_TIM2_LOCK_LEVEL(LEVEL) \
  (((LEVEL) == TIM2_LockLevel_Off) || \
   ((LEVEL) == TIM2_LockLevel_1)   || \
   ((LEVEL) == TIM2_LockLevel_2)   || \
   ((LEVEL) == TIM2_LockLevel_3))

/**
  * @brief Macro OSSI: Off-State Selection for Idle mode states
  */
#define IS_TIM2_OSSI_STATE(STATE) \
  (((STATE) == TIM2_OSSIState_Enable) || \
   ((STATE) == TIM2_OSSIState_Disable))

/**
  * @brief Macro TIM2 OC IDLE STATE
  */
#define IS_TIM2_OCIDLE_STATE(STATE) \
  (((STATE) == TIM2_OCIdleState_Set) || \
   ((STATE) == TIM2_OCIdleState_Reset))

/**
  * @brief Macro TIM2 IC POLARITY
  */

#define IS_TIM2_IC_POLARITY(POLARITY) \
  (((POLARITY) == TIM2_ICPolarity_Rising) || \
   ((POLARITY) == TIM2_ICPolarity_Falling))

/**
  * @brief Macro TIM2 IC SELECTION
  */
#define IS_TIM2_IC_SELECTION(SELECTION) \
  (((SELECTION) == TIM2_ICSelection_DirectTI)   || \
   ((SELECTION) == TIM2_ICSelection_IndirectTI) || \
   ((SELECTION) == TIM2_ICSelection_TRGI))

/**
  * @brief Macro TIM2 IC PRESCALER
  */
#define IS_TIM2_IC_PRESCALER(PRESCALER) \
  (((PRESCALER) == TIM2_ICPSC_DIV1) || \
   ((PRESCALER) == TIM2_ICPSC_DIV2) || \
   ((PRESCALER) == TIM2_ICPSC_DIV4) || \
   ((PRESCALER) == TIM2_ICPSC_DIV8))

/**
  * @brief Macro TIM2 Input Capture Filter Value
  */
#define IS_TIM2_IC_FILTER(ICFILTER) \
  ((ICFILTER) <= 0x0F)

/**
  * @brief Macro TIM2 Interrupts
  */
#define IS_TIM2_IT(IT) \
  ((IT) != 0x00)

#define IS_TIM2_GET_IT(IT) \
  (((IT) == TIM2_IT_Update)  || \
   ((IT) == TIM2_IT_CC1)     || \
   ((IT) == TIM2_IT_CC2)     || \
   ((IT) == TIM2_IT_Trigger) || \
   ((IT) == TIM2_IT_Break))

/**
  * @brief Macro TIM2 external trigger prescaler
  */
#define IS_TIM2_EXT_PRESCALER(PRESCALER) \
  (((PRESCALER) == TIM2_ExtTRGPSC_OFF)  || \
   ((PRESCALER) == TIM2_ExtTRGPSC_DIV2) || \
   ((PRESCALER) == TIM2_ExtTRGPSC_DIV4) || \
   ((PRESCALER) == TIM2_ExtTRGPSC_DIV8))
/**
  * @brief Macro TIM2  Trigger Selection
  */
#define IS_TIM2_TRIGGER_SELECTION(SELECTION) \
  (((SELECTION) == TIM2_TRGSelection_TIM4) || \
   ((SELECTION) == TIM2_TRGSelection_TIM1) || \
   ((SELECTION) == TIM2_TRGSelection_TIM3) || \
   ((SELECTION) == TIM2_TRGSelection_TIM5) || \
   ((SELECTION) == TIM2_TRGSelection_TI1F_ED) || \
   ((SELECTION) == TIM2_TRGSelection_TI1FP1)  || \
   ((SELECTION) == TIM2_TRGSelection_TI2FP2)  || \
   ((SELECTION) == TIM2_TRGSelection_ETRF))


#define IS_TIM2_TIX_TRIGGER_SELECTION(SELECTION) \
  (((SELECTION) == TIM2_TRGSelection_TI1F_ED) || \
   ((SELECTION) == TIM2_TRGSelection_TI1FP1)  || \
   ((SELECTION) == TIM2_TRGSelection_TI2FP2))

/**
  * @brief Macro TIM2  TIx external Clock Selection
  */
#define IS_TIM2_TIXCLK_SOURCE(SOURCE)  \
  (((SOURCE) == TIM2_TIxExternalCLK1Source_TI1ED) || \
   ((SOURCE) == TIM2_TIxExternalCLK1Source_TI2)   || \
   ((SOURCE) == TIM2_TIxExternalCLK1Source_TI1))

/**
  * @brief Macro TIM2  Trigger Polarity
  */
#define IS_TIM2_EXT_POLARITY(POLARITY) \
  (((POLARITY) == TIM2_ExtTRGPolarity_Inverted) || \
   ((POLARITY) == TIM2_ExtTRGPolarity_NonInverted))

/**
  * @brief Macro TIM2 External Trigger Filter
  */
#define IS_TIM2_EXT_FILTER(EXTFILTER) \
  ((EXTFILTER) <= 0x0F)

/**
  * @brief Macro TIM2 Prescaler Reload
  */
#define IS_TIM2_PRESCALER_RELOAD(RELOAD) \
  (((RELOAD) == TIM2_PSCReloadMode_Update) || \
   ((RELOAD) == TIM2_PSCReloadMode_Immediate))

/**
  * @brief Macro TIM2 encoder mode
  */
#define IS_TIM2_ENCODER_MODE(MODE) \
  (((MODE) == TIM2_EncoderMode_TI1) || \
   ((MODE) == TIM2_EncoderMode_TI2) || \
   ((MODE) == TIM2_EncoderMode_TI12))

/**
  * @brief Macro TIM2 event source
  */
#define IS_TIM2_EVENT_SOURCE(SOURCE) \
  ((((SOURCE) & (uint8_t)0x18) == 0x00) && \
   ((SOURCE) != 0x00))

/**
  * @brief Macro TIM2 update source
  */
#define IS_TIM2_UPDATE_SOURCE(SOURCE) \
  (((SOURCE) == TIM2_UpdateSource_Global) || \
   ((SOURCE) == TIM2_UpdateSource_Regular))

/**
  * @brief Macro TIM2 TRGO source
  */
#define IS_TIM2_TRGO_SOURCE(SOURCE) \
  (((SOURCE) == TIM2_TRGOSource_Reset)  || \
   ((SOURCE) == TIM2_TRGOSource_Enable) || \
   ((SOURCE) == TIM2_TRGOSource_Update) || \
   ((SOURCE) == TIM2_TRGOSource_OC1)    || \
   ((SOURCE) == TIM2_TRGOSource_OC1REF) || \
   ((SOURCE) == TIM2_TRGOSource_OC2REF))
/**
  * @brief Macro TIM2 Slave mode
  */
#define IS_TIM2_SLAVE_MODE(MODE) \
  (((MODE) == TIM2_SlaveMode_Reset)   || \
   ((MODE) == TIM2_SlaveMode_Gated)   || \
   ((MODE) == TIM2_SlaveMode_Trigger) || \
   ((MODE) == TIM2_SlaveMode_External1))
/**
  * @brief Macro TIM2 Flags
  */
#define IS_TIM2_GET_FLAG(FLAG) \
  (((FLAG) == TIM2_FLAG_Update)  || \
   ((FLAG) == TIM2_FLAG_CC1)     || \
   ((FLAG) == TIM2_FLAG_CC2)     || \
   ((FLAG) == TIM2_FLAG_Trigger) || \
   ((FLAG) == TIM2_FLAG_Break)   || \
   ((FLAG) == TIM2_FLAG_CC1OF)   || \
   ((FLAG) == TIM2_FLAG_CC2OF))

#define IS_TIM2_CLEAR_FLAG(FLAG) \
  ((((FLAG) & (uint16_t)0xE100) == 0x0000) && ((FLAG) != 0x0000))

/**
  * @brief Macro TIM2 DMA sources
  */

#define IS_TIM2_DMA_SOURCE(SOURCE) \
  (((SOURCE) == TIM2_DMASource_Update) || \
   ((SOURCE) == TIM2_DMASource_CC1) || \
   ((SOURCE) == TIM2_DMASource_CC2))

/**
  * @}
  */

/* Exported functions ------------------------------------------------------- */
/* TimeBase management ********************************************************/
void TIM2_DeInit(void);
void TIM2_TimeBaseInit(TIM2_Prescaler_TypeDef TIM2_Prescaler,
                       TIM2_CounterMode_TypeDef TIM2_CounterMode, uint16_t TIM2_Period);
void TIM2_PrescalerConfig(TIM2_Prescaler_TypeDef Prescaler,
                          TIM2_PSCReloadMode_TypeDef TIM2_PSCReloadMode);
void TIM2_CounterModeConfig(TIM2_CounterMode_TypeDef TIM2_CounterMode);
void TIM2_SetCounter(uint16_t Counter);
void TIM2_SetAutoreload(uint16_t Autoreload);
uint16_t TIM2_GetCounter(void);
TIM2_Prescaler_TypeDef TIM2_GetPrescaler(void);
void TIM2_UpdateDisableConfig(FunctionalState NewState);
void TIM2_UpdateRequestConfig(TIM2_UpdateSource_TypeDef TIM2_UpdateSource);
void TIM2_ARRPreloadConfig(FunctionalState NewState);
void TIM2_SelectOnePulseMode(TIM2_OPMode_TypeDef TIM2_OPMode);
void TIM2_Cmd(FunctionalState NewState);

/* Output Compare management **************************************************/
void TIM2_OC1Init(TIM2_OCMode_TypeDef TIM2_OCMode,
                  TIM2_OutputState_TypeDef TIM2_OutputState,
                  uint16_t TIM2_Pulse,
                  TIM2_OCPolarity_TypeDef TIM2_OCPolarity,
                  TIM2_OCIdleState_TypeDef TIM2_OCIdleState);
void TIM2_OC2Init(TIM2_OCMode_TypeDef TIM2_OCMode,
                  TIM2_OutputState_TypeDef TIM2_OutputState,
                  uint16_t TIM2_Pulse,
                  TIM2_OCPolarity_TypeDef TIM2_OCPolarity,
                  TIM2_OCIdleState_TypeDef TIM2_OCIdleState);
void TIM2_BKRConfig(TIM2_OSSIState_TypeDef TIM2_OSSIState,
                    TIM2_LockLevel_TypeDef TIM2_LockLevel,
                    TIM2_BreakState_TypeDef TIM2_BreakState,
                    TIM2_BreakPolarity_TypeDef TIM2_BreakPolarity,
                    TIM2_AutomaticOutput_TypeDef TIM2_AutomaticOutput);
void TIM2_CtrlPWMOutputs(FunctionalState NewState);
void TIM2_SelectOCxM(TIM2_Channel_TypeDef TIM2_Channel, TIM2_OCMode_TypeDef TIM2_OCMode);
void TIM2_SetCompare1(uint16_t Compare);
void TIM2_SetCompare2(uint16_t Compare);
void TIM2_ForcedOC1Config(TIM2_ForcedAction_TypeDef TIM2_ForcedAction);
void TIM2_ForcedOC2Config(TIM2_ForcedAction_TypeDef TIM2_ForcedAction);
void TIM2_OC1PreloadConfig(FunctionalState NewState);
void TIM2_OC2PreloadConfig(FunctionalState NewState);
void TIM2_OC1FastConfig(FunctionalState NewState);
void TIM2_OC2FastConfig(FunctionalState NewState);
void TIM2_OC1PolarityConfig(TIM2_OCPolarity_TypeDef TIM2_OCPolarity);
void TIM2_OC2PolarityConfig(TIM2_OCPolarity_TypeDef TIM2_OCPolarity);
void TIM2_CCxCmd(TIM2_Channel_TypeDef TIM2_Channel, FunctionalState NewState);

/* Input Capture management ***************************************************/
void TIM2_ICInit(TIM2_Channel_TypeDef TIM2_Channel,
                 TIM2_ICPolarity_TypeDef TIM2_ICPolarity,
                 TIM2_ICSelection_TypeDef TIM2_ICSelection,
                 TIM2_ICPSC_TypeDef TIM2_ICPrescaler,
                 uint8_t TIM2_ICFilter);
void TIM2_PWMIConfig(TIM2_Channel_TypeDef TIM2_Channel,
                     TIM2_ICPolarity_TypeDef TIM2_ICPolarity,
                     TIM2_ICSelection_TypeDef TIM2_ICSelection,
                     TIM2_ICPSC_TypeDef TIM2_ICPrescaler,
                     uint8_t TIM2_ICFilter);
uint16_t TIM2_GetCapture1(void);
uint16_t TIM2_GetCapture2(void);
void TIM2_SetIC1Prescaler(TIM2_ICPSC_TypeDef TIM2_IC1Prescaler);
void TIM2_SetIC2Prescaler(TIM2_ICPSC_TypeDef TIM2_IC2Prescaler);

/* Interrupts, DMA and flags management ***************************************/
void TIM2_ITConfig(TIM2_IT_TypeDef TIM2_IT, FunctionalState NewState);
void TIM2_GenerateEvent(TIM2_EventSource_TypeDef TIM2_EventSource);
FlagStatus TIM2_GetFlagStatus(TIM2_FLAG_TypeDef TIM2_FLAG);
void TIM2_ClearFlag(TIM2_FLAG_TypeDef TIM2_FLAG);
ITStatus TIM2_GetITStatus(TIM2_IT_TypeDef TIM2_IT);
void TIM2_ClearITPendingBit(TIM2_IT_TypeDef TIM2_IT);
void TIM2_DMACmd(TIM2_DMASource_TypeDef TIM2_DMASource, FunctionalState NewState);
void TIM2_SelectCCDMA(FunctionalState NewState);

/* Clocks management **********************************************************/
void TIM2_InternalClockConfig(void);
void TIM2_TIxExternalClockConfig(TIM2_TIxExternalCLK1Source_TypeDef TIM2_TIxExternalCLKSource,
                                 TIM2_ICPolarity_TypeDef TIM2_ICPolarity,
                                 uint8_t ICFilter);
void TIM2_ETRClockMode1Config(TIM2_ExtTRGPSC_TypeDef TIM2_ExtTRGPrescaler,
                              TIM2_ExtTRGPolarity_TypeDef TIM2_ExtTRGPolarity,
                              uint8_t ExtTRGFilter);
void TIM2_ETRClockMode2Config(TIM2_ExtTRGPSC_TypeDef TIM2_ExtTRGPrescaler,
                              TIM2_ExtTRGPolarity_TypeDef TIM2_ExtTRGPolarity,
                              uint8_t ExtTRGFilter);

/* Synchronization management *************************************************/
void TIM2_SelectInputTrigger(TIM2_TRGSelection_TypeDef TIM2_InputTriggerSource);
void TIM2_SelectOutputTrigger(TIM2_TRGOSource_TypeDef TIM2_TRGOSource);
void TIM2_SelectSlaveMode(TIM2_SlaveMode_TypeDef TIM2_SlaveMode);
void TIM2_SelectMasterSlaveMode(FunctionalState NewState);
void TIM2_ETRConfig(TIM2_ExtTRGPSC_TypeDef TIM2_ExtTRGPrescaler,
                    TIM2_ExtTRGPolarity_TypeDef TIM2_ExtTRGPolarity,
                    uint8_t ExtTRGFilter);

/* Specific interface management **********************************************/
void TIM2_EncoderInterfaceConfig(TIM2_EncoderMode_TypeDef TIM2_EncoderMode,
                                 TIM2_ICPolarity_TypeDef TIM2_IC1Polarity,
                                 TIM2_ICPolarity_TypeDef TIM2_IC2Polarity);
void TIM2_SelectHallSensor(FunctionalState NewState);

#endif /* __STM8L15x_TIM2_H */

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

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