/*******************************************************************************
 * File Name: Audio.c
 * Function Describe:device for the audio	
 * Relate Module:
 * Explain:	Hardware version is HS120 
 * Writer:  ShiLiangWen
 * Date:	2015.6.15
  *******************************************************************************/ 

  //------------------------------------------------------------------------------
#include "includes.h"

int cntMeiTiao;

int TTSDelayCnt;
unsigned char  MuteFlag=1;

/*****************************************************************
*CLK=12Mhz
*(10000,2)==>  12000000/2/10000=600Hz

******************************************************************/


void newBeepSet(int fre)
{
	/*�˺����ܹ�������SYSCLK������Ƶ��ΪfreHz,ռ�ձ�Ϊ50%��PWM���
	��ʽ:
	T=(1+TIM_Period)*(1+TIM_Prescaler)/SYSCLK
	fre=1/T=SYSCLK/(1+TIM_Period)*(1+TIM_Prescaler)
	TIM_Period=(SYSCLK/fre/(1+TIM_Prescaler))-1
	����SYSCLK,fre����֪�ģ�ֻҪȷ��TIM_Period��TIM_Prescaler����
	����������ȷ��TIM_Prescaler��ֻҪ��֤TIM_Prescaler�����缴��
	����ֱ��ȡTIM_Prescaler=SYSCLK/10000,�������ܱ�֤TIM_Prescaler������
	TIM_Prescaler�������ˣ��ٸ��ݹ�ʽ���㣬��ôTIM_PeriodҲ�ͳ�����
	*/
	uint16_t tempPrescale;
	uint16_t TimerPeriod,ChannelPulse;
	TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
	TIM_OCInitTypeDef  TIM_OCInitStructure;
  
	tempPrescale = USER_MAIN_SYSCLK / 10000 - 1;//ȷ��TIM_Prescaler
	TimerPeriod = USER_MAIN_SYSCLK / (fre * tempPrescale);//���ݹ�ʽ����TIM_Period
	ChannelPulse = (uint16_t) (TimerPeriod/2);//50%ռ�ձ�
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);
	
	TIM_TimeBaseStructure.TIM_ClockDivision=TIM_CKD_DIV1;//TIM_CKD_DIV1
	TIM_TimeBaseStructure.TIM_Prescaler = tempPrescale;//Ԥ��Ƶ
	TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up;
	TIM_TimeBaseStructure.TIM_RepetitionCounter=0;
	TIM_TimeBaseStructure.TIM_Period=TimerPeriod-1; //����
	TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);
	
	TIM_OCInitStructure.TIM_Pulse=ChannelPulse;//50%ռ�ձ�
	TIM_OCInitStructure.TIM_OCMode=TIM_OCMode_PWM2;
	TIM_OCInitStructure.TIM_OutputState=TIM_OutputState_Enable;
	TIM_OCInitStructure.TIM_OutputNState=TIM_OutputNState_Enable;
	TIM_OCInitStructure.TIM_OCPolarity=TIM_OCPolarity_Low;
	TIM_OCInitStructure.TIM_OCNPolarity=TIM_OCNPolarity_High;
	TIM_OCInitStructure.TIM_OCIdleState=TIM_OCIdleState_Set;
	TIM_OCInitStructure.TIM_OCNIdleState=TIM_OCNIdleState_Reset;
	TIM_OCInitStructure.TIM_Pulse=ChannelPulse;
	TIM_OC2Init(TIM2, &TIM_OCInitStructure); //ͨ��2
	TIM_Cmd(TIM2, ENABLE);
	TIM_CtrlPWMOutputs(TIM2,ENABLE);
	
}


void SetBeep(int fre,int tick)
{
	
	newBeepSet(fre);
	uTimerCreate(UTIMER_BEEP,tick);
	uTimerCreate(UTIMER_MIC,tick+8);
}


/**********************************************************************
1ms��8000~9000֮��
***********************************************************************/

