第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. 硬件设计

本章需要使用到的硬件有:

  1. 指示灯DS0

  2. 蜂鸣器

DS0 在上一章已有介绍,而蜂鸣器在硬件上也是直接连接好了的, 不需要经过任何设置,直接编写代码就可以了。 蜂鸣器的驱动信号连接在 STM32F4 的 PF8 上。

屏幕截图 2024 09 05 165006

图中我们用到一个 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 引脚,以控制连接到该引脚的蜂鸣器。这里的配置包括:

  1. 使能 GPIOF 时钟__HAL_RCC_GPIOF_CLK_ENABLE() 用于启用 GPIOF 的时钟,使能后 GPIOF 引脚可以进行操作。

  2. 配置 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 参数说明

  1. GPIOx:
  • 类型:GPIO_TypeDef*
  • 说明:指定要操作的 GPIO 端口。常见的端口包括 GPIOAGPIOBGPIOCGPIODGPIOEGPIOF, 等。
  1. GPIO_Pin:
  • 类型:uint16_t
  • 说明:指定要操作的 GPIO 引脚。可以是一个引脚的掩码,如 GPIO_PIN_0GPIO_PIN_1GPIO_PIN_2, 等。这些宏定义通常在 STM32 HAL 库的头文件中定义。
  1. 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 修补正文内容,优化代码

posted @ 2024-09-27 15:16  hazy1k  阅读(68)  评论(0编辑  收藏  举报