/***********************************************************************
 * Copyright (c)  2019, Unicmicro Co.,Ltd .
 * All rights reserved.
 * Filename    : lptimer.h
 * Description : lpTimer header file
 * Author(s)   : canheng
 * version     : V1.0
 * Modify date : 2021-08-13
 ***********************************************************************/
 
#ifndef  __LPTIMER1_H__
#define  __LPTIMER1_H__

#include  "um321xA.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_LPTIE_COMPIE					(uint32_t)(0x00000001)		// 比较匹配中断使能位: 计数器值和比较值匹配中断禁止 
																   
#define VAL_LPTIM_LPTIE_OVIE					(uint32_t)(0x00000002)		// 计数器溢出中断使能位: 计数器溢出中断使能 
																   
#define VAL_LPTIM_LPTIE_TRIGIE					(uint32_t)(0x00000004)		// 外部触发到来中断使能位: 外部触发到来中断使能 
																   
#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_IRQ_DISABLE             		0                         	// LPTIMER中断禁止
#define VAL_LPTIM_IRQ_ENABLE            		1                        	// LPTIMER中断使能

#define VAL_LPTIM_LPTCTRL_LPTEN_DISABLE			(uint32_t)(0x00000000)		// LPTIM使能位: 禁止计数器计数 
#define VAL_LPTIM_LPTCTRL_LPTEN_ENABLE			(uint32_t)(0x00000001)		// LPTIM使能位: 使能计数器计数 
	
/*PWM极性*/
#define HIGH                   		 			1      						// 计数值=比较值时输出上升沿 
#define LOW                     	 			0      						// 计数值=比较值时输出下降沿 

void lptim1_count_init(uint32_t clock_source, uint32_t clock_div, uint16_t time);							// 普通定时器计数
void lptim1_pwm_init(uint16_t cmp, uint16_t target, uint32_t clock_source, uint32_t clock_div, uint8_t level);			// PWM输出 
void lptim1_trigger_init(uint32_t clock_source, uint32_t clock_div, uint16_t target);				// Trigger脉冲触发计数(输入捕获) 
void lptim1_extcount_init(uint32_t clock_source, uint32_t clock_div, uint16_t target);				// 外部异步脉冲计数模式 
void lptim1_time_out_init(uint32_t clock_source, uint32_t clock_div, uint16_t target);				// time out模式 
void lptim1_irq_init(uint32_t irq_enable, uint32_t irq_type, void (*pfunc)());          // 中断初始化
void lptim1_start(void);							// 启动定时器 
void lptim1_stop(void);								// 停止定时器 

uint16_t lptim1_get_count(void);  // 获取定时器计数

#endif


