STM32 蜂鸣器与触摸按键:原理与应用详解
一、蜂鸣器的原理与应用
1. 蜂鸣器的分类
蜂鸣器常分为两种:
有源蜂鸣器 Active Buzzer
- 内部自带震荡电路
- 给它直流电即可发声
- 声音频率固定,无法变调
- 驱动简单(GPIO 输出高/低即可)
无源蜂鸣器 Passive Buzzer
- 内部没有震荡电路
- 需要 MCU 输出不同频率的方波驱动
- 可产生不同频率(音调)
- 可以播放旋律
STM32 学习的蜂鸣器有源的,因为接法简单。
2. 蜂鸣器的硬件原理
以开发板上的蜂鸣器为例:
- 一般连接在 MCU 某个 GPIO 引脚上
- 输出 低电平或高电平 使蜂鸣器导通(根据电路而定)
- 利用 GPIO 控制发声/停止
典型原理图如下:

3.使用标准库驱动蜂鸣器
/**
******************************************************************************
* @file beep.c
* @author qrshxc@163.com
* @version V1.0
* @date 2025.7.22
* @brief 实现 MCU 的 PF8 引脚控制开发板蜂鸣器(有源蜂鸣器)
******************************************************************************
**/
#include "stm32f4xx.h"
int main()
{
/* 定义 GPIO 外设初始化结构体变量 */
GPIO_InitTypeDef GPIO_InitStructure;
/* 1. 使能 GPIOF 端口时钟 */
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOF, ENABLE);
/* 2. 配置 PF8 为推挽输出 */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8; // 选择 PF8 引脚
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(GPIOF, &GPIO_InitStructure); // 初始化
/* 3. 主循环 */
while(1)
{
/* 控制 PF8 输出高电平,使蜂鸣器响 */
GPIO_SetBits(GPIOF, GPIO_Pin_8);
}
}
二、按键的原理与应用
机械按键本质上是一个 开关,按下闭合,松开断开。


按键控制蜂鸣器示例程序
/**
******************************************************************************
* @file key.c
* @author qrshxc@163.com
* @version V1.0
* @date 2025.7.22
* @brief KEY 控制蜂鸣器示例(PA0 控制 PF8)
******************************************************************************
**/
#include "stm32f4xx.h"
/* 蜂鸣器初始化(PF8) */
void Beep_Config()
{
GPIO_InitTypeDef GPIO_InitStructure;
/* 1. 使能 GPIOF 时钟 */
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOF, ENABLE);
/* 2. 配置 PF8 为推挽输出 */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;
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(GPIOF, &GPIO_InitStructure);
/* 默认关闭蜂鸣器(低电平) */
GPIO_ResetBits(GPIOF, GPIO_Pin_8);
}
/* 按键 KEY1 初始化(PA0) */
void Key1_Config()
{
GPIO_InitTypeDef GPIO_InitStructure;
/* 1. 使能 GPIOA 时钟 */
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);
/* 2. 配置 PA0 为输入模式 */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
GPIO_Init(GPIOA, &GPIO_InitStructure);
}
int main()
{
/* 初始化蜂鸣器与按键 */
Beep_Config();
Key1_Config();
while(1)
{
/* 如果 PA0 = 1(按键按下),则蜂鸣器响 */
if(GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_0))
{
GPIO_SetBits(GPIOF, GPIO_Pin_8);
}
else
{
GPIO_ResetBits(GPIOF, GPIO_Pin_8);
}
}
}

浙公网安备 33010602011771号