#ifndef __LKS32MC09X_TIMER_H__
#define __LKS32MC09X_TIMER_H__

#include "lks32mc09x_reg.h"

/**
 * @brief Timer初始化结构体
 */
typedef struct
{
    uint8_t EN;             ///< 定时器使能，ENABLE使能，DISABLE失能，影响timer的cnt是否计数
    uint32_t CAP1_CLR_EN;   ///< 当发生CAP1捕获事件时，清零 Timer 计数器，高有效
    uint32_t CAP0_CLR_EN;   ///< 当发生CAP0捕获事件时，清零 Timer 计数器，高有效
    uint32_t ONE_TRIG;      ///< 单次发送模式，此位需要在Timer比较模式下使用，且对应定时器使能需设置为0
    uint32_t CENTER;        ///< 中心计数模式使能,0:Timer向上从0计数至TH，然后回0，或Timer向下从TH计数至0，然后回到TH，1:Timer向上从0计数至TH，然后向下计数至0
    uint32_t DIR;           ///< 0:0->TH 递增计数，1：TH->递减计数
    uint32_t ClockDiv;      ///< Timer计数器频率配置,0:1分频,1:2分频,2:4分频,3:8分频,4:16分频,5:32分频,6:64分频,7:128分频
    uint32_t ETON;          ///< Timer计数器计数外部启动使能,0: 自动运行,1:外部事件触发计数
    uint32_t GATE_EN;       ///< Timer暂停使能，0：不暂停 1:当外部信号为低时，Timer暂停计数，外部信号根据TIMER1_EVT.EVT_SRC 进行选择
    uint32_t RL_EN;         ///< Timer重装使能,0：禁用外部事件重装，1：使能外部事件重装
    uint32_t XCLK_EN;       ///< Timer时钟源,0: 芯片内部时钟,1:外部时钟
    uint32_t SRC1;          ///< Timer 捕获模式通道1信号来源,0:Timer通道0输入信号,1:Timer通道1输入信号,2:CLU0输出信号,3:CLU1输出信号,4:CLU2输出信号,5:CLU3输出信号,6:比较器0输出信号,7:比较器1输出信号,8:比较器2输出信号,9:Timer通道0和1的异或信号
    uint32_t CH1Output;     ///< Timer 通道1在比较模式下的输出极性控制，当计数器 CNT<CMP1时的输出值，0：低电平，1：高电平
    uint32_t CH1_WorkMode;  ///< Timer 通道1的工作模式选择,0: 比较模式 ,1: 捕获模式
    uint32_t CH1_FE_CAP_EN; ///< Timer通道1下降沿捕获事件使能,1:使能,0:关闭
    uint32_t CH1_RE_CAP_EN; ///< Timer通道1上升沿捕获事件使能,1:使能,0:关闭
    uint32_t SRC0;          ///< Timer 捕获模式通道0信号来源
    uint32_t CH0Output;     ///< Timer 通道0在比较模式下的输出极性控制，当计数器 CNT<CMP1时的输出值，0：低电平，1：高电平
    uint32_t CH0_WorkMode;  ///< Timer 通道0的工作模式选择,0: 比较模式 ,1: 捕获模式
    uint32_t CH0_FE_CAP_EN; ///< Timer通道0下升沿捕获事件使能,1:使能,0:关闭
    uint32_t CH0_RE_CAP_EN; ///< Timer通道0上升沿捕获事件使能,1:使能,0:关闭
    uint32_t TH;            ///< Timer计数器计数门限
    uint32_t CNT;           ///< Timer计数器当前计数值
    uint32_t CHN0;          ///< 通道0比较捕获寄存器
    uint32_t CHN1;          ///< 通道1比较捕获寄存器
    uint32_t EVT;           ///< Timer外部事件选择
    uint32_t FLT;           ///< 通道0/1信号滤波宽度选择。取值范围0~255,滤波公式=Timer_FLT*8*定时器时钟
    uint32_t IE;            ///< 中断使能
    // 注意：以下配置项仅timer0和timer1有效
    uint32_t CMP0_TRIGGER_MODE; ///< 0：通道0比较事件在CNT递增或递减均产生adc触发信号，1递增时触发，2递减时触发
    uint32_t CMP1_TRIGGER_MODE; ///< 0：通道1比较事件在CNT递增或递减均产生adc触发信号，1递增时触发，2递减时触发
    uint32_t SHADOW;            ///< 0：软件写入TH/CMP0/CMP1 时直接更新对应的影子寄存器，1：启用影子寄存器，软件写入 TH/CMP0/CMP1 时进仅仅更新预装载值，当Timer发生过零事件时才将预装载值写入影子寄存器
    uint32_t CH1_DEFAULT;       ///< 定时器0发生Fail事件MOE清零后，CH1通道输出值
    uint32_t CH0_DEFAULT;       ///< 定时器0发生Fail事件MOE清零后，CH0通道输出值
    uint32_t HALT_PRT;          ///< MCU 进入HALT状态，Timer输出值选择。1:正常输出；0:输出 CH1_DEFAULT 和 CH0_DEFAULT。
    uint32_t FAIL_SEL;          ///< FAIL信号选择，0：TIMER0_FAIL，来自GPIO，1：CLU0输出
    uint32_t FAIL_POL;          ///< FAIL信号极性,0：高电平FAIL,1：低电平FAIL
    uint32_t FAIL_EN;           ///< FAIL 信号使能,0：禁用 FAIL,1：使能 FAIL
    uint32_t MOE;               ///< TIMER 通道 0/1 输出使能 1:输出正常信号 0:输出 CH0_DEFAULT 和 CH1_DEFAULT 默认值
} TIMER_TimerInitTypeDef;

