108 lines
3.2 KiB
C
108 lines
3.2 KiB
C
#include "stm32f4xx.h" // Device header
|
|
#include "stm32f4xx_conf.h"
|
|
#include "Buzzer.h"
|
|
#include "Delay.h"
|
|
|
|
int16_t Buzzer_ToneFreq[37]=
|
|
{
|
|
0,
|
|
32107,30305,28604,26999,25483,24053,22703,21429,20226,19091,18019,17008,
|
|
16053,15152,14302,13499,12742,12026,11352,10714,10113,9545,9010,8504,
|
|
8027,7576,7151,6750,6371,6013,5676,5357,5056,4773,4505,4252,
|
|
};//蜂鸣器音调频率表
|
|
|
|
/*
|
|
*函数简介:蜂鸣器初始化
|
|
*参数说明:无
|
|
*返回类型:无
|
|
*备注:无源蜂鸣器
|
|
*备注:默认TIM4-CH3(PD14)
|
|
*/
|
|
void Buzzer_Init(void)
|
|
{
|
|
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4,ENABLE);
|
|
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOD,ENABLE);//开启时钟
|
|
|
|
TIM_InternalClockConfig(TIM4);//选择时基单元TIM4
|
|
|
|
GPIO_InitTypeDef GPIO_InitStructure;
|
|
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF;
|
|
GPIO_InitStructure.GPIO_OType=GPIO_OType_PP;//复用推挽
|
|
GPIO_InitStructure.GPIO_PuPd=GPIO_PuPd_UP;//默认上拉
|
|
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_14;
|
|
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
|
|
GPIO_Init(GPIOD,&GPIO_InitStructure);
|
|
|
|
GPIO_PinAFConfig(GPIOD,GPIO_PinSource14,GPIO_AF_TIM4);//开启PD14的TIM4复用模式
|
|
|
|
TIM_TimeBaseInitTypeDef TIM_InitStructure;
|
|
TIM_InitStructure.TIM_ClockDivision=TIM_CKD_DIV1;//配置时钟分频为1分频
|
|
TIM_InitStructure.TIM_CounterMode=TIM_CounterMode_Up;//配置计数器模式为向上计数
|
|
TIM_InitStructure.TIM_Period=10-1;//ARR,PWM为十分位
|
|
TIM_InitStructure.TIM_Prescaler=19091-1;//PSC,默认频率低音6(440Hz)
|
|
TIM_InitStructure.TIM_RepetitionCounter=0;//配置重复计数单元的置为0
|
|
TIM_TimeBaseInit(TIM4,&TIM_InitStructure);
|
|
|
|
TIM_OCInitTypeDef TIM_OCInitStructure;
|
|
TIM_OCStructInit(&TIM_OCInitStructure);
|
|
TIM_OCInitStructure.TIM_OCMode=TIM_OCMode_PWM1;//配置输出比较模式
|
|
TIM_OCInitStructure.TIM_OCPolarity=TIM_OCPolarity_High;//配置输出比较的极性
|
|
TIM_OCInitStructure.TIM_OutputState=TIM_OutputState_Enable;//输出使能
|
|
TIM_OCInitStructure.TIM_Pulse=0;//配置输出比较寄存器CCR的值,默认占空比0%
|
|
TIM_OC3Init(TIM4,&TIM_OCInitStructure);//配置PD14输出PWM
|
|
|
|
TIM_Cmd(TIM4,ENABLE);//启动定时器
|
|
}
|
|
|
|
/*
|
|
*函数简介:蜂鸣器发声
|
|
*参数说明:枚举音调
|
|
*参数说明:持续时间,单位ms
|
|
*返回类型:无
|
|
*备注:无
|
|
*/
|
|
void Buzzer_Time(Buzzer_Tone Tone,uint16_t ms)
|
|
{
|
|
if(Tone!=P)//非停止调
|
|
{
|
|
TIM_PrescalerConfig(TIM4,Buzzer_ToneFreq[Tone],TIM_PSCReloadMode_Update);//配置频率
|
|
TIM_SetCompare3(TIM4,5);//占空比50%
|
|
}
|
|
else//停止调(即空拍)
|
|
TIM_SetCompare3(TIM4,0);//占空比0%,即关闭PWM
|
|
|
|
Delay_ms(ms);
|
|
TIM_SetCompare3(TIM4,0);//占空比0%,即关闭PWM
|
|
}
|
|
|
|
/*
|
|
*函数简介:蜂鸣器打开
|
|
*参数说明:枚举音调
|
|
*返回类型:无
|
|
*备注:无
|
|
*/
|
|
void Buzzer_ON(Buzzer_Tone Tone)
|
|
{
|
|
TIM_Cmd(TIM4,ENABLE);//打开定时器
|
|
|
|
if(Tone!=P)//非停止调
|
|
{
|
|
TIM_PrescalerConfig(TIM4,Buzzer_ToneFreq[Tone],TIM_PSCReloadMode_Update);//配置频率
|
|
TIM_SetCompare3(TIM4,5);//占空比50%
|
|
}
|
|
else//停止调(即空拍)
|
|
TIM_SetCompare3(TIM4,0);//占空比0%,即关闭PWM
|
|
}
|
|
|
|
/*
|
|
*函数简介:蜂鸣器关闭
|
|
*参数说明:无
|
|
*返回类型:无
|
|
*备注:无
|
|
*/
|
|
void Buzzer_OFF(void)
|
|
{
|
|
TIM_SetCompare3(TIM4,0);//占空比0%,即关闭PWM
|
|
TIM_Cmd(TIM4,DISABLE);//关闭定时器
|
|
}
|