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

#include  "system_um321xF.h"

#define VAL_LPTIM_IRQ_DISABLE             		(0)                     // LPTIMER中断禁止
#define VAL_LPTIM_IRQ_ENABLE            		(1)                     // LPTIMER中断使能

#define VAL_LPTIM_CR1_DISABLE			(uint32_t)(0x00000000)			// LPTIM使能位: 禁止计数器计数 
#define VAL_LPTIM_CR1_ENABLE			(uint32_t)(0x00000001)			// LPTIM使能位: 使能计数器计数 
		
#define VAL_LPTIM_CR2_TMODE_TIME			(uint32_t)(0<<0)			// 工作模式选择: 计数模式
#define VAL_LPTIM_CR2_TMODE_TRIGGER			(uint32_t)(1<<0)			// 工作模式选择: ETR脉冲触发计数模式
#define VAL_LPTIM_CR2_TMODE_EXT				(uint32_t)(2<<0)			// 工作模式选择: ETR脉冲计数模式 
#define VAL_LPTIM_CR2_TMODE_TIMEOUT			(uint32_t)(3<<0)			// 工作模式选择: Timeout模式
	
#define VAL_LPTIM_CR2_TRIGDGE_RISE			(uint32_t)(0<<2)			// 外部触发边沿选择: 外部输入信号上升沿trigger 
#define VAL_LPTIM_CR2_TRIGDGE_FALL			(uint32_t)(1<<2)			// 外部触发边沿选择: 外部输入信号下降沿trigger 
#define VAL_LPTIM_CR2_TRIGDGE_RISE_FALL		(uint32_t)(2<<2)			// 外部触发边沿选择: 外部输入信号上升下降沿trigger
#define VAL_LPTIM_CR2_TRIGDGE_RISE_FALL1    (uint32_t)(3<<2)			// 外部触发边沿选择: 外部输入信号上升下降沿trigger 
	
#define VAL_LPTIM_CR2_MODE_COUNT			(uint32_t)(0<<4)			// 计数模式: 连续计数模式 
#define VAL_LPTIM_CR2_MODE_ONCE				(uint32_t)(1<<4)			// 计数模式: 单次计数模式 
															
#define VAL_LPTIM_CR2_EDGESEL_RISE			(uint32_t)(0<<5)			// ETR 计数输入边沿上升沿
#define VAL_LPTIM_CR2_EDGESEL_FALL		    (uint32_t)(1<<5)			// ETR 计数输入边沿下降沿
		
#define VAL_LPTIM_CR2_CLKSEL_LSRC32K		(uint32_t)(0<<6)			// 时钟源选择: LPTCLK32K作为计数时钟
#define VAL_LPTIM_CR2_CLKSEL_RCLP			(uint32_t)(1<<6)			// 时钟源选择: 1hz作为计数时钟
#define VAL_LPTIM_CR2_CLKSEL_LPTCLK			(uint32_t)(2<<6)			// 时钟源选择: pclk作为计数时钟 
#define VAL_LPTIM_CR2_CLKSEL_LPTIN			(uint32_t)(3<<6)			// 时钟源选择: LPTIN作为计数时钟 
	
#define VAL_LPTIM_CR2_DIVSEL_DIV1			(uint32_t)(0<<8)			// 计数时钟分频选择: 1分频 
#define VAL_LPTIM_CR2_DIVSEL_DIV2			(uint32_t)(1<<8)			// 计数时钟分频选择: 2分频 
#define VAL_LPTIM_CR2_DIVSEL_DIV4			(uint32_t)(2<<8)			// 计数时钟分频选择: 4分频 
#define VAL_LPTIM_CR2_DIVSEL_DIV8			(uint32_t)(3<<8)			// 计数时钟分频选择: 8分频 
#define VAL_LPTIM_CR2_DIVSEL_DIV16			(uint32_t)(4<<8)			// 计数时钟分频选择: 16分频 
#define VAL_LPTIM_CR2_DIVSEL_DIV32			(uint32_t)(5<<8)			// 计数时钟分频选择: 32分频 
#define VAL_LPTIM_CR2_DIVSEL_DIV64			(uint32_t)(6<<8)			// 计数时钟分频选择: 64分频 
#define VAL_LPTIM_CR2_DIVSEL_DIV128			(uint32_t)(7<<8)			// 计数时钟分频选择: 128分频 
	
