stm32f103蜂鸣器播放音乐hal库
时间: 2025-01-04 22:31:21 浏览: 14
### 使用 STM32F103 和 HAL 库通过蜂鸣器播放音乐
为了使 STM32F103 单片机能够通过蜂鸣器播放音乐,需完成一系列硬件配置和软件编程工作。具体来说,这涉及到设置定时器来生成不同频率的声音信号以及编写相应的程序逻辑。
#### 硬件准备
确保已连接好蜂鸣器到指定 GPIO 引脚上,并确认该引脚被设定为推挽输出模式[^1]。对于无源蜂鸣器而言,还需要额外接入振荡电路;而有源蜂鸣器则可以直接驱动发声[^2]。
#### 软件环境搭建
采用 STM32CubeMX 工具来进行初步的外设初始化配置,特别是要开启 HSE 高速外部时钟以保证稳定的频率输出[^3]。接着导入生成的项目至 IDE 中继续开发。
#### 编写播放函数
下面是一个简单的 C 函数用于定义音符及其持续时间:
```c
typedef struct {
uint16_t frequency; // Frequency of the note (Hz)
uint16_t duration; // Duration of the note (ms)
} Note;
// Define some notes and their frequencies.
Note melody[] = {
{ NOTE_C4, 500 }, // Middle C for half a second
{ REST, 250 }, // Rest for quarter of a second
{ NOTE_D4, 750 } // D above middle C for three quarters of a second
};
#define MELODY_LENGTH sizeof(melody)/sizeof(Note)
void play_note(uint16_t freq, uint16_t ms){
if(freq != 0){ // If it's not a rest...
__HAL_TIM_SET_AUTORELOAD(&htim3, SystemCoreClock/freq/2); // Set up PWM with desired frequency
HAL_TIM_PWM_Start(&htim3,TIM_CHANNEL_1);
HAL_Delay(ms);
HAL_TIM_PWM_Stop(&htim3,TIM_CHANNEL_1);
}
}
```
上述代码片段展示了如何创建一个 `play_note` 方法接收两个参数——频率 (`freq`) 及毫秒数(`ms`) 来表示每个音符应该维持的时间长度。当接收到非零值时,则会启动 TIM3 定时器通道 1 的PWM 输出并等待一段时间后再停止它。
#### 主循环中的调用
最后一步是在主循环里遍历整个旋律数组依次执行每一个音符:
```c
int main(void) {
/* ... Initialization code omitted */
while (1) {
for(int i=0;i<MELODY_LENGTH;i++){
play_note(melody[i].frequency,melody[i].duration);
}
HAL_Delay(1000); // Wait one second before replaying the tune again
}
/* Infinite loop */
}
```
这段代码会在每次迭代过程中重复播放一次完整的曲目序列,每首歌之间间隔一秒再重新开始。
阅读全文