/***********************************************************************
 * Copyright (c)  2017 - 2022, Unicmicro Co.,Ltd .
 * All rights reserved.
 * Filename    : gtimer.h
 * Description : gtimer driver header file
 * Author(s)   : Sissi
 * version     : V1.0
 * Modify date : 2022-08-08
 ***********************************************************************/
#ifndef __GTIMER_H__
#define __GTIMER_H__

#include "um321xF.h"

//GTIMER时钟使能
#define GTIMER0_CLKEN	        		(1<<9)		    //GTIMER0时钟使能
#define GTIMER1_CLKEN		        	(1<<2)		    //GTIMER1时钟使能
#define GTIMER2_CLKEN	        		(1<<3)		    //GTIMER2时钟使能

//GTIMER复位
#define GTIMER0_RESET	        		(1<<9)		    //GTIMER0复位
#define GTIMER1_RESET		        	(1<<2)		    //GTIMER1复位
#define GTIMER2_RESET	        		(1<<3)		    //GTIMER2复位

/********        GTIM_IER寄存器         ********/
#define VAL_GTIM_UIE	        		(1<<0)		    //UPTADE事件中断
#define VAL_GTIM_CCIE		        	(1<<1)		    //捕捉/比较事件中断
#define VAL_GTIM_BKE_IE	            	(1<<2)		    //刹车事件中断

/********        GTIM_SR寄存器         ********/
#define VAL_GTIM_SRCLEAR	        	(0x7 )		    //清除所有中断标志
#define VAL_GTIM_UIF	        		(1<<0)		    //UPTADE事件中断标志
#define VAL_GTIM_CCIF		        	(1<<1)		    //捕捉/比较事件中断标志
#define VAL_GTIM_BKEF	        		(1<<2)		    //刹车事件中断标志

/********        GTIM_EGR寄存器         ********/
#define VAL_EGR	        			   	(0x1)		    //产生Update事件

/********        GTIM_CR寄存器         ********/
#define VAL_GTIM_ADC_HDT	        	(1<<28)		    //ADC硬件触发功能使能
#define VAL_GTIM_OPA_BKEN	        	(1<<27)		    //OPA作为刹车源使能
#define VAL_GTIM_COMP2_BKEN	      		(1<<26)		    //COMP2作为刹车源使能
#define VAL_GTIM_COMP1_BKEN	      		(1<<25)		    //COMP1作为刹车源使能
#define VAL_GTIM_COMP0_BKEN	      		(1<<24)		    //COMP0作为刹车源使能
#define VAL_GTIM_LVD_BKEN	        	(1<<23)		    //LVD作为刹车源使能
#define VAL_GTIM_BREAK2_SEL	        	(1<<22)		    //选择Gtimer配置的IO作为刹车源
#define VAL_GTIM_BREAK1_SEL	        	(1<<21)		    //选择Gtimer配置的IO作为刹车源
#define VAL_GTIM_GTIMER_BK	        	(0<<21)		    //选择各自的GTIMER_BK IO作为刹车源

#define VAL_GTIM_PWMN_IDLE	        	(1<<20)		    //PWM输出负向电平IDLE状态 为高电平
#define VAL_GTIM_PWMP_IDLE          	(1<<19)		    //PWM输出正向电平IDLE状态 为高电平

#define VAL_GTIM_MOE_ENABLE				(1<<18)			//输出总使能

#define VAL_GTIM_PWMN_B_S	        	(1<<16)		    //PWM刹车触发后，PWM互补电平状态设置位 为高电平
#define VAL_GTIM_PWMS_B_S           	(1<<14)		    //PWM刹车触发后，PWM正向电平状态设置位 为高电平

#define VAL_GTIM_SOFT_BK				(1<<13)				//软件触发刹车功能

