stm32f407使用蜂鸣器播放音乐完整代码
时间: 2023-11-02 15:03:17 浏览: 869
STM32驱动蜂鸣器播放歌曲
STM32F407使用蜂鸣器播放音乐的完整代码如下:
```c
#include "stm32f4xx.h"
// 定义音符频率
#define NOTE_C 262
#define NOTE_D 294
#define NOTE_E 330
#define NOTE_F 349
#define NOTE_G 392
#define NOTE_A 440
#define NOTE_B 494
// 设置蜂鸣器播放音符函数
void playTone(uint16_t frequency, uint16_t duration) {
// 计算定时器计数周期
uint16_t period = SystemCoreClock / (frequency * 2);
// 配置定时器2
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
TIM_TimeBaseStructure.TIM_Period = period - 1;
TIM_TimeBaseStructure.TIM_Prescaler = 84 - 1;
TIM_TimeBaseStructure.TIM_ClockDivision = 0;
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);
TIM_OCInitTypeDef TIM_OCInitStructure;
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
TIM_OCInitStructure.TIM_Pulse = period / 2;
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low;
TIM_OC1Init(TIM2, &TIM_OCInitStructure);
TIM_Cmd(TIM2, ENABLE);
// 延时固定时间,模拟音符持续时间
delay_ms(duration);
// 关闭定时器2
TIM_Cmd(TIM2, DISABLE);
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, DISABLE);
}
// 延时函数
void delay_ms(uint32_t ms) {
uint32_t i, j;
for (i = 0; i < ms; i++) {
for (j = 0; j < 3200; j++);
}
}
int main(void) {
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
GPIO_Init(GPIOA, &GPIO_InitStructure);
while (1) {
// 播放简单的音乐:两个音符交替演奏
playTone(NOTE_C, 500); // 播放DO音符500ms
delay_ms(100); // 等待100ms
playTone(NOTE_E, 500); // 播放MI音符500ms
delay_ms(100);
}
}
```
以上代码使用定时器2来控制蜂鸣器发声频率,通过连续播放不同频率的音符来形成音乐。在主函数中,通过调用playTone函数来播放特定频率的音符,然后通过延时函数delay_ms来控制音符的持续时间,之后再播放下一个音符来形成连续的音乐播放过程。以上代码使用了GPIOA的引脚0来控制蜂鸣器。
阅读全文