#include "tsc.h"
//=====================================================================
//函数名称：tsc_init
//功能概要：初始化TSC模块 ,
//参数说明：uint8_t chnlID
//函数返回： 无
//=====================================================================
void tsc_init(uint8_t chnlID)
{
	if(chnlID == 1){
		//PTB12-I01 PTB13--Simple
		//打开时钟
		RCC->AHB1ENR |= RCC_AHB1ENR_TSCEN_Msk;	//使能TSC的时钟门
		RCC->AHB2ENR |= RCC_AHB2ENR_GPIOBEN_Msk;	//使能GPIOB时钟门
		//gpio功能配置
		GPIOB->MODER &= ~(GPIO_MODER_MODE12_Msk | GPIO_MODER_MODE13_Msk);	//清零
		GPIOB->MODER |= (2 << GPIO_MODER_MODE12_Pos | 2 << GPIO_MODER_MODE13_Pos);	//将MODER对应的MODE12、13置10，表示复用
		GPIOB->OTYPER &= ~(GPIO_OTYPER_OT13_Msk | GPIO_OTYPER_OT12_Msk);	//清零
		GPIOB->OTYPER |= (GPIO_OTYPER_OT13_Msk);	//PTB13设为开漏输出，PTB12为推挽输出
		GPIOB->OSPEEDR &= ~(GPIO_OSPEEDR_OSPEED13_Msk | GPIO_OSPEEDR_OSPEED12_Msk);	//清零，置为00，表示低速
		GPIOB->PUPDR &= ~(GPIO_PUPDR_PUPD13_Msk | GPIO_PUPDR_PUPD12_Msk);	//清零，无上拉或下拉
		GPIOB->AFR[1] &= ~(GPIO_AFRH_AFSEL13_Msk | GPIO_AFRH_AFSEL12_Msk);	//清零
		GPIOB->AFR[1] |= (9<<GPIO_AFRH_AFSEL13_Pos | 9<<GPIO_AFRH_AFSEL12_Pos );	//将PTB12、13复用功能选择AF9，也就是TSC_G1_IO1、2
		//TSC配置
		TSC->CR |= 1 << TSC_CR_CTPH_Pos | 1 << TSC_CR_CTPL_Pos | 2 << TSC_CR_PGPSC_Pos
							 | 5 << TSC_CR_MCV_Pos | 1 << TSC_CR_TSCE_Pos;	//设置高低电平周期，最大计数值并使能TSC
		TSC->IOHCR &= ~(TSC_IOHCR_G1_IO1_Msk | TSC_IOHCR_G1_IO2_Msk );	//禁止施密特触发器滞后
        //
		TSC->IOSCR |= 1 << TSC_IOSCR_G1_IO2_Pos;	//io2作为采样电容
		TSC->IOCCR |= 1 << TSC_IOCCR_G1_IO1_Pos;	//io1作为通道
		TSC->IOGCSR |= 1 << TSC_IOGCSR_G1E_Pos;		//使能采集，计数器开始计数
		
	} else if(chnlID == 3){
		//PTB14-I03 PTB13--Simple
		//打开时钟
		RCC->AHB1ENR |= RCC_AHB1ENR_TSCEN_Msk;	//使能TSC的时钟门
		RCC->AHB2ENR |= RCC_AHB2ENR_GPIOBEN_Msk;	//使能GPIOB时钟门
		//gpio功能配置
		GPIOB->MODER &= ~(GPIO_MODER_MODE14_Msk | GPIO_MODER_MODE13_Msk);	//清零
		GPIOB->MODER |= (2 << GPIO_MODER_MODE14_Pos | 2 << GPIO_MODER_MODE13_Pos);	//将MODER对应的MODE14、13置10，表示复用
		GPIOB->OTYPER &= ~(GPIO_OTYPER_OT13_Msk | GPIO_OTYPER_OT14_Msk);	//清零
		GPIOB->OTYPER |= (GPIO_OTYPER_OT13_Msk);	//PTB13设为开漏输出，PTB14为推挽输出
		GPIOB->OSPEEDR &= ~(GPIO_OSPEEDR_OSPEED13_Msk | GPIO_OSPEEDR_OSPEED14_Msk);	//清零，置为00，表示低速
		GPIOB->PUPDR &= ~(GPIO_PUPDR_PUPD13_Msk | GPIO_PUPDR_PUPD14_Msk);	//清零，无上拉或下拉
		GPIOB->AFR[1] &= ~(GPIO_AFRH_AFSEL13_Msk | GPIO_AFRH_AFSEL14_Msk);	//清零
		GPIOB->AFR[1] |= (9<<GPIO_AFRH_AFSEL13_Pos | 9<<GPIO_AFRH_AFSEL14_Pos );	//将PTB14、13复用功能选择AF9，也就是TSC_G1_IO3、2
		//TSC配置
		TSC->CR |= 1 << TSC_CR_CTPH_Pos | 1 << TSC_CR_CTPL_Pos | 1 << TSC_CR_SSD_Pos  |  2 << TSC_CR_PGPSC_Pos
							| 5 << TSC_CR_MCV_Pos |1 << TSC_CR_TSCE_Pos;	//设置高低电平周期，最大计数值并使能TSC
		TSC->IOHCR &= ~(TSC_IOHCR_G1_IO3_Msk | TSC_IOHCR_G1_IO2_Msk );	//禁止施密特触发器滞后
		TSC->IOSCR |= 1 << TSC_IOSCR_G1_IO2_Pos;	//io2作为采样电容
		TSC->IOCCR |= 1 << TSC_IOCCR_G1_IO3_Pos;	//io3作为通道
		TSC->IOGCSR |= 1 << TSC_IOGCSR_G1E_Pos;	//使能采集，计数器开始计数
	} else if(chnlID == 4){
		//PTB15-I04 PTB13--Simple
		//打开时钟
		RCC->AHB1ENR |= RCC_AHB1ENR_TSCEN_Msk;	//使能TSC的时钟门
		RCC->AHB2ENR |= RCC_AHB2ENR_GPIOBEN_Msk;	//使能GPIOB时钟门
		//gpio功能配置
		GPIOB->MODER &= ~(GPIO_MODER_MODE15_Msk | GPIO_MODER_MODE13_Msk);	//清零
		GPIOB->MODER |= (2 << GPIO_MODER_MODE15_Pos | 2 << GPIO_MODER_MODE13_Pos);	//将MODER对应的MODE15、13置10，表示复用
		GPIOB->OTYPER &= ~(GPIO_OTYPER_OT13_Msk | GPIO_OTYPER_OT15_Msk);
		GPIOB->OTYPER |= (GPIO_OTYPER_OT13_Msk);	//PTB13设为开漏输出，PTB15为推挽输出
		GPIOB->OSPEEDR &= ~(GPIO_OSPEEDR_OSPEED13_Msk | GPIO_OSPEEDR_OSPEED15_Msk);	//清零，置为00，表示低速
		GPIOB->PUPDR &= ~(GPIO_PUPDR_PUPD13_Msk | GPIO_PUPDR_PUPD15_Msk);	//清零，无上拉或下拉
		GPIOB->AFR[1] &= ~(GPIO_AFRH_AFSEL13_Msk | GPIO_AFRH_AFSEL15_Msk);
		GPIOB->AFR[1] |= (9<<GPIO_AFRH_AFSEL13_Pos | 9<<GPIO_AFRH_AFSEL15_Pos );	//将PTB15、13复用功能选择AF9，也就是TSC_G1_IO4、2
		//TSC配置
		TSC->CR |= 1 << TSC_CR_CTPH_Pos | 1 << TSC_CR_CTPL_Pos | 1 << TSC_CR_SSD_Pos  |  2 << TSC_CR_PGPSC_Pos
							| 5 << TSC_CR_MCV_Pos |1 << TSC_CR_TSCE_Pos;	//设置高低电平周期，最大计数值并使能TSC
		TSC->IOHCR &= ~(TSC_IOHCR_G1_IO4_Msk | TSC_IOHCR_G1_IO2_Msk );	//禁止施密特触发器滞后
		
		TSC->IOSCR |= 1 << TSC_IOSCR_G1_IO2_Pos;	//io2作为采样电容
		TSC->IOCCR |= 1 << TSC_IOCCR_G1_IO4_Pos;	//io3作为通道
		TSC->IOGCSR |= 1 << TSC_IOGCSR_G1E_Pos;		//使能采集，计数器开始计数
	}
}

