/***********************************************************************************************************
 * Copyright (c)  2021 - 2022, Unicmicro Co.,Ltd .
 * All rights reserved.
 * Filename    : lptimer.h
 * Description : lpTimer header file
 * Author(s)   : yanhaihua
 * Version     : V1.0
 * Modify date : 2021-09-23
 ***********************************************************************************************************/
#ifndef  __LPTIMER_H__
#define  __LPTIMER_H__

#include  "config.h"

#define VAL_LPTIM_LPTCFG_MASK						(uint32_t)(0x00000FFF)
																	
#define VAL_LPTIM_LPTCFG_TMODE_TIME					(uint32_t)(0x00000000)									/* 工作模式选择: 带波形输出的普通定时器模式 */
#define VAL_LPTIM_LPTCFG_TMODE_TRIGGER				(uint32_t)(0x00000001)									/* 工作模式选择: Trigger脉冲触发计数模式 */
#define VAL_LPTIM_LPTCFG_TMODE_EXT					(uint32_t)(0x00000002)									/* 工作模式选择: 外部异步脉冲计数模式 */
#define VAL_LPTIM_LPTCFG_TMODE_TIMEOUT				(uint32_t)(0x00000003)									/* 工作模式选择: Timeout模式 */
																											
#define VAL_LPTIM_LPTCFG_MODE_COUNT					(uint32_t)(0x00000000)									/* 计数模式: 连续计数模式 */
#define VAL_LPTIM_LPTCFG_MODE_ONCE					(uint32_t)(0x00000004)									/* 计数模式: 单次计数模式 */
																											
#define VAL_LPTIM_LPTCFG_PWM_CYCLE					(uint32_t)(0x00000000)									/* 脉宽调制模式: 周期方波输出模式 */
#define VAL_LPTIM_LPTCFG_PWM_PWM					(uint32_t)(0x00000008)									/* 脉宽调制模式: PWM输出模式 */
																											
#define VAL_LPTIM_LPTCFG_POLARITY_HIGHT				(uint32_t)(0x00000000)									/* 计数时钟分频选择: 正极性波形 */ 
#define VAL_LPTIM_LPTCFG_POLARITY_LOWER				(uint32_t)(0x00000010)									/* 计数时钟分频选择: 负极性波形 */
																											
#define VAL_LPTIM_LPTCFG_TRIGCFG_RISE				(uint32_t)(0x00000000)									/* 外部触发边沿选择: 外部输入信号上升沿trigger */
#define VAL_LPTIM_LPTCFG_TRIGCFG_FALL				(uint32_t)(0x00000020)									/* 外部触发边沿选择: 外部输入信号下降沿trigger */
#define VAL_LPTIM_LPTCFG_TRIGCFG_RISE_FALL			(uint32_t)(0x00000040)									/* 外部触发边沿选择: 外部输入信号上升下降沿trigger */
#define VAL_LPTIM_LPTCFG_TRIGCFG_RISE_FALL1			(uint32_t)(0x00000060)									/* 外部触发边沿选择: 外部输入信号上升下降沿trigger */
																											
#define VAL_LPTIM_LPTCFG_EDGESEL_RISE				(uint32_t)(0x00000000)									/* LPTIN输入边沿选择: LPTIN的上升沿计数 */
#define VAL_LPTIM_LPTCFG_EDGESEL_FALL				(uint32_t)(0x00000080)									/* LPTIN输入边沿选择: LPTIN的下降沿计数 */
																											
#define VAL_LPTIM_LPTCFG_CLKSEL_LSCLK				(uint32_t)(0x00000000)									/* 时钟源选择: LSCLK作为计数时钟 */
#define VAL_LPTIM_LPTCFG_CLKSEL_RCLP				(uint32_t)(0x00000100)									/* 时钟源选择: RCLP作为计数时钟 */
#define VAL_LPTIM_LPTCFG_CLKSEL_PCLK				(uint32_t)(0x00000200)									/* 时钟源选择: PCLK的门控时钟作为计数时钟 */ 
#define VAL_LPTIM_LPTCFG_CLKSEL_LPTIN				(uint32_t)(0x00000300)									/* 时钟源选择: LPTIN作为计数时钟 */
																											
#define VAL_LPTIM_LPTCFG_DIVSEL_DIV1				(uint32_t)(0x00000000)									/* 计数时钟分频选择: 1分频 */
#define VAL_LPTIM_LPTCFG_DIVSEL_DIV2				(uint32_t)(0x00000400)									/* 计数时钟分频选择: 2分频 */
#define VAL_LPTIM_LPTCFG_DIVSEL_DIV4				(uint32_t)(0x00000800)									/* 计数时钟分频选择: 4分频 */
#define VAL_LPTIM_LPTCFG_DIVSEL_DIV8				(uint32_t)(0x00000C00)									/* 计数时钟分频选择: 8分频 */
#define VAL_LPTIM_LPTCFG_DIVSEL_DIV16				(uint32_t)(0x00001000)									/* 计数时钟分频选择: 16分频 */
#define VAL_LPTIM_LPTCFG_DIVSEL_DIV32				(uint32_t)(0x00001400)									/* 计数时钟分频选择: 32分频 */
#define VAL_LPTIM_LPTCFG_DIVSEL_DIV64				(uint32_t)(0x00001800)									/* 计数时钟分频选择: 64分频 */
#define VAL_LPTIM_LPTCFG_DIVSEL_DIV128				(uint32_t)(0x00001C00)									/* 计数时钟分频选择: 128分频 */
																																																				
