/******************************************************************************* * 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 *******************************************************************************/