/*
*********************************************************************************************************
*
*	模块名称 :  定时器相关
*	文件名称 :  
*	版    本 :  V0.1
*	说    明 :	
---------------------------------------------------------------------------------------------------------

---------------------------------------------------------------------------------------------------------              
*	修改记录 :  
*	
*
*********************************************************************************************************
*/
#include "timer.h"
#include "led.h"
#include "bsp_ec11.h"
#include "matrix_key.h"


/*
*********************************************************************************************************
											变量
*********************************************************************************************************
*/
uint8_t  oled_refresh; //OLED主显示区域刷新
uint8_t  oled_key_refresh; //OLED按键显示刷新
uint8_t  beep_count;
uint8_t  tim_1s_count;


/*

*********************************************************************************************************
											外部变量
*********************************************************************************************************
*/
extern  uint8_t   BEEP_SW;
extern uint8_t  Key_ON;




//通用定时器中断初始化
//这里时钟选择为APB1的2倍，而APB1为36M，所以APB1为72M
//arr：自动重装值。
//psc：时钟预分频数
//这里使用的是定时器3!
void TIM3_Int_Init(u16 arr,u16 psc)
{
    TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
	NVIC_InitTypeDef NVIC_InitStructure;

	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); //时钟使能

	TIM_TimeBaseStructure.TIM_Period = arr; //设置在下一个更新事件装入活动的自动重装载寄存器周期的值	 计数到5000为500ms
	TIM_TimeBaseStructure.TIM_Prescaler =psc; //设置用来作为TIMx时钟频率除数的预分频值  10Khz的计数频率  
	TIM_TimeBaseStructure.TIM_ClockDivision = 0; //设置时钟分割:TDTS = Tck_tim
	TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  //TIM向上计数模式
	TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure); //根据TIM_TimeBaseInitStruct中指定的参数初始化TIMx的时间基数单位
 
	TIM_ITConfig(  //使能或者失能指定的TIM中断
		TIM3, //TIM2
		TIM_IT_Update ,
		ENABLE  //使能
		);
	NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn;  //TIM3中断
	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 6;  //先占优先级6级
	NVIC_InitStructure.NVIC_IRQChannelSubPriority = 6;  //从优先级6级
	NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道被使能
	NVIC_Init(&NVIC_InitStructure);  //根据NVIC_InitStruct中指定的参数初始化外设NVIC寄存器

	TIM_Cmd(TIM3, ENABLE);  //使能TIMx外设
							 
}



//通用定时器中断初始化
//这里时钟选择为APB1的2倍，而APB1为36M，所以APB1为72M
//arr：自动重装值。
//psc：时钟预分频数
//这里使用的是定时器2!
void TIM2_Int_Init(u16 time2_arr,u16 tim2_psc)
{
    TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
	NVIC_InitTypeDef NVIC_InitStructure;

	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE); //时钟使能

	TIM_TimeBaseStructure.TIM_Period = time2_arr; //设置在下一个更新事件装入活动的自动重装载寄存器周期的值	 计数到5000为500ms
	TIM_TimeBaseStructure.TIM_Prescaler =tim2_psc; //设置用来作为TIMx时钟频率除数的预分频值  10Khz的计数频率  
	TIM_TimeBaseStructure.TIM_ClockDivision = 0; //设置时钟分割:TDTS = Tck_tim
	TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  //TIM向上计数模式
	TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure); //根据TIM_TimeBaseInitStruct中指定的参数初始化TIMx的时间基数单位
 
	TIM_ITConfig(  //使能或者失能指定的TIM中断
		TIM2, //TIM2
		TIM_IT_Update ,
		ENABLE  //使能
		);
	NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn;  //TIM2中断
	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;  //先占优先级0级
	NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;  //从优先级3级
	NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道被使能
	NVIC_Init(&NVIC_InitStructure);  //根据NVIC_InitStruct中指定的参数初始化外设NVIC寄存器

	TIM_Cmd(TIM2, ENABLE);  //使能TIMx外设
							 
}