#define VAL_LPTIM_CR2_CAP1SRSEL_LPTCH1		(uint32_t)(0<<11)			// 通道1捕捉信号源选择：LPT_CH1
#define VAL_LPTIM_CR2_CAR1SRSEL_LSRC32K		(uint32_t)(1<<11)			// 通道1捕捉信号源选择：RCLP_1HZ
	
#define VAL_LPTIM_CR2_POLARITY_HIGHT		(uint32_t)(0x00000000)		// 计数时钟分频选择: 正极性波形 
#define VAL_LPTIM_CR2_POLARITY_LOWER		(uint32_t)(0x00000010)		// 计数时钟分频选择: 负极性波形 
	
#define VAL_LPTIM_CCE_ENABLE				(uint32_t)(1<<0)			// 捕获比较功能使能
#define VAL_LPTIM_CCE_DISABLE				(uint32_t)(0<<0)            // 捕获比较功能禁止

#define VAL_LPTIM_CCS_PWM					(uint32_t)(0<<1)			// 配置为输出PWM
#define VAL_LPTIM_CCS_CAP					(uint32_t)(1<<1)			// 配置为输入捕捉
	
#define VAL_LPTIM_CCP_POLAR1				(uint32_t)(0<<2)			// 比较输出波形极性1
#define VAL_LPTIM_CCP_POLAR2				(uint32_t)(1<<2)			// 比较输出波形极性2
	
#define VAL_LPTIM_CAPEDGE_UP				(uint32_t)(0<<4)			// 捕捉边沿选择上升沿
#define VAL_LPTIM_CAPEDGE_DOWN				(uint32_t)(1<<4)			// 捕捉边沿选择下降沿
#define VAL_LPTIM_CAPEDGE_UP_DOWN			(uint32_t)(2<<4)			// 捕捉边沿选择上升下降沿

/*******************************LPT0_IQR*****************************************/	
#define VAL_LPTIM0_IER_UIE					(uint32_t)(1<<0)			// 更新中断使能位 													   
#define VAL_LPTIM0_IER_CC1IE				(uint32_t)(1<<1)			// LPTIM0捕捉/比较通道1中断使能 									   
#define VAL_LPTIM0_IER_CC2IE				(uint32_t)(1<<2)			// LPTIM0捕捉/比较通道2中断使能
#define VAL_LPTIM0_IER_TIE					(uint32_t)(1<<3)			// 外部触发到来中断使能位: 外部触发到来中断使能
															
#define VAL_LPTIM0_SR_UIF					(uint32_t)(1<<0)			// LPTIM0更新中断标志，写1清零 
#define VAL_LPTIM0_SR_CC1IF					(uint32_t)(1<<1)			// LPTIM0捕捉/比较通道1中断标志，写1清零 
#define VAL_LPTIM0_SR_CC2IF					(uint32_t)(1<<2)			// LPTIM0捕捉/比较通道2中断标志，写1清零
#define VAL_LPTIM0_SR_TIF					(uint32_t)(1<<3)			// LPTIM0触发中断标志，写1清零 
	
/*******************************LPT1_IQR*****************************************/	
#define VAL_LPTIM1_IER_UIE					(uint32_t)(1<<4)			// 更新中断使能位 													   
#define VAL_LPTIM1_IER_CC1IE				(uint32_t)(1<<5)			// LPTIM1捕捉/比较通道1中断使能 								   
#define VAL_LPTIM1_IER_CC2IE				(uint32_t)(1<<6)			// LPTIM1捕捉/比较通道2中断使能 
#define VAL_LPTIM1_IER_TIE					(uint32_t)(1<<7)			// 外部触发到来中断使能位: 外部触发到来中断使能
					
#define VAL_LPTIM1_SR_UIF					(uint32_t)(1<<4)			// LPTIM1更新中断标志，写1清零  
#define VAL_LPTIM1_SR_CC1IF					(uint32_t)(1<<5)			// LPTIM1捕捉/比较通道1中断标志，写1清零
#define VAL_LPTIM1_SR_CC2IF					(uint32_t)(1<<6)			// LPTIM1捕捉/比较通道2中断标志，写1清零
#define VAL_LPTIM1_SR_TIF					(uint32_t)(1<<7)			// LPTIM1触发中断标志，写1清零 

