stm32f103驱动无源蜂鸣器警报声
时间: 2025-01-09 11:58:35 浏览: 0
### STM32F103 微控制器驱动无源蜂鸣器发出警报声
为了使STM32F103微控制器能够驱动无源蜂鸣器并发出警报声,需要生成特定频率的方波信号给到蜂鸣器。由于无源蜂鸣器不自带震荡电路,因此外部必须提供合适的音频脉冲才能使其工作[^3]。
#### GPIO配置
首先,在初始化阶段设置用于连接蜂鸣器的GPIO引脚为推挽输出模式:
```c
// 初始化GPIO端口
void Buzzer_GPIO_Init(void){
GPIO_InitTypeDef GPIO_InitStruct = {0};
__HAL_RCC_GPIOA_CLK_ENABLE(); // 开启GPIOA时钟
GPIO_InitStruct.Pin = GPIO_PIN_8; // 假定PA8连接至蜂鸣器
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
}
```
#### 定义函数控制蜂鸣器状态
定义两个简单函数分别用来开启和关闭蜂鸣器的声音输出:
```c
// 打开蜂鸣器
void BUZZER_ON(){
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_8, GPIO_PIN_SET);
}
// 关闭蜂鸣器
void BUZZER_OFF(){
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_8, GPIO_PIN_RESET);
}
```
然而上述方法仅能实现高低电平切换而无法形成有效音调。对于无源蜂鸣器来说更重要的是产生周期性的PWM(Pulse Width Modulation)波形来激发其发声元件振动从而发出声音。可以利用定时器中断服务程序配合软件延时循环改变占空比达到此目的;或者更推荐的方式是直接采用硬件TIM模块产生的PWM输出作为激励源。
这里给出基于TIM2定时器生成固定频率PWM波形的例子:
```c
#include "stm32f1xx_hal.h"
#define PWM_FREQUENCY 1000U /* 设置期望的频率 */
/* TIM2初始化 */
static void MX_TIM2_Init(void)
{
__HAL_RCC_TIM2_CLK_ENABLE();
TIM_HandleTypeDef htim2;
htim2.Instance = TIM2;
htim2.Init.Prescaler = SystemCoreClock / (PWM_FREQUENCY * 2) - 1;
htim2.Init.CounterMode = TIM_COUNTERMODE_UP;
htim2.Init.Period = 999;
htim2.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
if(HAL_TIM_PWM_Init(&htim2)!= HAL_OK){
Error_Handler();
}
TIM_OC_InitTypeDef sConfigOC;
sConfigOC.OCMode = TIM_OCMODE_PWM1;
sConfigOC.Pulse = 500; // 占空比50%
sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH;
sConfigOC.OCFastMode = TIM_OCFAST_DISABLE;
if(HAL_TIM_PWM_ConfigChannel(&htim2,&sConfigOC,TIM_CHANNEL_1) != HAL_OK){
Error_Handler();
}
}
int main(void)
{
HAL_Init();
SystemClock_Config();
MX_GPIO_Init();
MX_TIM2_Init();
while(1){
HAL_TIM_PWM_Start(&htim2,TIM_CHANNEL_1); // 启动PWM通道
HAL_Delay(1000); // 持续时间一秒
HAL_TIM_PWM_Stop(&htim2,TIM_CHANNEL_1); // 停止PWM通道
HAL_Delay(1000); // 等待一秒钟再重复动作
}
}
```
这段代码实现了每秒一次启动/停止PWM输出的功能,使得蜂鸣器每隔一段时间就会响起持续时间为1秒的提示音[^1]。
阅读全文