#ifndef __SWM120_ADC_H__
#define	__SWM120_ADC_H__

typedef struct {
	uint8_t mode;		//0 单通道单次转换		1 多通道单次扫描		2 多通道连续扫描		3 单通道突发模式
	uint8_t clk_div;	//将分频clk_div的系统时钟提供给ADC用作转换时钟
	uint8_t channel;	//转换通道	可取值ADC_CH0、ADC_CH1、ADC_CH2... ...ADC_CH7、ADC_CH7以及他们的组合（即“按位或”运算）	
	uint8_t INT_EOCEn;	//转换完成中断使能
	uint8_t INT_CMPEn;	//指定通道(cmp_chnl)的转换结果与设定比较值(cmp_value)的比较符合设定条件（cmp_cond：1 结果>=CMPD；0 当结果<CMPD）的次数达到指定次数（mathc_cnt)则发生中断	
	uint8_t use_cmp;	//使用转换结果和设定值比较功能
	uint8_t cmp_cond;	//比较条件：1 当结果>=CMPD时，匹配计数器增一	0 当结果<CMPD时，匹配计数器增一
	uint8_t cmp_chnl;	//选择哪个通道的转换结果与设定值进行比较
	uint16_t cmp_value;	//用来与转换结果进行比较的值
	uint8_t match_cnt;	//转换结果与设定值的比较多少次符合比较条件时触发INT_CMP中断
} ADC_InitStructure;

#define ADC_CH0		0x01
#define ADC_CH1		0x02
#define ADC_CH2		0x04
#define ADC_CH3		0x08
#define ADC_CH4		0x10
#define ADC_CH5		0x20
#define ADC_CH6		0x40
#define ADC_CH7		0x80
#define ADC_CHB		0xFF	//Burst通道数据寄存器

#define ADC_MODE_S	0		//单通道单次转换
#define ADC_MODE_SS	1		//多通道单次扫描
#define ADC_MODE_CS	2		//多通道连续扫描
#define ADC_MODE_B	3		//单通道突发模式


void ADC_Init(ADC_T * ADCx,ADC_InitStructure * initStruct);	//ADC模数转换器初始化，包括模式、时钟、通道、中断、比较等
void ADC_Open(ADC_T * ADCx);						//ADC使能，使能是指给ADC模块提供工作时钟
void ADC_Close(ADC_T * ADCx);						//ADC禁能，禁能是指切断ADC模块的时钟供给，从而减小能耗
void ADC_Start(ADC_T * ADCx);						//启动指定ADC，开始模数转换
void ADC_Stop(ADC_T * ADCx);						//关闭指定ADC，停止模数转换
uint32_t ADC_Read(ADC_T * ADCx,uint32_t ch);		//从指定ADC的指定通道读取转换结果

void ADC_SetMode(ADC_T * ADCx,uint32_t mode);		//设置ADC的工作模式
uint32_t ADC_GetMode(ADC_T * ADCx);					//获取ADC当前的工作模式
void ADC_SetClkDiv(ADC_T * ADCx,uint32_t clk_div);	//设置ADC工作时钟分频值
uint32_t ADC_GetClkDiv(ADC_T * ADCx);				//获取当前ADC工作时钟分频值
void ADC_CHNOpen(ADC_T * ADCx,uint32_t chn);		//ADC通道打开
void ADC_CHNClose(ADC_T * ADCx,uint32_t chn);		//ADC通道关闭

void ADC_CMPOpen(ADC_T * ADCx);						//ADC转换结果与设定值比较功能开启
void ADC_CMPClose(ADC_T * ADCx);					//ADC转换结果与设定值比较功能关闭
void ADC_SetCMPCond(ADC_T * ADCx,uint32_t cmp_cond);//设置比较匹配条件
uint32_t ADC_GetCMPCond(ADC_T * ADCx);				//获取当前的比较匹配条件
void ADC_SetCMPChnl(ADC_T * ADCx,uint32_t cmp_chnl);//设置要与设定值比较的通道
uint32_t ADC_GetCMPChnl(ADC_T * ADCx);				//获取当前与设定值比较的通道
void ADC_SetCMPValue(ADC_T * ADCx,uint32_t cmp_value);	//设置用来和ADC转换结果进行比较的设定值
uint32_t ADC_GetCMPValue(ADC_T * ADCx);				//获取当前用来和ADC转换结果进行比较的设定值
void ADC_SetMatchCnt(ADC_T * ADCx,uint32_t match_cnt);	//设置ADC转换结果和设定值满足设定条件多少次才会产生中断
uint32_t ADC_GetMatchCnt(ADC_T * ADCx);				//获取当前ADC转换结果和设定值满足设定条件多少次才会产生中断


void ADC_IntEOCEn(ADC_T * ADCx);					//使能转换结束中断
void ADC_IntEOCDis(ADC_T * ADCx);					//禁能转换结束中断
void ADC_IntEOCClr(ADC_T * ADCx);					//清除转换结束中断标志
uint32_t ADC_StatEOC(ADC_T * ADCx);					//读取转换结束状态
void ADC_IntCMPEn(ADC_T * ADCx);					//使能转换结果与设定值匹配设定条件次数达到设定次数中断
void ADC_IntCMPDis(ADC_T * ADCx);					//禁能转换结果与设定值匹配设定条件次数达到设定次数中断
void ADC_IntCMPClr(ADC_T * ADCx);					//清除转换结果与设定值匹配设定条件次数达到设定次数中断标志
uint32_t ADC_StatCMP(ADC_T * ADCx);					//读取转换结果与设定值匹配设定条件次数达到设定值状态


#endif //__SWM120_ADC_H__
