/***********************************************************************
 * Copyright (c)  2017 - 2022, Unicmicro Co.,Ltd .
 * All rights reserved.
 * Filename    : atimer.h
 * Description : atimer header file
 * Author(s)   : Hackett
 * version     : V1.0
 * Modify date : 2022-07-10
 ***********************************************************************/
#ifndef	__ATIM_H__
#define	__ATIM_H__

#include  "system_um321xF.h"

#define	ARR_VALUE		48000		//0~65535
#define	PSC_VALUE		100			//0~65535

/***************************ATIM通道***************************/
#define	ATIM_CHANNEL1					0
#define	ATIM_CHANNEL2					1
#define	ATIM_CHANNEL3					2
#define	ATIM_CHANNEL4					3

/***********************OCxREF信号的行为***********************/
#define	ATIM_NOTEFFECT(CH)	(0<<(4+8*CH))
#define	ATIM_SETHIGH(CH)	(1<<(4+8*CH))
#define	ATIM_SETLOW(CH)		(2<<(4+8*CH))
#define	ATIM_FLIPLEVEL(CH)	(3<<(4+8*CH))
#define	ATIM_KEEPLOW(CH)	(4<<(4+8*CH))
#define	ATIM_KEEPHIGH(CH)	(5<<(4+8*CH))
#define	ATIM_PWM1(CH)		(6<<(4+8*CH))
#define	ATIM_PWM2(CH)		(7<<(4+8*CH))

/*******************ATIM DMA和中断使能寄存器*******************/
#define	ATIM_UIE			0
#define	ATIM_CC1IE			1
#define	ATIM_CC2IE			2
#define	ATIM_CC3IE			2
#define	ATIM_CC4IE			4
#define	ATIM_COMIE			5
#define	ATIM_TIE			6
#define	ATIM_BIE			7
#define	ATIM_UDE			8
#define	ATIM_CC1DE			9
#define	ATIM_CC2DE			10
#define	ATIM_CC3DE			11
#define	ATIM_CC4DE			12
#define	ATIM_COMDE			13
#define	ATIM_TDE			14
#define	ATIM_CC1OF			16
#define	ATIM_CC2OF			17
#define	ATIM_CC3OF			18
#define	ATIM_CC4OF			19

/***************************状态标志***************************/
#define	ATIM_STATUS_UIF		0
#define	ATIM_STATUS_CC1IF	1
#define	ATIM_STATUS_CC2IF	2
#define	ATIM_STATUS_CC3IF	3
#define	ATIM_STATUS_CC4IF	4
#define	ATIM_STATUS_COMIF	5
#define	ATIM_STATUS_TIF		6
#define	ATIM_STATUS_BIF		7
#define	ATIM_STATUS_CC1OF	9
#define	ATIM_STATUS_CC2OF	10
#define	ATIM_STATUS_CC3OF	11
#define	ATIM_STATUS_CC4OF	12

/*************************输出比较模式*************************/
#define	ATIM_DEADTIME					0
#define	ATIM_EXTERNALEVENTS				1
#define ATIM_6STEPPWM					2
#define ATIM_BRAKE						3
#define	ATIM_PWMOUTPUT					4

/*************************输入捕获模式*************************/
#define	ATIM_PWMINPUT					0
#define	ATIM_INPUT						1

/***************************从机模式***************************/
#define ATIM_ENCODER1					1
#define ATIM_ENCODER2					2
#define ATIM_ENCODER3					3
#define ATIM_RESET						4
#define ATIM_GATING						5
#define ATIM_TRIGGER					6
#define ATIM_EXTERNALCLOCK				7

/*************************ATIM使能/失能************************/
#define	ATIM_ENABLE						1
#define	ATIM_DISABLE					0

/***************************DMA基地址**************************/
#define TIM_CR1		0
#define TIM_CR2		1
#define TIM_SMCR	2
#define TIM_DIER	3
#define TIM_SR		4
#define TIM_EGR		5
#define TIM_CCMR1	6
#define TIM_CCMR2	7
#define TIM_CCER	8
#define TIM_CNT		9
#define TIM_PSC		10
#define TIM_ARR		11
#define TIM_RCR		12
#define TIM_CCR1	13
#define TIM_CCR2	14
#define TIM_CCR3	15
#define TIM_CCR4	16
#define TIM_BDTR	17
#define TIM_DCR		18
#define TIM_DMAR	19

/*************************测试功能选择*************************/
#define ATIM_COUNTER_MODE				1
#define ATIM_PWMOUT_MODE				2
#define ATIM_SINGLEPULSE_MODE			3
#define ATIM_INPUTCAPTURE_MODE			4
#define ATIM_XORINPUT_MODE				5
#define ATIM_SLAVE_MODE					6
#define ATIM_ENCODER_MODE				7
#define	ATIM_DMA_MODE					8

/***********************ATIM中断响应选择***********************/
//#define	NVIC_COM




/************************************************************************
 * Function   	: atimer_get_status
 * Description	: 获取相应的状态
 * Input : uint8_t object: 状态标志
 * Output: none
 * Return: 相应的状态
 ************************************************************************/
uint8_t atimer_get_status(uint8_t object);

/************************************************************************
 * Function   : atimer_module_enable
 * Description: 使能时钟并复位定时器0模块
 * Input : none
 * Output: none
 * Return: none
 ************************************************************************/
void atimer_module_enable(void);

/************************************************************************
 * function   : atimer_dmac_enable
 * Description: dma使能
 * input : uint8_t length 	: DMA Burst长度
 *		   uint8_t base_addr: DMA基地址
 * Output: none
 * return: none
 ************************************************************************/
void atimer_dmac_enable(uint8_t length, uint8_t base_addr);

