第2章 蜂鸣器实验
第二章 蜂鸣器实验
1. 导入
上一章,我们介绍了 STM32F4 的 IO 口作为输出的使用,这一章,我们将通过另外一个例子讲述 STM32F4 的 IO 口作为输出的使用。 在本章中,我们将利用一个 IO 口来控制板载的有源蜂鸣器,实现蜂鸣器控制。
2. 蜂鸣器简介
探索者 STM32F4 开发板板载的蜂鸣器是电磁式的有源蜂鸣器:
这里的有源不是指电源的“源”,而是指有没有自带震荡电路,有源蜂鸣器自带了震荡电路,一通电就会发声;无源蜂鸣器则没有自带震荡电路,必须外部提供 2~5Khz 左右的方波驱动,才能发声。
前面我们已经对 STM32F4 的 IO 做了简单介绍,上一章,我们就是利用 STM32 的 IO 口直接驱动 LED 的,本章的蜂鸣器,我们能否直接用 STM32 的 IO 口驱动呢? 让我们来分析下: STM32F4 的单个 IO 最大可以提供 25mA 电流(来自数据手册),而蜂鸣器的驱动电流是 30mA左右,两者十分相近,但是全盘考虑, STM32F4 整个芯片的电流, 最大也就 150mA,如果用 IO 口直接驱动蜂鸣器,其他地方用电就得省着点了…所以,我们不用 STM32F4 的 IO 直接驱动蜂鸣器,而是通过三极管扩流后再驱动蜂鸣器,这样 STM32F4 的 IO 只需要提供不到 1mA 的电流就足够了。
3. 硬件设计
本章需要使用到的硬件有:
-
指示灯DS0
-
蜂鸣器
DS0 在上一章已有介绍,而蜂鸣器在硬件上也是直接连接好了的, 不需要经过任何设置,直接编写代码就可以了。 蜂鸣器的驱动信号连接在 STM32F4 的 PF8 上。
图中我们用到一个 NPN 三极管(S8050)来驱动蜂鸣器, R61 主要用于防止蜂鸣器的误发声。当 PF.8 输出高电平的时候,蜂鸣器将发声, 当 PF.8 输出低电平的时候,蜂鸣器停止发声。
4. 软件设计
4.1 编程大纲
-
LED初始化
-
驱动蜂鸣器
4.2 代码分析
4.2.1 蜂鸣器宏定义
#ifndef __BEEP_H
#define __BEEP_H
#include "sys.h"
#define BEEP_GPIO GPIOF
#define BEEP_PIN GPIO_PIN_8
// 蜂鸣器高电平有效
#define BEEP_ON() HAL_GPIO_WritePin(BEEP_GPIO, BEEP_PIN, GPIO_PIN_SET)
#define BEEP_OFF() HAL_GPIO_WritePin(BEEP_GPIO, BEEP_PIN, GPIO_PIN_RESET)
void BEEP_Init(void);
#endif
还是简单的宏定义,不过要注意的是,我们这里的蜂鸣器是高电平有效。
4.2.2 蜂鸣器初始化函数
#include "beep.h"
void BEEP_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
__HAL_RCC_GPIOF_CLK_ENABLE(); // 使能GPIOF时钟
GPIO_InitStructure.Pin = BEEP_PIN; // PF8
GPIO_InitStructure.Mode = GPIO_MODE_OUTPUT_PP; // 推挽输出
GPIO_InitStructure.Pull = GPIO_PULLUP; // 上拉
GPIO_InitStructure.Speed = GPIO_SPEED_HIGH; // 高速
HAL_GPIO_Init(GPIOF, &GPIO_InitStructure); // 初始化GPIO
BEEP_OFF(); // 默认熄灭蜂鸣器
}
这段代码初始化了 GPIOF 的第 8 引脚,以控制连接到该引脚的蜂鸣器。这里的配置包括:
-
使能 GPIOF 时钟:
__HAL_RCC_GPIOF_CLK_ENABLE()
用于启用 GPIOF 的时钟,使能后 GPIOF 引脚可以进行操作。 -
配置 GPIO 引脚:
GPIO_Initure.Pin = GPIO_PIN_8;
:设置要配置的引脚为 PF8。GPIO_Initure.Mode = GPIO_MODE_OUTPUT_PP;
:将引脚配置为推挽输出模式,以便能驱动蜂鸣器。GPIO_Initure.Pull = GPIO_PULLUP;
:配置上拉电阻,保持引脚在空闲时为高电平。GPIO_Initure.Speed = GPIO_SPEED_HIGH;
:设置引脚为高速,以提高响应速度。
4.2.3 主函数
#include "sys.h"
#include "delay.h"
#include "usart.h"
#include "led.h"
#include "beep.h"
int main(void)
{
HAL_Init();
LED_Init();
BEEP_Init();
HAL_GPIO_WritePin(LED1_GPIO, LED1_PIN, GPIO_PIN_RESET); // 测试DS1
while(1)
{
BEEP_ON();
delay_ms(5000);
BEEP_OFF();
delay_ms(5000);
}
}
目前我们的主函数还是没啥可说的,非常简单。
5. 小结
前面的章节倒是很容易,本章我们主要学习的还是控制GPIO输出,无他-就一个函数而-HAL_GPIO_WritePin(),我们可以详细地说明一下:
HAL_GPIO_WritePin()
是 STM32 HAL 库中用于操作 GPIO(通用输入输出)引脚的一个函数。它用于设置指定 GPIO 引脚的电平状态(高或低)。这个函数的详细说明如下:
5.1 函数原型
void HAL_GPIO_WritePin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin, GPIO_PinState PinState);
5.2 参数说明
- GPIOx:
- 类型:
GPIO_TypeDef*
- 说明:指定要操作的 GPIO 端口。常见的端口包括
GPIOA
,GPIOB
,GPIOC
,GPIOD
,GPIOE
,GPIOF
, 等。
- GPIO_Pin:
- 类型:
uint16_t
- 说明:指定要操作的 GPIO 引脚。可以是一个引脚的掩码,如
GPIO_PIN_0
,GPIO_PIN_1
,GPIO_PIN_2
, 等。这些宏定义通常在 STM32 HAL 库的头文件中定义。
- PinState:
- 类型:
GPIO_PinState
- 说明:设置 GPIO 引脚的状态。可以是以下两种状态之一:
GPIO_PIN_RESET
:表示将引脚设置为低电平(0)。GPIO_PIN_SET
:表示将引脚设置为高电平(1)。
5.3 功能
HAL_GPIO_WritePin()
函数通过直接操作 GPIO 控制寄存器来设置引脚的电平状态。它会根据传入的 PinState
参数将指定的引脚设置为高电平或低电平。
示例
假设你要将 GPIOA
端口的第 5 号引脚设置为高电平,代码如下:
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5, GPIO_PIN_SET);
如果要将 GPIOB
端口的第 12 号引脚设置为低电平,代码如下:
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_12, GPIO_PIN_RESET);
5.4 应用场景
- 点亮/熄灭 LED:通常使用
HAL_GPIO_WritePin()
来控制 LED 的开关状态。 - 控制继电器:通过设置 GPIO 引脚来控制继电器的开关。
- 驱动其他外设:可以用于控制其他外设的开关状态,例如马达、蜂鸣器等。
通过这个函数,你可以灵活地操作 STM32 微控制器的 GPIO 引脚,以满足各种应用需求。
早在上一章我们就已经学习过啦,这里简单复习有效
2024.9.27 第一次修订,后期不再维护
2024.12.18 修补正文内容,优化代码