//通用定时器中断初始化
//这里时钟选择为APB1的2倍，而APB1为36M
//arr：自动重装值。
//psc：时钟预分频数
//这里使用的是定时器3!
void TIM5_Int_Init(u16 arr,u16 psc)
{
    TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
	NVIC_InitTypeDef NVIC_InitStructure;

	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM5, ENABLE); //时钟使能

	TIM_TimeBaseStructure.TIM_Period = arr; //设置在下一个更新事件装入活动的自动重装载寄存器周期的值	 计数到5000为500ms
	TIM_TimeBaseStructure.TIM_Prescaler =psc; //设置用来作为TIMx时钟频率除数的预分频值  10Khz的计数频率  
	TIM_TimeBaseStructure.TIM_ClockDivision = 0; //设置时钟分割:TDTS = Tck_tim
	TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  //TIM向上计数模式
	TIM_TimeBaseInit(TIM5, &TIM_TimeBaseStructure); //根据TIM_TimeBaseInitStruct中指定的参数初始化TIMx的时间基数单位
 
	TIM_ITConfig(  //使能或者失能指定的TIM中断
		TIM5, //TIM5
		TIM_IT_Update ,
		ENABLE  //使能
		);
	NVIC_InitStructure.NVIC_IRQChannel = TIM5_IRQn;  //TIM4中断
	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 7;  //先占优先级7级
	NVIC_InitStructure.NVIC_IRQChannelSubPriority = 7;  //从优先级7级
	NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道被使能
	NVIC_Init(&NVIC_InitStructure);  //根据NVIC_InitStruct中指定的参数初始化外设NVIC寄存器

	TIM_Cmd(TIM5, ENABLE);  //使能TIMx外设
					 
}

//通用定时器中断初始化
//这里时钟选择为APB1的2倍，而APB1为36M
//arr：自动重装值。
//psc：时钟预分频数
//这里使用的是定时器3!
void TIM6_Int_Init(u16 arr,u16 psc)
{
    TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
	NVIC_InitTypeDef NVIC_InitStructure;

	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM6, ENABLE); //时钟使能

	TIM_TimeBaseStructure.TIM_Period = arr; //设置在下一个更新事件装入活动的自动重装载寄存器周期的值	 计数到5000为500ms
	TIM_TimeBaseStructure.TIM_Prescaler =psc; //设置用来作为TIMx时钟频率除数的预分频值  10Khz的计数频率  
	TIM_TimeBaseStructure.TIM_ClockDivision = 0; //设置时钟分割:TDTS = Tck_tim
	TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  //TIM向上计数模式
	TIM_TimeBaseInit(TIM6, &TIM_TimeBaseStructure); //根据TIM_TimeBaseInitStruct中指定的参数初始化TIMx的时间基数单位
 
	TIM_ITConfig(  //使能或者失能指定的TIM中断
		TIM6, //TIM6
		TIM_IT_Update ,
		ENABLE  //使能
		);
	NVIC_InitStructure.NVIC_IRQChannel = TIM6_IRQn;  //TIM6中断
	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 8;  //先占优先级8级
	NVIC_InitStructure.NVIC_IRQChannelSubPriority = 8;  //从优先级8级
	NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道被使能
	NVIC_Init(&NVIC_InitStructure);  //根据NVIC_InitStruct中指定的参数初始化外设NVIC寄存器

	TIM_Cmd(TIM6, ENABLE);  //使能TIMx外设
							 
}



/*
*********************************************************************************************************
*	函数名 : TIM8_Init
*	功能   : 初始TIM8，用于编码器接口模式

*	入口   : 
*	出口   :     
*********************************************************************************************************
*/
void TIM8_Init()
{
    TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
	TIM_ICInitTypeDef  TIM_ICInitStructure;
//	NVIC_InitTypeDef NVIC_InitStructure;
	
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM8, ENABLE);
	
	//配置定时器基本单元
    TIM_DeInit(TIM8);
    TIM_TimeBaseStructInit(&TIM_TimeBaseStructure);
    TIM_TimeBaseStructure.TIM_Period = 40000; 
    TIM_TimeBaseStructure.TIM_Prescaler = 0;
    TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1 ;	
    TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;//原本设定
	
    TIM_TimeBaseInit(TIM8, &TIM_TimeBaseStructure);
	//配置对应寄存器为编码器接口模式以及配置相关的输入捕获
//    TIM_EncoderInterfaceConfig(	TIM8, 
//								TIM_EncoderMode_TI12,  
//								TIM_ICPolarity_Falling, 
//								TIM_ICPolarity_Falling);
    TIM_EncoderInterfaceConfig(	TIM8, 
								TIM_EncoderMode_TI12,  
								TIM_ICPolarity_Rising, 
								TIM_ICPolarity_Rising);								
								
								
    TIM_ICStructInit(&TIM_ICInitStructure);
    TIM_ICInitStructure.TIM_ICFilter = 6;//ICx_FILTER;

    TIM_ICInit(TIM8, &TIM_ICInitStructure);
	
	// Clear all pending interrupts
    TIM_ClearFlag(TIM8, TIM_FLAG_Update);
	
    //其实中断可以不用开，硬件计数器自动继续加减