/*******************************LPT2_IQR*****************************************/
#define VAL_LPTIM2_IER_UIE					(uint32_t)(1<<0)			// 更新中断使能位 													   
#define VAL_LPTIM2_IER_CC1IE				(uint32_t)(1<<1)			// LPTIM2捕捉/比较通道1中断使能 								   
#define VAL_LPTIM2_IER_CC2IE				(uint32_t)(1<<2)			// LPTIM2捕捉/比较通道2中断使能
#define VAL_LPTIM2_IER_TIE					(uint32_t)(1<<3)			// 外部触发到来中断使能位: 外部触发到来中断使能
														
#define VAL_LPTIM2_SR_UIF					(uint32_t)(1<<0)			// LPTIM2更新中断标志，写1清零  
#define VAL_LPTIM2_SR_CC1IF					(uint32_t)(1<<1)			// LPTIM2捕捉/比较通道1中断标志，写1清零
#define VAL_LPTIM2_SR_CC2IF					(uint32_t)(1<<2)			// LPTIM2捕捉/比较通道2中断标志，写1清零
#define VAL_LPTIM2_SR_TIF					(uint32_t)(1<<3)			// LPTIM2触发中断标志，写1清零 

/*******************************LPT3_IQR*****************************************/					
#define VAL_LPTIM3_IER_UIE					(uint32_t)(1<<4)			// 更新中断使能位 													   
#define VAL_LPTIM3_IER_CC1IE				(uint32_t)(1<<5)			// LPTIM3捕捉/比较通道1中断使能 								   
#define VAL_LPTIM3_IER_CC2IE				(uint32_t)(1<<6)			// LPTIM3捕捉/比较通道2中断使能 
#define VAL_LPTIM3_IER_TIE					(uint32_t)(1<<7)			// 外部触发到来中断使能位: 外部触发到来中断使能
					
