stm32f103蜂鸣器播放花海代码
时间: 2024-09-23 07:12:43 浏览: 14
STM32F103单片机通过GPIO控制蜂鸣器播放特定声音,比如模拟“花海”效果,通常需要使用PWM(脉冲宽度调制)技术。以下是一个简单的示例代码,假设我们使用的是 TIM1 模块生成 PWM 波,并连接到蜂鸣器:
```c
#include "stm32f10x.h"
// 定义TIM1初始化结构体
TIM_TimeBaseInitTypeDef.TIM_Prescaler = 84; // 钟源频率 / (Prescaler + 1) = 72MHz / (84 + 1) ≈ 864kHz
TIM_TimeBaseInitTypeDef.TIM_Period = 500; // PWM周期,500us
TIM_TimeBaseInitTypeDef.TIM_ClockDivision = 0;
TIM_TimeBaseInitTypeDef.TIM_CounterMode = TIM_COUNTERMODE_UP;
// 定义蜂鸣器 GPIO 初始化
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Pin = GPIO_PIN_9; // 蜂鸣器引脚
GPIO_InitStructure.GPIO_Mode = GPIO_MODE_OUTPUT_PP; // 推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_SPEED_FREQ_HIGH;
GPIO_Init(GPIOA, &GPIO_InitStructure);
void play_hua_hai(void) {
TIM_Cmd(TIM1, ENABLE); // 启动定时器
TIM_SetCompare1(TIM1, 0); // 设置比较寄存器1为0,开始播放
while (1) {
TIM_SetCompare1(TIM1, TIM_Period); // 当计数器溢出时,再次设置为最大值,持续循环播放
}
}
int main(void) {
RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1, ENABLE); // 启动TIM1时钟
// 初始化TIM1
TIM_TimeBaseInit(TIM1, &TIM_TimeBaseInitTypeDef);
TIM_ITConfig(TIM1, TIM_IT_Update, ENABLE); // 开启更新中断
NVIC_EnableIRQ(TIM1_IRQn); // 开启TIM1中断
// 初始化蜂鸣器GPIO
GPIO_Init(GPIOA, &GPIO_InitStructure);
play_hua_hai(); // 开始播放花海音效
while (1);
}
// TIM1中断服务函数,用于调整PWM波形
void TIM1_IRQHandler(void) {
if (__HAL_TIM_GET_FLAG(TIM1, TIM_FLAG_UPDATE)) { // 如果有更新标志
__HAL_TIM_CLEAR_FLAG(TIM1, TIM_FLAG_UPDATE); // 清除标志
TIM_SetCompare1(TIM1, TIM_Period); // 更新比较值
}
}