#define VAL_GTIM_CEN_ALL				(1<<12)				//同时使能Atimer,Btimer,Gtimer0/1/2和LPTIM0/1/2的CEN位为1
#define VAL_GTIM_CEN_ALL_EN		    	(1<<3)				//当前Gtimer可以被CEN_ALL控制

#define VAL_GTIM_BKE_POL_LOW			(1<<11)				//刹车信号低电平有效
#define VAL_GTIM_BKE_POL_HIGH			(0<<11)				//刹车信号高电平有效

#define VAL_GTIM_BKE			    	(1<<10)				//刹车功能使能

#define VAL_GTIM_PWM_DEAD_ENABLE		(1<< 9)				//避免死区功能使能

#define VAL_GTIM_PWM_INV_ENABLE			(1<< 8)				//互补PWM和原PWM反相位

#define VAL_GTIM_UE_TRGO				(1<< 7)				//UE信号被用作TRGO
#define VAL_GTIM_OC1REF_TRGO			(0<< 7)			    //OC1REF用作TRGO

#define VAL_GTIM_PRELOAD_ENABLE		    (1<< 6)				//ARR寄存器使能preload
#define VAL_GTIM_PRELOAD_DISABLE		(0<< 6)				//ARR寄存器不使能preload

#define VAL_GTIM_EDGE_ALIGN			    (0<< 4)				//边沿对齐模式
#define VAL_GTIM_CENTRAL_ALIGN1			(1<< 4)				//中央对齐模式1，输出比较中断标志仅在计数器向下计数的过程中置位
#define VAL_GTIM_CENTRAL_ALIGN2			(2<< 4)			    //中央对齐模式2，输出比较中断标志仅在计数器向上计数的过程中置位
#define VAL_GTIM_CENTRAL_ALIGN3		    (3<< 4)				//中央对齐模式3，输出比较中断标志在计数器向上向下计数的过程中都会置位

#define VAL_GTIM_EDGE_DIR_UP		    (0<< 2)			  	//边沿模式向上计数
#define VAL_GTIM_EDGE_DIR_DOWN		    (1<< 2)			  	//边沿模式向下计数

#define VAL_GTIM_OPM_ENABLE			    (1<< 1)			  	//Update Event发生时计数器停止（自动清零CEN）
#define VAL_GTIM_CEN				    (1<< 0)			  	//计数器使能

/********        GTIM_CCMR寄存器         ********/
#define VAL_GTIM_CAPCLR				    (1<<15)			  	//计数器使能后保持为0，直到捕捉到第一个沿开始计数

#define VAL_GTIM_CAPSSEL_GTIMERx_CH		(0<< 8)		    	//GTIMERx_CH作为捕捉源 x：0,1,2
#define VAL_GTIM_CAPSSEL_UARTx_RX		(1<< 8)		    	//UARTx_RX作为捕捉源   x：0,1
#define VAL_GTIM_CAPSSEL_I2C_SCL		(1<< 8)		    	//I2C_SCL作为GTIMER2的捕捉源
#define VAL_GTIM_CAPSSEL_LPTIMx_LPOUT	(2<< 8)				//LPTIMx_LPOUT作为捕捉源 x：0,1,2
#define VAL_GTIM_CAPSSEL_CLK32K			(3<< 8)		    	//CLK32K作为捕捉源

#define VAL_GTIM_ICPSC_DIV1				(0<<13)				//捕捉源1分频
#define VAL_GTIM_ICPSC_DIV2				(1<<13)				//捕捉源2分频
#define VAL_GTIM_ICPSC_DIV4				(2<<13)				//捕捉源4分频
#define VAL_GTIM_ICPSC_DIV8				(3<<13)				//捕捉源8分频

#define VAL_GTIM_CAPEDGE_UP				(0<<10)				//捕捉源上升沿触发
#define VAL_GTIM_CAPEDGE_DOWN			(1<<10)				//捕捉源下降沿触发
#define VAL_GTIM_CAPEDGE_UP_DOWN		(2<<10)				//捕捉源上升或下降沿触发