#define VAL_LPTIM3_SR_UIF					(uint32_t)(1<<4)			// LPTIM3更新中断标志，写1清零  
#define VAL_LPTIM3_SR_CC1IF					(uint32_t)(1<<5)			// LPTIM3捕捉/比较通道1中断标志，写1清零
#define VAL_LPTIM3_SR_CC2IF					(uint32_t)(1<<6)			// LPTIM3捕捉/比较通道2中断标志，写1清零
#define VAL_LPTIM3_SR_TIF					(uint32_t)(1<<7)			// LPTIM3触发中断标志，写1清零 
/*******************************************************************
* function		: lptimer0_count_init
* description	: lptimer0_count_init  	LPTimer定时初始化
* input			: uint32_t clock_source	时钟源选择
*				  uint32_t clock_div	时钟源分频
*             	  uint32_t time			定时时间        	  
* return		: none
********************************************************************/
void lptimer0_count_init(uint32_t clock_source, uint32_t clock_div, uint32_t time);								  
/*******************************************************************
* function		: lptimer0_pwm_init
* description	: lptimer0_pwm_init     duty cyle（占空比） = (cmp / target) * 100% 
* input			: uint32_t cmp:  	            计数比较值		
*				  uint32_t target:              计数目标值
*            	  uint32_t clock_div  ：        计数时钟分频值
*            	  uint32_t clock_source  ：     计数时钟来源
* return		: none
********************************************************************/
void lptimer0_pwm_init(uint32_t cmp, uint32_t target, uint32_t clock_source, uint32_t clock_div); 		           
/*******************************************************************
* function		: lptimer0_capture_init
* description	: lptimer0_capture_init   lptimer 输入捕获初始化
* input			: uint32_t target:              计数目标值 
*				  uint32_t clock_div  ：        计数时钟分频值
*				  uint32_t clock_source  ：     计数时钟来源
* return		: none
********************************************************************/
void lptimer0_capture_init(uint32_t target, uint32_t clock_source, uint32_t clock_div);								
/*******************************************************************
* function		: lptimer0_trigger_init
* description	: lptimer0_trigger_init Trigger触发计数初始化
* input			: uint32_t target:              计数目标值
*				  uint32_t clock_div  ：        计数时钟分频值
*             	  uint32_t clock_source  ：     计数时钟来源
* return		: none
********************************************************************/
void lptimer0_trigger_init(uint32_t clock_source, uint32_t clock_div, uint32_t target);								
/*******************************************************************
* function		: lptimer0_extcount_init
* description	: lptimer0_extcount_init 外部异步脉冲计数初始化
* input			: uint32_t target:              计数目标值 
*				  uint32_t clock_div  ：        计数时钟分频值
*				  uint32_t clock_source  ：     计数时钟来源
* return		: none
********************************************************************/
void lptimer0_extcount_init(uint32_t clock_source, uint32_t clock_div, uint32_t target);      					     
/*******************************************************************
* function		: lptimer0_time_out_init
* description	: lptimer0_time_out_init  lptimer 超时退出初始化
* input			: uint32_t target:              计数目标值  
*				  uint32_t clock_div  ：        计数时钟分频值
*				  uint32_t clock_source  ：     计数时钟来源
* return		: none
********************************************************************/
void lptimer0_time_out_init(uint32_t clock_source, uint32_t clock_div, uint32_t target);      					   
/*******************************************************************
* function		: lptimer0_irq_init
* description	: lptimer0_irq_init 中断初始化
* input			: uint8_t irq_enable:中断开关
*				  uint32_t irq_type:中断类型
*				  void (*pfunc)():中断回调函数
* return		: none
********************************************************************/
void lptimer0_irq_init(uint8_t irq_enable, uint32_t irq_type, void (*pfunc)()); 										
/*******************************************************************
* function		: lptimer0_start
* description	: enable lptimer0 count
* input			: none
* return		: none
********************************************************************/
void lptimer0_start(void);
/*******************************************************************
* function		: lptimer0_stop
* description	: disable lptimer count
* input			: none
* return		: none
********************************************************************/																							
void lptimer0_stop(void);			                																
	/*******************************************************************
* function		: lptimer1_count_init
* description	: lptimer1_count_init  	LPTimer1定时初始化
* input			: uint32_t clock_source	时钟源选择
*				  uint32_t clock_div	时钟源分频
*             	  uint32_t time			定时时间        	  
* return		: none
********************************************************************/															   
void lptimer1_count_init(uint32_t clock_source, uint32_t clock_div, uint32_t time);									
/*******************************************************************
* function		: lptimer1_pwm_init
* description	: lptimer1_pwm_init      duty cyle（占空比） = (cmp / target) * 100% 
* input			: uint32_t cmp:              计数器比较值			
*				  uint32_t target:           计数目标值
*            	  uint32_t clock_div  ：     计数时钟分频值
*            	  uint32_t clock_source  ：  计数时钟来源
* return		: none
********************************************************************/
void lptimer1_pwm_init(uint32_t cmp, uint32_t target, uint32_t clock_source, uint32_t clock_div); 	            	
/*******************************************************************
* function		: lptimer1_capture_init
* description	: lptimer1_capture_init     lptimer输入捕获初始化 
* input			: uint32_t target:           计数目标值
*				  uint32_t clock_div  ：     计数时钟分频值
*				  uint32_t clock_source  ：  计数时钟来源
* return		: none
********************************************************************/
void lptimer1_capture_init(uint32_t target, uint32_t clock_source, uint32_t clock_div);								
/*******************************************************************
* function		: lptimer1_trigger_init
* description	: lptimer1_trigger_init Trigger触发计数初始化
* input			: uint32_t target:           计数目标值
*            	  uint32_t clock_div  ：     计数时钟分频值
*				  uint32_t clock_source  ：  计数时钟来源
* return		: none
********************************************************************/
void lptimer1_trigger_init(uint32_t clock_source, uint32_t clock_div, uint32_t target);								
/*******************************************************************
* function		: lptimer1_extcount_init
* description	: lptimer1_extcount_init 外部异步脉冲计数初始化
* input			: uint32_t target:           计数目标值
*				  uint32_t clock_div  ：     计数时钟分频值
*				  uint32_t clock_source  ：  计数时钟来源
* return		: none
********************************************************************/
void lptimer1_extcount_init(uint32_t clock_source, uint32_t clock_div, uint32_t target);      						
/*******************************************************************
* function		: lptimer1_time_out_init
* description	: lptim1_time_out  lptimer 超时退出初始化
* input			: uint32_t target:           计数目标值  
*				  uint32_t clock_div  ：     计数时钟分频值 
*				  uint32_t clock_source  ：  计数时钟来源
* return		: none
********************************************************************/
void lptimer1_time_out_init(uint32_t clock_source, uint32_t clock_div, uint32_t target);      					    
/*******************************************************************
* function		: lptimer1_irq_init
* description	: lptimer1_irq_init 中断初始化
* input			: uint8_t irq_enable：中断开关
*				  uint32_t irq_type： 中断类型
*		          void (*pfunc)()：   中断回调函数
* return		: none
********************************************************************/
void lptimer1_irq_init(uint8_t irq_enable, uint32_t irq_type, void (*pfunc)()); 									
/*******************************************************************
* function		: lptimer1_start
* description	: enable lptimer1 count
* input			: none
* return		: none
********************************************************************/
void lptimer1_start(void);	
/*******************************************************************
* function		: lptimer1_stop
* description	: disable lptimer count
* input			: none
* return		: none
********************************************************************/
void lptimer1_stop(void);			                																
/*******************************************************************
* function		: lptimer2_count_init
* description	: lptimer2_count_init  	LPTimer2定时初始化
* input			: uint32_t clock_source	时钟源选择
*				  uint32_t clock_div	时钟源分频
*             	  uint32_t time			定时时间        	  
* return		: none
********************************************************************/
void lptimer2_count_init(uint32_t clock_source, uint32_t clock_div, uint32_t time);									
/*******************************************************************
* function		: lptimer2_pwm_init
* description	: lptimer2_pwm_init    duty cyle（占空比） = (cmp / target) * 100% 
* input			: uint32_t cmp:             计数比较值			
*				  uint32_t target:          计数目标值
*            	  uint32_t clock_div  ：    计数分频值
*            	  uint32_t clock_source  ： 计数时钟来源
* return		: none
********************************************************************/
void lptimer2_pwm_init(uint32_t cmp, uint32_t target, uint32_t clock_source, uint32_t clock_div);             	    
/*******************************************************************
* function		: lptimer2_capture_init
* description	: lptimer2_capture_init   lptimer 输入捕获初始化
* input			: uint32_t target:          计数目标值 
*				  uint32_t clock_div  ：    计数分频值
*				  uint32_t clock_source  ： 计数时钟来源
* return		: none
********************************************************************/
void lptimer2_capture_init(uint32_t target, uint32_t clock_source, uint32_t clock_div);								
/*******************************************************************
* function		: lptimer2_trigger_init
* description	: lptimer2_trigger_init Trigger触发计数初始化
* input			: uint32_t target:          计数目标值 
*            	  uint32_t clock_div  ：    计数分频值
*				  uint32_t clock_source  ： 计数时钟来源
* return		: none
********************************************************************/
void lptimer2_trigger_init(uint32_t clock_source, uint32_t clock_div, uint32_t target);								
/*******************************************************************
* function		: lptimer2_extcount_init
* description	: lptimer2_extcount_init 外部异步脉冲计数初始化
* input			: uint32_t target:          计数目标值 
*				  uint32_t clock_div  ：    计数分频值
*				  uint32_t clock_source  ： 计数时钟来源
* return		: none
********************************************************************/
void lptimer2_extcount_init(uint32_t clock_source, uint32_t clock_div, uint32_t target);      						
/*******************************************************************
* function		: lptimer2_time_out_init
* description	: lptimer2_time_out_init lptimer2 超时退出初始化
* input			: uint32_t target:          计数目标值   
*				  uint32_t clock_div  ：    计数分频值 
*				  uint32_t clock_source  ： 计数时钟来源
* return		: none
********************************************************************/
void lptimer2_time_out_init(uint32_t clock_source, uint32_t clock_div, uint32_t target);      						
/*******************************************************************
* function		: lptimer2_irq_init
* description	: lptimer2_irq_init 中断初始化
* input			: uint8_t irq_enable :中断开关
*				  uint32_t irq_type : 中断类型
*				  void (*pfunc)() : 中断回调函数
* return		: none
********************************************************************/
void lptimer2_irq_init(uint8_t irq_enable, uint32_t irq_type, void (*pfunc)()); 									
/*******************************************************************
* function		: lptimer2_start
* description	: enable lptimer2 count
* input			: none
* return		: none
********************************************************************/
void lptimer2_start(void);	
/*******************************************************************
* function		: lptimer2_stop
* description	: disable lptimer count
* input			: none
* return		: none
********************************************************************/
void lptimer2_stop(void);			                																
/*******************************************************************
* function		: lptimer3_count_init
* description	: lptimer3_count_init  	LPTimer3定时初始化
* input			: uint32_t clock_source	时钟源选择
*				  uint32_t clock_div	时钟源分频
*             	  uint32_t time			定时时间        	  
* return		: none
********************************************************************/
void lptimer3_count_init(uint32_t clock_source, uint32_t clock_div, uint32_t time);					                
/*******************************************************************
* function		: lptimer3_pwm_init
* description	: lptimer3_pwm_init  duty cyle（占空比） = (cmp / target) * 100% 
* input			: uint32_t cmp: 			计数器比较值 			
*				  uint32_t target:			计数器目标值 
*            	  uint32_t clock_div:		计数器时钟分频值
*            	  uint32_t clock_source:	计数器时钟来源
* return		: none
********************************************************************/
void lptimer3_pwm_init(uint32_t cmp, uint32_t target, uint32_t clock_source, uint32_t clock_div); 					
/*******************************************************************
* function		: lptimer3_capture_init
* description	: lptimer3_capture_init 
* input			: uint32_t target:			计数器目标值 
*				  uint32_t clock_div:		计数器时钟分频值
*				  uint32_t clock_source:	计数器时钟来源
* return		: none
********************************************************************/
void lptimer3_capture_init(uint32_t target, uint32_t clock_source, uint32_t clock_div);								
/*******************************************************************
* function		: lptimer3_trigger_init
* description	: lptimer3_trigger_init Trigger触发计数初始化
* input			: uint32_t target:			计数器目标值 
*            	  uint32_t clock_div:		计数器时钟分频值
*				  uint32_t clock_source:	计数器时钟来源
* return		: none
********************************************************************/
void lptimer3_trigger_init(uint32_t clock_source, uint32_t clock_div, uint32_t target);								
/*******************************************************************
* function		: lptimer3_extcount_init
* description	: lptimer3_extcount_init 外部异步脉冲计数初始化
* input			: uint32_t target:			计数器目标值 
*				  uint32_t clock_div:		计数器时钟分频值
*				  uint32_t clock_source:	计数器时钟来源
* return		: none
********************************************************************/
void lptimer3_extcount_init(uint32_t clock_source, uint32_t clock_div, uint32_t target);      		                
/*******************************************************************
* function		: lptimer3_time_out_init
* description	: lptimer3_time_out_init lptimer3超时退出初始化
* input			: uint32_t target:			计数器目标值 
*				  uint32_t clock_div:		计数器时钟分频值
*				  uint32_t clock_source:	计数器时钟来源
* return		: none
********************************************************************/
void lptimer3_time_out_init(uint32_t clock_source, uint32_t clock_div, uint32_t target);      		                
/*******************************************************************
* function		: lptimer3_irq_init
* description	: lptimer3_irq_init 中断初始化
* input			: uint8_t irq_enable:中断开关
*				  uint32_t irq_type:中断类型
*				  void (*pfunc)():中断回调函数
* return		: none
********************************************************************/
void lptimer3_irq_init(uint8_t irq_enable, uint32_t irq_type, void (*pfunc)()); 									
/*******************************************************************
* function		: lptimer3_start
* description	: enable lptimer3 count
* input			: none
* return		: none
********************************************************************/
void lptimer3_start(void);	
/*******************************************************************
* function		: lptimer3_stop
* description	: disable lptimer3 count
* input			: none
* return		: none
********************************************************************/
void lptimer3_stop(void);			                																

#endif