void SetBeepByNoOS(int fre,int ms)
{
	//if(newPara.KeySound==0) return;	
  newBeepSet(fre);

	TIM_Cmd(TIM2, ENABLE);  //��ֹ/ʹ��TIM1	
	uTimerHardDly(ms);
	TIM_Cmd(TIM2, DISABLE);  //��ֹ/ʹ��TIM1	

}

/********************************************************************************
SpeakerInit

*********************************************************************************/
void SpeakerInit(void)
{
	GPIO_InitTypeDef GPIO_InitStructure;
	RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOC|RCC_APB2Periph_AFIO,ENABLE );
  GPIO_InitStructure.GPIO_Pin = SPK_MUTE_PIN|SPK_BOOST_PIN|SPK_MAIN_MUTE_PIN; 
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;  //�����������
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(SPK_MUTE_PORT, &GPIO_InitStructure);//��ʼ��GPIO
	GPIO_SetBits(SPK_BOOST_PROT,SPK_BOOST_PIN);//Ĭ������
	SPK_MAIN_MUTE_LOW;
	SpeakerCtrl(0);
}

/********************************************************************************
SpeakerCtrl
*********************************************************************************/
void SpeakerCtrl(int en)
{
	if(en){
		//SPK_MUTE_PORT->BRR=SPK_MUTE_PIN;//Speaker Enable
		SpeakerEnable();	
	}else{
		//SPK_MUTE_PORT->BSRR=SPK_MUTE_PIN;//Speaker Disable
		SpeakerDisable();	
	}
}


void SetRingFreq(int fre)
{
	TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
	TIM_OCInitTypeDef  TIM_OCInitStructure; 
	unsigned short arr;
	arr=20000000/fre;//6000000
/*====== ��ʼ��TIM4 ======*/
	TIM_TimeBaseStructure.TIM_Period = arr; //��������һ�������¼�װ�����Զ���װ�ؼĴ������ڵ�ֵ
	TIM_TimeBaseStructure.TIM_Prescaler =3; //����������ΪTIMxʱ��Ƶ�ʳ�����Ԥ��Ƶֵ 
	TIM_TimeBaseStructure.TIM_ClockDivision = 0; //����ʱ�ӷָ�:TDTS = Tck_tim
	TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  //TIM���ϼ���ģʽ
	TIM_TimeBaseStructure.TIM_RepetitionCounter=0;//�ظ��Ĵ����������Զ�����pwmռ�ձ�    
	TIM_TimeBaseInit(TIM5, &TIM_TimeBaseStructure); //����TIM_TimeBaseInitStruct��ָ���IJ�����ʼ��TIMx��ʱ�������λ
//====== ��ʼ��TIM4 Channel2 PWMģʽ ======/ 	 
	TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2; //ѡ��ʱ��ģʽ:TIM������ȵ���ģʽ2
	TIM_OCInitStructure.TIM_Pulse=arr/2;               //����ռ�ձ�ʱ
 	TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //�Ƚ����ʹ��
	//TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; //�������:TIM����Ƚϼ��Ը�
	TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low; //TIM_OCPolarity_Low �������:TIM����Ƚϼ��Ե�
	TIM_OC1Init(TIM5, &TIM_OCInitStructure);  //����Tָ���IJ�����ʼ������TIM4 OC2
	TIM_OC1PreloadConfig(TIM5, TIM_OCPreload_Enable);  //ʹ��TIM4��CCR2�ϵ�Ԥװ�ؼĴ���
	TIM_Cmd(TIM5, ENABLE);  //��ֹ/ʹ��TIM4	
}

void SPKDelayUs(unsigned short us)
{
	unsigned short i;
	unsigned short t=us;
	while(t--){
		__nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();
		__nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();
		__nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();
	}
}
void SpeakerEnable(void)
{
	
	if(MuteFlag==0)return;
	SPK_MUTE_PORT->BSRR=SPK_MUTE_PIN;//////
}

/********************************************************************************
 *                            End of Module
 *******************************************************************************/