#define VAL_GTIM_TFLT_ENABLE			(1<< 7)				//外部计数源滤波使能
#define VAL_GTIM_TEDGE_UP				(0<< 6)				//计数源上升沿计数
#define VAL_GTIM_TEDGE_DOWN			    (1<< 6)				//计数源下降沿计数

#define VAL_GTIM_TSSEL_APBCLK		  	(0<< 4)				//APBCLK作为计数时钟源
#define VAL_GTIM_TSSEL_TRGO 		  	(1<< 4)				//TRGO信号触发计数
#define VAL_GTIM_TSSEL_CLK32K		  	(2<< 4)				//CLK32K作为计数时钟源
#define VAL_GTIM_TSSEL_GTIMER_CH		(3<< 4)				//外部时钟源作为计数时钟源

#define VAL_GTIM_TSSEL_GTIMER2_TRGO		(1<< 4)		  		//GTIMER2 TRGO作为GTIMER0计数时钟源
#define VAL_GTIM_TSSEL_GTIMER0_TRGO		(1<< 4)		  		//GTIMER0 TRGO作为GTIMER1计数时钟源
#define VAL_GTIM_TSSEL_GTIMER1_TRGO		(1<< 4)		  		//GTIMER1 TRGO作为GTIMER2计数时钟源

#define VAL_GTIM_CCS_OUTPUT				(0<< 0)				//CC通道配置为输出
#define VAL_GTIM_CCS_INPUT				(1<< 0)				//CC通道配置为输入

#define VAL_GTIM_CCS	        		(1<< 0)	    		//CC通道方向选择

/********        GTIM_CCER寄存器         ********/
#define VAL_GTIM_CCP_HIGH				(0<< 1)				//CNT<CCR时输出高电平
#define VAL_GTIM_CCP_LOW				(1<< 1)				//CNT>CCR时输出高电平
#define VAL_GTIM_CCE_ENABLE				(1<< 0)				//捕捉/比较输出使能

#define GTIM_MOE_ENABLE						(1)
#define GTIM_MOE_DISABLE					(0)

#define GTIM_SOFT_BK_ENABLE					(1)
#define GTIM_SOFT_BK_DISABLE				(0)

#define GTIM_IRQ_ENABLE						(1)
#define GTIM_IRQ_DISABLE					(0)

#define GTIM_UE_IRQ							(1)
#define GTIM_COMP_IRQ						(2)
#define GTIM_CAP_IRQ						(3)
#define GTIM_BKE_IRQ						(4)

/************************************************************************
 * Function   	: gtimer0_count_init
 * Description	: gtimer0定时器初始化
 * Input 		: uint8_t  clk_src 	 计数时钟源选择
 *            	  uint16_t arr 		 重载值设置
 *			  	  uint16_t psc 		 预分频值设置
 * Output 		: none
 * Return		: none
 ************************************************************************/
void gtimer0_count_init(uint8_t clk_src,uint16_t arr,uint16_t psc);

/************************************************************************
 * Function   	: gtimer0_pwm_init
 * Description	: gtimer0 PWM输出初始化
 * Input 		: uint8_t  clk_src 	计数时钟源选择
 *            	  uint16_t arr 		重载值设置
 *				  uint16_t arr 		比较值设置
 *			  	  uint16_t psc 		预分频值设置
 * Output 		: none
 * Return		: none
 ************************************************************************/
void gtimer0_pwm_init(uint8_t clk_src,uint32_t arr,uint32_t ccr,uint16_t psc);

/************************************************************************
 * Function   	: gtimer0_capture_init
 * Description	: gtimer0 输入捕获初始化
 * Input 		: uint8_t  clk_src 	   计数时钟源选择
 *            	  uint16_t arr 		   重载值设置
 *			  	  uint16_t psc 		   预分频值设置
 *                uint8_t  cap_div     捕捉源分频设置
 * Output 		: none
 * Return		: none
 ************************************************************************/