#define TIMER_IF_FAIL            BIT3 /// TIMER FAIL 事件中断使能，高电平有效。
#define TIMER_IF_ZC              BIT2 /// TIMER CNT 过 0 中断使能，高电平有效。
#define TIMER_IF_CH1             BIT1 /// TIMER 通道 1 比较/捕获中断使能，高电平有效。
#define TIMER_IF_CH0             BIT0 /// TIMER 通道 0 比较/捕获中断使能，高电平有效。

#define TIMER_CH_MODE_CMP        0 // 比较模式
#define TIMER_CH_MODE_CAP        1 // 捕获模式
#define TIMER_CH_MODE_Comparison 0 // 比较模式
#define TIMER_CH_MODE_Capture    1 // 捕获模式
/**
 * timer时间统计，开始(复位timer计数值)
 */
#define TIMER_StatisticsStart(TIMERx) TIMERx->CNT = 0
/**
 * timer时间统计，结束
 * @return 时间统计值
 */
#define TIMER_StatisticsStop(TIMERx) (TIMERx->CNT)
/**
 * @brief Timer初始化
 * @param TIMERx Timer实例指针
 * @param TIMER_InitStruct Timer初始化结构体指针
 */
void TIMER_Init(TIMER_TypeDef *TIMERx, TIMER_TimerInitTypeDef *TIMER_InitStruct);

/**
 * @brief Timer结构体初始化
 * @param TIMER_InitStruct Timer初始化结构体指针
 */
void TIMER_StructInit(TIMER_TimerInitTypeDef *TIMER_InitStruct);

/**
 * @brief Timer使能/失能
 * @param TIMERx Timer实例指针
 * @param state 使能或失能状态
 */
void TIMER_TimerCmd(TIMER_TypeDef *TIMERx, uint8_t state);

/**
 * @brief 设置Timer通道0比较值
 * @param TIMERx Timer实例指针
 * @param temp 比较值
 */
void TIMER_CMP0(TIMER_TypeDef *TIMERx, uint32_t temp);

/**
 * @brief 设置Timer通道1比较值
 * @param TIMERx Timer实例指针
 * @param temp 比较值
 */
void TIMER_CMP1(TIMER_TypeDef *TIMERx, uint32_t temp);

/**
 * @brief 获取Timer通道0比较值
 * @param TIMERx Timer实例指针
 * @return 比较值
 */
uint32_t TIMER_Timer_GetCMPT0(TIMER_TypeDef *TIMERx);

/**
 * @brief 获取Timer通道1比较值
 * @param TIMERx Timer实例指针
 * @return 比较值
 */
uint32_t TIMER_Timer_GetCMPT1(TIMER_TypeDef *TIMERx);

/**
 * @brief 清除Timer中断标志
 * @param TIMERx Timer实例指针
 * @param tempFlag 要清除的中断标志
 */
void TIMER_ClearIRQFlag(TIMER_TypeDef *TIMERx, uint32_t tempFlag);

/**
 * @brief 获取Timer中断标志状态
 * @param TIMERx Timer实例指针
 * @param TIMER_IF_x 中断标志位
 * @return 中断标志状态
 */
uint16_t TIMER_GetIRQFlag(TIMER_TypeDef *TIMERx, uint32_t TIMER_IF_x);

/**
 * @brief 获取Timer状态标志
 * @param TIMERx Timer实例指针
 * @param TIMER_IF_x 状态标志位
 * @return 状态标志
 */
uint16_t TIMER_GetFlag(TIMER_TypeDef *TIMERx, uint32_t TIMER_IF_x);

/**
 * @brief 获取Timer当前计数值
 * @param TIMERx Timer实例指针
 * @return 当前计数值
 */
uint32_t TIMER_Timer_GetCount(TIMER_TypeDef *TIMERx);

/**
 * @brief 使能Timer
 * @param TIMERx Timer实例指针
 */
void TIMER_Enable(TIMER_TypeDef *TIMERx);

/**
 * @brief 失能Timer
 * @param TIMERx Timer实例指针
 */
void TIMER_Disable(TIMER_TypeDef *TIMERx);

/**
 * @brief 设置输出状态
 * @param TIMERx Timer实例指针
 * @param state 输出状态，0关闭pwm输出，其他值，打开pwm输出
 */
void TIMER_SetOutputState(TIMER_TypeDef *TIMERx, uint8_t state);
#endif
