【STM32】GPIO之蜂鸣器

本文详细介绍STM32F4开发板上的蜂鸣器硬件设计及软件控制方法,包括蜂鸣器简介、硬件连接、初始化配置、程序示例及循环发声实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

00. 目录

01. 蜂鸣器简介

蜂鸣器是一种一体化结构的电子讯响器,采用直流电压供电,广泛应用于计算机、打印机、复印机、报警器、电子玩具、汽车电子设备、电话机、定时器等电子产品中作发声器件。蜂鸣器主要分为压电式蜂鸣器和电磁式蜂鸣器两种类型。

探索者 STM32F4 开发板板载的蜂鸣器是电磁式的有源蜂鸣器,如图 7.1.1 所示:
在这里插入图片描述

这里的有源不是指电源的“源”,而是指有没有自带震荡电路,有源蜂鸣器自带了震荡电路,一通电就会发声;无源蜂鸣器则没有自带震荡电路,必须外部提供 2~5Khz 左右的方波驱动,才能发声。

02. 硬件设计

蜂鸣器在硬件上也是直接连接好了的,不需要经过任何设置,直接编写代码就可以了。蜂鸣器的驱动信号连接在 STM32F4 的 PF8 上。
在这里插入图片描述

图中我们用到一个 NPN 三极管(S8050)来驱动蜂鸣器,R61 主要用于防止蜂鸣器的误发声。当 PF.8 输出高电平的时候,蜂鸣器将发声,当 PF.8 输出低电平的时候,蜂鸣器停止发声。

03. 程序示例一

蜂鸣器不叫

beep.h文件

#ifndef __BEEP_H__
#define __BEEP_H__


#include "sys.h"


//蜂鸣器初始化
void BEEP_Init(void);

#define BEEP PFout(8)

#endif /*__BEEP_H__*/

beep.c文件

#include "beep.h"

//蜂鸣器初始化
void BEEP_Init(void)
{
	GPIO_InitTypeDef GPIO_InitStruct;
	
	GPIO_InitStruct.GPIO_Pin = GPIO_Pin_8;
	
	GPIO_InitStruct.GPIO_Mode = GPIO_Mode_OUT;
	
	GPIO_InitStruct.GPIO_Speed = GPIO_Speed_100MHz;
	
	GPIO_InitStruct.GPIO_OType = GPIO_OType_PP;
	
	GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_DOWN;
	
	//使能时钟
	RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOF, ENABLE);
	
	//初始化GPIO
	GPIO_Init(GPIOF, &GPIO_InitStruct);

	//设置默认低电平
	GPIO_ResetBits(GPIOF, GPIO_Pin_8);
}

main.c文件

#include "stm32f4xx.h"

#include "delay.h"
#include "led.h"
#include "beep.h"


int main(void)
{
	//初始化
	delay_init(168);
	LED_Init();
	BEEP_Init();
	
	//蜂鸣器不叫
	GPIO_ResetBits(GPIOF, GPIO_Pin_8);
}

04. 程序示例二

蜂鸣器叫

main.c文件

#include "stm32f4xx.h"

#include "delay.h"
#include "led.h"
#include "beep.h"


int main(void)
{
	//初始化
	delay_init(168);
	LED_Init();
	BEEP_Init();

	GPIO_SetBits(GPIOF, GPIO_Pin_8);
}

05. 程序实例三

蜂鸣器循环叫1秒 不叫1秒

main.c

#include "stm32f4xx.h"

#include "delay.h"
#include "led.h"
#include "beep.h"


int main(void)
{
	//初始化
	delay_init(168);
	LED_Init();
	BEEP_Init();
	
	//蜂鸣器不叫
	GPIO_ResetBits(GPIOF, GPIO_Pin_8);
	GPIO_ResetBits(GPIOF, GPIO_Pin_9);	
	delay_ms(1000);
	
	//蜂鸣器叫
	GPIO_SetBits(GPIOF, GPIO_Pin_8);
	GPIO_SetBits(GPIOF, GPIO_Pin_9);
	delay_ms(1000);
	
}

位带操作

main.c文件

#include "stm32f4xx.h"

#include "delay.h"
#include "led.h"
#include "beep.h"


int main(void)
{
	//初始化
	delay_init(168);
	LED_Init();
	BEEP_Init();
	
	//蜂鸣器不叫
	LED2 = 0;
	BEEP = 0;
	delay_ms(1000);
	
	//蜂鸣器叫
	LED2 = 1;
	BEEP = 1;
	delay_ms(1000);
}

06. 附录

6.1 【STM32】STM32系列教程汇总

网址:【STM32】STM32系列教程汇总

07. 声明

该教程参考了正点原子的《STM32 F4 开发指南》

### STM32 控制蜂鸣器发声频率或占空比的方法 对于STM32控制无源蜂鸣器来说,核心在于利用PWM(脉宽调制)技术调整波形的频率和占空比。这不仅决定了发出声音的音高还影响到其持续时间内的响度特性。 #### 配置PWM信号用于控制蜂鸣器 为了使STM32能够发送合适的PWM信号给蜂蜜器,在硬件连接方面需确保定时器通道正确接线至蜂鸣器端子;而在软件层面,则要初始化相应的TIMx外设以及设置期望的工作参数[^1]。 ```c // 初始化定时器以生成PWM信号 void MX_TIM2_Init(void) { TIM_HandleTypeDef htim2; __HAL_RCC_TIM2_CLK_ENABLE(); htim2.Instance = TIM2; htim2.Init.Prescaler = 80 - 1; // 假定系统时钟为80MHz, 设置预分频值使得计数频率适中 htim2.Init.CounterMode = TIM_COUNTERMODE_UP; htim2.Init.Period = 999; // 自动重装载值决定周期长度(即频率), 这里假设为1kHz htim2.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1; htim2.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE; if (HAL_TIM_PWM_Init(&htim2) != HAL_OK){ Error_Handler(); // 错误处理函数定义由用户自行完成 } } ``` #### 调整PWM频率 更改`Period`属性可以改变PWM输出的基频,从而直接影响所听到的声音高低。较低的数值对应较高的音频频率,反之亦然。当修改此参数时应当注意保持合理的范围以免超出人类听觉极限或者损坏器件[^2]。 #### 修改PWM占空比 通过设定比较寄存器中的具体数值可调节PWM波形内处于高电平状态的时间比例——也就是所谓的“占空比”。增加该比率会使每次循环期间更多的时刻维持较高电压水平,进而让听众感知更强烈的声响强度。 ```c uint32_t duty_cycle_percent = 75; // 占空比百分比 __HAL_TIM_SET_COMPARE(&htim2,TIM_CHANNEL_1,(duty_cycle_percent * htim2.Init.Period)/100); ``` 上述代码片段展示了如何基于已知的最大计数值计算出恰当的比例因子,并据此更新指定通道下的比较值来达到预期效果。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

沧海一笑-dj

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值