/************************************************************************
 * Function   : atimer_irq
 * Description: atimer中断控制
 * Input : uint8_t dier		 ：ATIM DMA和中断使能寄存器
 *		   IRQn_Type nvic_com：ATIM_IRQn			全局中断
 *							   ATIM_BRK_IRQn		刹车事件
 *							   ATIM_UP_IRQn			更新事件
 *							   ATIM_TRIGCOM_IRQn	触发/COM事件
 *							   ATIM_CC_IRQn			通道比较/捕捉
 *		   uint8_t newstate	 ：ATIM使能/失能
 *		   void (*pfunc)()	 ：回调函数
 * Output: none
 * Return: none
 ************************************************************************/
void atimer_irq(uint8_t dier, IRQn_Type nvic_com, uint8_t newstate, void (*pfunc_send)());

/************************************************************************
 * Function   : atimer_counter
 * Description: atimer计时器使能/失能
 * Input : uint8_t newstate: ATIM使能/失能
 * Output: none
 * Return: none
 ************************************************************************/
void atimer_counter(uint8_t newstate);

/************************************************************************
 * function   : atimer_init
 * Description: 定时器0初始化
 * input : uint16_t arr:自动重载值
 *		   uint16_t psc:分频系数   
 * Output: none
 * return: none
 ************************************************************************/
void atimer_init(uint16_t arr, uint16_t psc);

/************************************************************************
 * function   : atimer_pwm_init
 * Description: 定时器0初始化PWM模式
 * input : uint16_t arr		：自动重载值
 *		   uint16_t psc		：分频系数
 *		   uint8_t mode		：输出比较模式
 *		   uint8_t channel	：ATIM通道
 * Output: none
 * return: none
 ************************************************************************/
void atimer_pwm_init(uint16_t arr, uint16_t psc, uint8_t mode, uint8_t channel);

/************************************************************************
 * function   : atimer_singlepulse_init
 * Description: 定时器0单脉冲模式初始化
 * input : uint16_t arr			：自动重载值
 *		   uint16_t psc			：分频系数
 *		   uint8_t channel		：输出ATIM通道
 *		   uint8_t input_channel：输入ATIM通道
 * Output: none
 * return: none
 ************************************************************************/
void atimer_singlepulse_init(uint16_t arr, uint16_t psc, uint8_t channel, uint8_t input_channel);

/************************************************************************
 * Function   : atimer_inputcapture_init
 * Description: 定时器0输入捕获模式初始化
 * Input : uint16_t arr		：自动重载值
 *		   uint16_t psc		：分频系数
 *		   uint8_t mode		：输入捕获模式
 *		   uint8_t channel	：ATIM通道
 * Output: none
 * Return: none
 ************************************************************************/
void atimer_inputcapture_init(uint16_t arr, uint16_t psc, uint8_t mode, uint8_t channel);

/************************************************************************
 * Function   : atimer_xorinput_init
 * Description: 定时器0输入异或模式初始化
 * Input : uint16_t arr		：自动重载值
 *		   uint16_t psc		：分频系数
 * Output: none
 * Return: none
 ************************************************************************/
void atimer_xorinput_init(uint16_t arr, uint16_t psc);

/************************************************************************
 * Function   : atimer_slave_init
 * Description: 定时器0单脉冲模式初始化
 * Input : uint16_t arr		：自动重载值
 *		   uint16_t psc		：分频系数
 *		   uint8_t mode 	：从机模式
 *		   uint8_t channel 	：ATIM通道
 * Output: none
 * Return: none
 ************************************************************************/
void atimer_slave_init(uint16_t arr, uint16_t psc, uint8_t mode, uint8_t channel);

/************************************************************************
 * Function   : atimer_encoder_init
 * Description: 
 * Input : uint16_t arr		：自动重载值
 *		   uint16_t psc		：分频系数
 *		   uint8_t mode		：编码器模式（从机模式）
 * Output: none
 * Return: none
 ************************************************************************/
void atimer_encoder_init(uint16_t arr, uint16_t psc, uint8_t mode);

/************************************************************************
 * Function   : atimer2sram_init
 * Description: 定时器0的DMA模式初始化
 * Input : uint16_t arr		：自动重载值
 *		   uint16_t psc		：分频系数
 *		   uint8_t channel	：ATIM通道
 * Output: none
 * Return: none
 ************************************************************************/	
void atimer_atimer2sram_init(uint16_t arr, uint16_t psc, uint8_t channel);

/************************************************************************
 * Function   : sram2atimer_init
 * Description: 定时器0的DMA模式初始化
 * Input : uint16_t arr		：自动重载值
 *		   uint16_t psc		：分频系数
 *		   uint8_t channel	：ATIM通道
 * Output: none
 * Return: none
 ************************************************************************/	
void atimer_sram2atimer_init(uint16_t arr, uint16_t psc, uint8_t channel);

/************************************************************************
 * Function   : atimer_set_compare
 * Description: 设置通道x的输出比较值
 * Input : uint8_t channel 			：ATIM通道
 *		   uint16_t compare_value	：比较值
 * Output: none
 * Return: none
 ************************************************************************/	
void atimer_set_compare(uint8_t channel, uint16_t compare_value);

/************************************************************************
 * Function   : atimer_get_capture
 * Description: 读取通道x的输入捕获值
 * Input : uint8_t channel：ATIM通道
 * Output: none
 * Return: 捕获值
 ************************************************************************/	
uint16_t atimer_get_capture(uint8_t channel);

/************************************************************************
 * Function   : atimer_get_cnt
 * Description: 读取定时器计数值
 * Input : none
 * Output: none
 * Return: 定时器计数值
 ************************************************************************/	
uint16_t atimer_get_cnt(void);

#endif