//=====================================================================
//函数名称：tsc_get_value
//功能概要：获取TSC通道的计数值
//参数说明：无
//函数返回：获取TSC通道的计数值
//=====================================================================
uint16_t tsc_get_value()
{
	uint16_t value;
	TSC->IER = ~(TSC_IER_EOAIE_Msk | TSC_IER_MCEIE_Msk);//关中断
	value = ((TSC->IOGXCR[0]) & TSC_IOGXCR_CNT_Msk);	//从IO组x计数器寄存器（IOGxCR）中得到组1的计数值
	TSC->IER = (TSC_IER_EOAIE_Msk | TSC_IER_MCEIE_Msk);//开中断
	return value;
}

//=====================================================================
//函数名称：tsc_enable_re_int
//功能概要：开TSC中断,开中断控制器IRQ中断
//参数说明：无
//函数返回：无
//=====================================================================
void tsc_enable_re_int(void)
{
    //开TSC中断，MCEIE：最大计数值错误，EOAIE：采集结束
 	TSC->IER |= 1 << TSC_IER_MCEIE_Pos | 1 << TSC_IER_EOAIE_Pos;
	NVIC_EnableIRQ(TSC_IRQn);
}

//=====================================================================
//函数名称：tsc_disable_re_int
//参数说明：无
//函数返回：无
//功能概要：关TSC中断,开软件触发扫描,关中断控制器IRQ中断
//=====================================================================
void tsc_disable_re_int(void)
{
    //关TSC中断，MCEIE：最大计数值错误，EOAIE：采集结束
	TSC->IER |= 0 << TSC_IER_MCEIE_Pos | 0 << TSC_IER_EOAIE_Pos;
    //禁止中断控制器IRQ中断
    NVIC_DisableIRQ(TSC_IRQn);
}