void gtimer0_capture_init(uint8_t clk_src,uint16_t arr,uint16_t psc,uint16_t cap_div);

/************************************************************************
 * Function   	: gtimer0_bke_init
 * Description	: gtimer0硬件刹车初始化
 * Input 		: uint32_t bke_src	 刹车源设置
 *            	  uint32_t bke_pol	 刹车信号触发极性
 * Output 		: none
 * Return		: none
 ************************************************************************/
void gtimer0_bke_init(uint32_t bke_src,uint32_t bke_pol);

/************************************************************************
 * Function   	: gtimer0_irq_init
 * Description	: gtimer0中断初始化
 * Input 		: uint8_t irq_enable        中断使能开关 1：使能 0：禁止
				  uint8_t gtimer_irq_type 	中断类型选择
 *            	  void (*pfunc)()		    中断回调函数
 * Output 		: none
 * Return		: none
 ************************************************************************/	
void gtimer0_irq_init(uint8_t irq_enable,uint8_t gtimer_irq_type,void (*pfunc)());

/************************************************************************
 * Function   	: gtimer0_start
 * Description	: 启动gtimer0计数
 * Input 		: none
 * Output 		: none
 * Return		: none
 ************************************************************************/	
void gtimer0_start(void);

/************************************************************************
 * Function   	: gtimer0_moe_set
 * Description	: gtimer0通道输出使能开关
 * Input 		: uint8_t moe_enable	1:使能输出 0：关闭输出
 * Output 		: none
 * Return		: none
 ************************************************************************/
void gtimer0_moe_set(uint8_t moe_enable);


/************************************************************************
 * Function   	: gtimer1_count_init
 * Description	: gtimer1定时器初始化
 * Input 		: uint8_t  clk_src 	 计数时钟源选择
 *            	  uint16_t arr 		 重载值设置
 *			  	  uint16_t psc 		 预分频值设置
 * Output 		: none
 * Return		: none
 ************************************************************************/
void gtimer1_count_init(uint8_t clk_src,uint16_t arr,uint16_t psc);

/************************************************************************
 * Function   	: gtimer1_pwm_init
 * Description	: gtimer1 PWM输出初始化
 * Input 		: uint8_t  clk_src 	计数时钟源选择
 *            	  uint16_t arr 		重载值设置
 *				  uint16_t arr 		比较值设置
 *			  	  uint16_t psc 		预分频值设置
 * Output 		: none
 * Return		: none
 ************************************************************************/
void gtimer1_pwm_init(uint8_t clk_src,uint16_t arr,uint16_t ccr,uint16_t psc);

/************************************************************************
 * Function   	: gtimer1_capture_init
 * Description	: gtimer1 输入捕获初始化
 * Input 		: uint8_t  clk_src 	   计数时钟源选择
 *            	  uint16_t arr 		   重载值设置
 *			  	  uint16_t psc 		   预分频值设置
 *                uint8_t  cap_div     捕捉源分频设置
 * Output 		: none
 * Return		: none
 ************************************************************************/
void gtimer1_capture_init(uint8_t clk_src,uint16_t arr,uint16_t psc,uint8_t cap_div);

/************************************************************************
 * Function   	: gtimer1_bke_init
 * Description	: gtimer1 硬件刹车初始化
 * Input 		: uint32_t bke_src	 刹车源设置
 *            	  uint32_t bke_pol	 刹车信号触发极性
 * Output 		: none
 * Return		: none
 ************************************************************************/
void gtimer1_bke_init(uint32_t bke_src,uint32_t bke_pol);

/************************************************************************
 * Function   	: gtimer1_irq_init
 * Description	: gtimer1 中断初始化
 * Input 		: uint8_t irq_enable        中断使能开关 1：使能 0：禁止
				  uint8_t gtimer_irq_type 	中断类型选择
 *            	  void (*pfunc)()		    中断回调函数
 * Output 		: none
 * Return		: none
 ************************************************************************/	
