#ifndef __SWM100_TMRSE_H__
#define __SWM100_TMRSE_H__

typedef struct {
	uint32_t mode;				//0 定时器		1 计数器		2 PWM		3 脉宽测量		4 占空比测量
	uint32_t period;			//在定时器、计数器、脉宽测量、占空比测量模式下用于设定计数/计时周期
								//注意：PWM模式下不需要设置此值，PWM模式下高低电平时长分别由pwm_h和pwm_l设置
	uint32_t output_act;		//输出引脚动作	00 无输出		01 取反		10 置高		11 置低
								//用于设置定时器/计数器记到周期值或，脉宽测量检测到第二边沿，占空比测量检测到第三边沿时输出引脚的动作
								//注意：PWM模式下不需要设置此值，因为PWM模式下强制引脚反转
	uint32_t out_initLvl;		//输出引脚起始电平状态	0 低电平	1 高电平
								//注意：在所有5中模式中都可以设置输出引脚起始电平
	uint32_t count_edge;		//计数器模式时在哪个沿递增计数	0 上升沿	1 下降沿
	uint32_t pwm_clksrc;		//PWM模式下时钟源选择	0 内部	1 外部
	uint32_t pwm_h,pwm_l;		//PWM高电平时长/低电平时长，都以CPU时钟周期为单位
	uint32_t cap_trigger;		//捕获触发边沿	0 上升沿		1 下降沿
	uint32_t single_cycle;		//1 单周期模式	0 循环模式
	uint32_t en_int;			//使能中断
} TMRSE_InitStructure;


void TMRSE_Init(TMRSE_T * TMRSEx,TMRSE_InitStructure * initStruct);	//TMRSE定时器初始化，包括模式选择（定时器、计数器、PWM输出、脉宽测量、占空比测量）、定时周期设置、中断使能等
void TMRSE_Open(TMRSE_T * TMRSEx);							//TMRSE定时器使能，使能是指给TMRSE模块提供工作时钟
void TMRSE_Close(TMRSE_T * TMRSEx);							//TMRSE定时器禁能，禁能是指切断TMRSE模块的时钟供给，从而减小能耗
void TMRSE_Start(TMRSE_T * TMRSEx);							//启动指定TMRSE，开始计时/计数
void TMRSE_Stop(TMRSE_T * TMRSEx);							//关闭指定TMRSE，停止计时/计数

void TMRSE_SetMode(TMRSE_T * TMRSEx,uint32_t mode);			//mode: 0 定时器		1 计数器		2 PWM		3 脉宽测量		4 占空比测量
uint32_t TMRSE_GetMode(TMRSE_T * TMRSEx);
void TMRSE_SetLoop(TMRSE_T * TMRSEx,uint32_t single);		//设置循环模式	1 单次模式 0 循环模式 
uint32_t TMRSE_GetLoop(TMRSE_T * TMRSEx);
void TMRSE_SetCountEdge(TMRSE_T * TMRSEx,uint32_t edge_f);	//设置计数器模式下累加计数边沿 	1 下降沿		0 上升沿
uint32_t TMRSE_GetCountEdge(TMRSE_T * TMRSEx);
void TMRSE_SetPWMClkSrc(TMRSE_T * TMRSEx,uint32_t ext);		//设置PWM模式时钟源	0 内部时钟		1 外部时钟
uint32_t TMRSE_GetPWMClkSrc(TMRSE_T * TMRSEx);
void TMRSE_SetOutputAct(TMRSE_T * TMRSEx,uint32_t act);		//输出引脚动作	00 无输出		01 取反		10 置高		11 置低
uint32_t TMRSE_GetOutputAct(TMRSE_T * TMRSEx);
void TMRSE_SetOutputLvl(TMRSE_T * TMRSEx,uint32_t lvl);		//设置输出引脚电平	0 低电平	1 高电平
uint32_t TMRSE_GetOutputLvl(TMRSE_T * TMRSEx);
void TMRSE_SetCAPTrigger(TMRSE_T * TMRSEx,uint32_t edge_f);	//设置脉宽测量和占空比测量触发	1 下降沿		0 上升沿
uint32_t TMRSE_GetCAPTrigger(TMRSE_T * TMRSEx);

void TMRSE_SetPeriod(TMRSE_T * TMRSEx,uint32_t period);		//设置指定TMRSE的计数个数或计时时长（以CPU时钟周期为单位）
uint32_t TMRSE_GetPeriod(TMRSE_T * TMRSEx);					//获取指定TMRSE的计数个数或计时时长（以CPU时钟周期为单位）
uint32_t TMRSE_GetCurrent(TMRSE_T * TMRSEx);				//获取指定TMRSE当前计数值（计数器模式）或当前计时值（以CPU时钟周期为单位）
void TMRSE_SetPWMLow(TMRSE_T * TMRSEx,uint32_t count);		//设置PWM波形低电平时段时间长度，单位为CPU时钟周期
uint32_t TMRSE_GetPWMLow(TMRSE_T * TMRSEx);
void TMRSE_SetPWMHigh(TMRSE_T * TMRSEx,uint32_t count);		//设置PWM波形高电平时段时间长度，单位为CPU时钟周期
uint32_t TMRSE_GetPWMHigh(TMRSE_T * TMRSEx);
void TMRSE_SetPWMLowHig(TMRSE_T * TMRSEx,uint32_t low,uint32_t high);	//同时设置PWM波形低电平时段和高电平时段时间长度，单位为CPU时钟周期
uint32_t TMRSE_GetCAPPulse(TMRSE_T * TMRSEx);				//脉宽测量模式下，	返回捕捉到的脉宽宽度（以CPU时钟周期为单位）
															//占空比测量模式下，返回捕捉到的波形周期（以CPU时钟周期为单位）
uint32_t TMRSE_GetCAPPulseFP(TMRSE_T * TMRSEx);				//FP表示Front Part，即占空比测量模式下，捕捉到的波形的前半部分方波脉宽（以CPU时钟周期为单位）
uint32_t TMRSE_GetCurrentPos(TMRSE_T * TMRSEx);				//当前位置状态，用于PWM模式和占空比模式下判断当前处于前半周期还是后半周期
															//0 当前处于前半周期	1 当前处于后半周期

void TMRSE_INTEn(TMRSE_T * TMRSEx);							//使能指定TMRSE的中断
void TMRSE_INTDis(TMRSE_T * TMRSEx);						//禁能指定TMRSE的中断
void TMRSE_INTClr(TMRSE_T * TMRSEx);						//清除指定TMRSE的中断标志
uint32_t TMRSE_INTStat(TMRSE_T * TMRSEx);					//获取指定TMRSE的中断状态
uint32_t TMRSE_INTRawStat(TMRSE_T * TMRSEx);				//获取指定TMRSE的原始状态
uint32_t TMRSE_INTOVStat(TMRSE_T * TMRSEx);					//获取指定TMRSE的中断Overflow状态


#endif //__SWM100_TMRSE_H__