//=====================================================================
//函数名称：tsc_get_int
//功能概要：获取tsc中断标志
//参数说明：无
//函数返回：1=有中断产生，0=没有中断产生
//=====================================================================
uint8_t tsc_get_int()
{
	//通过中断状态寄存器（ISR）判断是否产生中断
	//MCEF：最大计数错误
	//EOAF：采集结束
//	if(TSC->ISR & TSC_ISR_MCEF_Msk)
	if(TSC->ISR & TSC_ISR_EOAF_Msk)
//	if((TSC->ISR & TSC_ISR_MCEF_Msk) || (TSC->ISR & TSC_ISR_EOAF_Msk))
		return 1;
	else
		return 0;
}
//=====================================================================
//函数名称：tsc_softsearch
//功能概要：开启一次软件扫描
//参数说明：无
//函数返回：无
//=====================================================================
void tsc_softsearch(void){

	TSC->IER = ~(TSC_IER_EOAIE_Msk | TSC_IER_MCEIE_Msk); 	//禁止中断
	TSC->ICR = ~(TSC_ICR_EOAIC_Msk | TSC_ICR_MCEIC_Msk);	//清中断标志位
	//TSC->IER = (TSC_IER_EOAIE_Msk | TSC_IER_MCEIE_Msk);//开中断
	TSC->CR |= 1 << TSC_CR_START_Pos;	//开始扫描，也就是开始采集

}

//=====================================================================
//函数名称：tsc_clear_int
//功能概要：清除tsc中断标志
//参数说明：无
//函数返回：无
//=====================================================================
void tsc_clear_int(void)
{
	TSC->ICR |= 1 << TSC_ICR_MCEIC_Pos | 1 << TSC_ICR_EOAIC_Pos;    //写1清除该超值中断位
	//在ICR中写1会将ISR中对应中断状态位清0
}