void gtimer1_irq_init(uint8_t irq_enable,uint8_t gtimer_irq_type,void (*pfunc)());

/************************************************************************
 * Function   	: gtimer1_start
 * Description	: 启动gtimer1计数
 * Input 		: none
 * Output 		: none
 * Return		: none
 ************************************************************************/	
void gtimer1_start(void);

/************************************************************************
 * Function   	: gtimer1_moe_set
 * Description	: gtimer1通道输出使能开关
 * Input 		: uint8_t moe_enable	1:使能输出 0：关闭输出
 * Output 		: none
 * Return		: none
 ************************************************************************/
void gtimer1_moe_set(uint8_t moe_enable);


/************************************************************************
 * Function   	: gtimer2_count_init
 * Description	: gtimer2定时器初始化
 * Input 		: uint8_t  clk_src 	 计数时钟源选择
 *            	  uint16_t arr 		 重载值设置
 *			  	  uint16_t psc 		 预分频值设置
 * Output 		: none
 * Return		: none
 ************************************************************************/
void gtimer2_count_init(uint8_t clk_src,uint16_t arr,uint16_t psc);

/************************************************************************
 * Function   	: gtimer2_pwm_init
 * Description	: gtimer2 PWM输出初始化
 * Input 		: uint8_t  clk_src 	计数时钟源选择
 *            	  uint16_t arr 		重载值设置
 *				  uint16_t arr 		比较值设置
 *			  	  uint16_t psc 		预分频值设置
 * Output 		: none
 * Return		: none
 ************************************************************************/
void gtimer2_pwm_init(uint8_t clk_src,uint16_t arr,uint16_t ccr,uint16_t psc);

/************************************************************************
 * Function   	: gtimer2_capture_init
 * Description	: gtimer2 输入捕获初始化
 * Input 		: uint8_t  clk_src 	   计数时钟源选择
 *            	  uint16_t arr 		   重载值设置
 *			  	  uint16_t psc 		   预分频值设置
 *                uint8_t  cap_div     捕捉源分频设置
 * Output 		: none
 * Return		: none
 ************************************************************************/
void gtimer2_capture_init(uint8_t clk_src,uint16_t arr,uint16_t psc,uint8_t cap_div);

/************************************************************************
 * Function   	: gtimer2_bke_init
 * Description	: gtimer2硬件刹车初始化
 * Input 		: uint32_t bke_src	 刹车源设置
 *            	  uint32_t bke_pol	 刹车信号触发极性
 * Output 		: none
 * Return		: none
 ************************************************************************/
void gtimer2_bke_init(uint32_t bke_src,uint32_t bke_pol);

/************************************************************************
 * Function   	: gtimer2_irq_init
 * Description	: gtimer2中断初始化
 * Input 		: uint8_t irq_enable        中断使能开关 1：使能 0：禁止
				  uint8_t gtimer_irq_type 	中断类型选择
 *            	  void (*pfunc)()		    中断回调函数
 * Output 		: none
 * Return		: none
 ************************************************************************/	
void gtimer2_irq_init(uint8_t irq_enable,uint8_t gtimer_irq_type,void (*pfunc)());

/************************************************************************
 * Function   	: gtimer2_start
 * Description	: 启动gtimer2计数
 * Input 		: none
 * Output 		: none
 * Return		: none
 ************************************************************************/	
void gtimer2_start(void);

/************************************************************************
 * Function   	: gtimer2_moe_set
 * Description	: gtimer2通道输出使能开关
 * Input 		: uint8_t moe_enable	1:使能输出 0：关闭输出
 * Output 		: none
 * Return		: none
 ************************************************************************/
void gtimer2_moe_set(uint8_t moe_enable);

#endif