//    TIM_ITConfig(TIM8, TIM_IT_Update, ENABLE);	//更新模式
//    TIM_ITConfig(TIM8, TIM_IT_Update, DISABLE);	//中断关闭
//	NVIC_InitStructure.NVIC_IRQChannel = TIM8_UP_IRQn;  //TIM8更新中断
//	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 5;  //先占优先级5级
//	NVIC_InitStructure.NVIC_IRQChannelSubPriority = 6;  //从优先级6级
//	NVIC_InitStructure.NVIC_IRQChannelCmd = DISABLE; //IRQ通道不使能
//	NVIC_Init(&NVIC_InitStructure);  //根据NVIC_InitStruct中指定的参数初始化外设NVIC寄存器	
	
    //清除中断位
//	TIM_ClearFlag(TIM8, TIM_FLAG_Update);
//	TIM_ClearITPendingBit(TIM8, TIM_IT_Update); 

	
//    TIM8->CNT = 0;    //Reset counter
    TIM8->CNT = 20000;    //从中间开始计数
    TIM_Cmd(TIM8, ENABLE);   //启动定时8
	
}


/*
*********************************************************************************************************
*	函数名 : 
*	功能   : 蜂鸣器
*	入口   : 
*	出口   :     
*********************************************************************************************************
*/
void TIM3_IRQHandler(void)   //TIM3中断处理函数
{   
	if (TIM_GetITStatus(TIM3, TIM_IT_Update) != RESET) //检查指定的TIM中断发生与否:TIM 中断源 
	{			
		TIM_ClearITPendingBit(TIM3, TIM_IT_Update  );  //清除TIMx的中断待处理位:TIM 中断源 
		if(BEEP_SW == 1)
		{
			beep_count++;
			if((beep_count % 2) == 1)
			{
				BEEP = 1; //蜂鸣器响
			}
			else
			{
				BEEP = 0; //蜂鸣器不想
				beep_count = 0;
				BEEP_SW = 0;//关闭
			}					
		}						 
	}
}


/*
*********************************************************************************************************
*	函数名 : 
*	功能   : LED闪烁和通信指示
*	入口   : 
*	出口   :     
*********************************************************************************************************
*/
void TIM2_IRQHandler(void)   //TIM2中断处理函数
{	   
	if (TIM_GetITStatus(TIM2, TIM_IT_Update) != RESET) //检查指定的TIM中断发生与否:TIM 中断源 
	{			
		TIM_ClearITPendingBit(TIM2, TIM_IT_Update  );  //清除TIMx的中断待处理位:TIM 中断源 
		//LED闪烁
		LED0 =~ LED0;//
		tim_1s_count++;//1s
	}
}


/*
*********************************************************************************************************
*	函数名 : 
*	功能   : OLED定时扫描程序
*	入口   : 
*	出口   :     
*********************************************************************************************************
*/
void TIM6_IRQHandler(void)   //TIM6中断处理函数
{	   
	if (TIM_GetITStatus(TIM6, TIM_IT_Update) != RESET) //检查指定的TIM中断发生与否:TIM 中断源 
	{			
		TIM_ClearITPendingBit(TIM6, TIM_IT_Update  );  //清除TIMx的中断待处理位:TIM 中断源 
//		oled_refresh = 1;		
	}
}




/*
*********************************************************************************************************
*	函数名 : 
*	功能   : 按键扫描程序
*	入口   : 
*	出口   :     
*********************************************************************************************************
*/
void TIM5_IRQHandler(void)   //TIM5中断处理函数
{		
	if (TIM_GetITStatus(TIM5, TIM_IT_Update) != RESET) //检查指定的TIM中断发生与否:TIM 中断源 
	{			
		TIM_ClearITPendingBit(TIM5, TIM_IT_Update  );  //清除TIMx的中断待处理位:TIM 中断源 
		//LED闪烁
		__nop();
		if(Key_ON == 1)
		{					
			bsp_KeyScan();	//扫描按键			
		}						
	}
}

/*
*********************************************************************************************************
*	函数名 : TIM8_UP_IRQHandler
*	功能   : 处理编码器旋转中断
*	入口   : 
*	出口   :     
*********************************************************************************************************
*/
void TIM8_UP_IRQHandler(void)
{ 	
	if (TIM_GetITStatus(TIM8, TIM_IT_Update) != RESET) //检查指定的TIM中断发生与否:TIM 中断源 
	{			
		TIM_ClearITPendingBit(TIM8, TIM_IT_Update  );  //清除TIMx的中断待处理位:TIM 中断源 
		__nop();
//		BEEP  = ~ BEEP;
	}	
}