#define VAL_LPTIM_LPTIF_COMPIF						(uint32_t)(0x00000001)									/* 外部触发到来中断标志位，写1清零 */
#define VAL_LPTIM_LPTIF_OVIF						(uint32_t)(0x00000002)									/* 计数器溢出中断使能位，写1清零 */
#define VAL_LPTIM_LPTIF_TRIGIF						(uint32_t)(0x00000004)									/* 比较匹配中断使能位，写1清零 */
																																																			
#define VAL_LPTIM_LPTCTRL_LPTEN_DISABLE				(uint32_t)(0x00000000)									/* LPTIM使能位: 禁止计数器计数 */
#define VAL_LPTIM_LPTCTRL_LPTEN_ENABLE				(uint32_t)(0x00000001)									/* LPTIM使能位: 使能计数器计数 */
																										 
#define HIGH                   		 				1      													/* 计数值=比较值时输出上升沿 */
#define LOW                     	 				0      													/* 计数值=比较值时输出下降沿 */

typedef enum
{
	LPTIMER_IRQ_LPTIE_COMPIE						= 0,													/* 比较匹配中断使能位: 计数器值和比较值匹配中断禁止 */																										
	LPTIMER_IRQ_LPTIE_OVIE							= 1,													/* 计数器溢出中断使能位: 计数器溢出中断使能 */																										
	LPTIMER_IRQ_LPTIE_TRIGIE						= 2,													/* 外部触发到来中断使能位: 外部触发到来中断使能 */		
}em_lptimer_irq_t;

void lptimer0_count_init(uint32_t clock_source, uint32_t clock_div, uint16_t time);							/* 普通定时器计数 */
void lptimer0_count_once_init(uint32_t clock_source, uint32_t clock_div);
void lptimer0_set_target(uint16_t target);
void lptimer0_pwm_init(uint16_t cmp, uint16_t target, uint32_t clock_source, uint32_t clock_div, uint8_t level); 		/* PWM输出 */
void lptimer0_trigger_init(uint32_t clock_source, uint32_t clock_div, uint16_t target);						/* Trigger脉冲触发计数(输入捕获) */
void lptimer0_ext_count_init(uint32_t clock_source, uint32_t clock_div, uint16_t target);      				/* 外部异步脉冲计数模式 */
void lptimer0_time_out_init(uint32_t clock_source, uint32_t clock_div, uint16_t target);      				/* time out模式 */
void lptimer0_start(void);																					/* 启动定时器 */
void lptimer0_stop(void);			                														/* 停止定时器 */
void lptimer0_irq_init(em_enable_t irq_enable, em_lptimer_irq_t irq_type, void (*pfunc)());					/* 中断初始化 */

void lptimer1_count_init(uint32_t clock_source, uint32_t clock_div, uint16_t time);							/* 普通定时器计数 */
void lptimer1_pwm_init(uint16_t cmp, uint16_t target, uint32_t clock_source, uint32_t clock_div, uint8_t level); 			/* PWM输出 */
void lptimer1_trigger_init(uint32_t clock_source, uint32_t clock_div, uint16_t target);						/* Trigger脉冲触发计数(输入捕获) */
void lptimer1_ext_count_init(uint32_t clock_source, uint32_t clock_div, uint16_t target);      				/* 外部异步脉冲计数模式 */
void lptimer1_time_out_init(uint32_t clock_source, uint32_t clock_div, uint16_t target);      				/* time out模式 */
void lptimer1_start(void);																					/* 启动定时器 */
void lptimer1_stop(void);			                														/* 停止定时器 */
void lptimer1_irq_init(em_enable_t irq_enable, em_lptimer_irq_t irq_type, void (*pfunc)());					/* 中断初始化 */

void lptimer2_count_init(uint32_t clock_source, uint32_t clock_div, uint16_t time);							/* 普通定时器计数 */
void lptimer2_pwm_init(uint16_t cmp, uint16_t target, uint32_t clock_source, uint32_t clock_div, uint8_t level); 			/* PWM输出 */
void lptimer2_trigger_init(uint32_t clock_source, uint32_t clock_div, uint16_t target);						/* Trigger脉冲触发计数(输入捕获) */
void lptimer2_ext_count_init(uint32_t clock_source, uint32_t clock_div, uint16_t target);      				/* 外部异步脉冲计数模式 */
void lptimer2_time_out_init(uint32_t clock_source, uint32_t clock_div, uint16_t target);      				/* time out模式 */
void lptimer2_start(void);																					/* 启动定时器 */
void lptimer2_stop(void);			                														/* 停止定时器 */
void lptimer2_irq_init(em_enable_t irq_enable, em_lptimer_irq_t irq_type, void (*pfunc)());					/* 中断初始化 */

#endif
