STM32 无源蜂鸣器音乐播放教程(PWM 标准库)
1、STM32通过定时器输出PWM的基本原理
注:本图来自江科大
1.1、图中蓝色线—->CNT计数器的计数值,CNT的值通过定时器一直自增,当达到ARR中装载值时清零。
1.2、图中黄色线—–>ARR寄存器中的装载值,这个值可以通过TIM_SetAutoreload()函数进行配置
1.3、途中红色线——>CCR寄存器中的装载值,这个值可以通过TIM_SetCompare1()函数进行配置(四个比较通道,不同通道用不同的比较函数)
1.4、通过比较CNT的值和CCR寄存器的值输出高低电平。
2、无源蜂鸣器
•无源蜂鸣器:内部不带振荡源,需要控制器提供振荡脉冲才可发声,调整提供振荡脉冲的频率,可发出不同频率的声音。我们可以通过配置ARR寄存器来设置不同的频率,因而发出不同的声音。
3、乐谱中的频率
4、PWM代码部分
#include "stm32f10x.h" // Device header
void PassionBuzzer_Init()
{
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE); //开启TIM2的时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE); //开启GPIOA的时钟
//GPIO初始化
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA,&GPIO_InitStructure);
TIM_InternalClockConfig(TIM2);
TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure; //配置时基单元
TIM_TimeBaseInitStructure.TIM_ClockDivision = TIM_CKD_DIV1; //此参数用于配置滤波器时钟,不影响时基单元功能
TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up; //向上计数
TIM_TimeBaseInitStructure.TIM_Period = 1000-1; // 72M/72/1000=1000Hz,也就是1ms
TIM_TimeBaseInitStructure.TIM_Prescaler = 72-1; //分频器,对TIM2时钟周期进行分频
TIM_TimeBaseInitStructure.TIM_RepetitionCounter = 0; //重复计数器,高级定时器才会用到
TIM_TimeBaseInit(TIM2,&TIM_TimeBaseInitStructure);
TIM_OCInitTypeDef TIM_OCInitStructure;
TIM_OCStructInit(&TIM_OCInitStructure); //结构体整体初始化,赋予默认值,然后对需要的变量进行配置
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; //选择模式,总共8种模式
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low; //输出的极性选择,若选择极性为低,则输出高低电平取反
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //输出状态使能
TIM_OCInitStructure.TIM_Pulse = 500-1; //初始化CCR的值,设置占空比为50%
TIM_OC1Init(TIM2, &TIM_OCInitStructure);
TIM_ARRPreloadConfig(TIM2,ENABLE); //AAR寄存器使能
TIM_OC1PreloadConfig(TIM2,TIM_OCPreload_Enable); //使能TIM2在CCR1上的预装载寄存器
TIM_Cmd(TIM2,ENABLE); //运行控制
}
void PassionBuzzer_Set_Freq_Duty(uint16_t freq,uint16_t duty)
{
TIM_SetAutoreload(TIM2,1000000/freq -1); //根据频率设置加载值
TIM_SetCompare1(TIM2,(1000000/freq-1)*duty/100); //设置占空比
}
这里我们找来一首孤勇者来进行测试,孤勇者乐理代码地址:
https://github.com/Lesterbor/GuYongZhe_PassiveBuzzer_STM32
下载后打开,并将这两个文件移植到我们的工程里面。
将里面的代码改成自己刚才实现的代码就好了。
主函数里调用MUSIC_Analysis()就可以欣赏孤勇者了~~~
作者:heibai_emily