1)实验平台:【正点原子】 NANO STM32F103 开发板

2)摘自《正点原子STM32 F1 开发指南(NANO 板-HAL 库版)》关注官方微信号公众号,获取更多资料:正点原子

stm32蜂鸣器模块资料(STM32F103开发板资料连载)(1)

第七章 蜂鸣器实验

上一章,我们介绍了 STM32F1 的 IO 口作为输出的使用,这一章,我们将通过另外一个例子讲述STM32F1 的 IO 口作为输出的使用。在本章中,我们将利用一个 IO 口来控制板载的有源蜂鸣器,实现蜂鸣器控制。通过本章的学习,你将进一步了解 STM32F1 的 IO 口作为输出口使用的方法。本章分为如下几个小节:

7.1 蜂鸣器简介

7.2 硬件设计

7.3 软件设计

7.4 仿真与下载

7.5 STM32CubeMX 配置 IO 口

7.1 蜂鸣器简介

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

stm32蜂鸣器模块资料(STM32F103开发板资料连载)(2)

图 7.1.1 有源蜂鸣器

这里的有源不是指电源的“源”,而是指有没有自带震荡电路,有源蜂鸣器自带了震荡电路,一通电就会发声;无源蜂鸣器则没有自带震荡电路,必须外部提供 2~5Khz 左右的方波驱动,才能发声。前面我们已经对 STM32 的 IO 做了简单介绍,上一章,我们就是利用 STM32 的 IO 口直接驱动 LED 的,本章的蜂鸣器,我们能否直接用 STM32 的 IO 口驱动呢?让我们来分析下:STM32的单个 IO 最大可以提供 25mA 电流(来自数据手册),而蜂鸣器的驱动电流是 30mA 左右,两者十分相近,但是全盘考虑,STM32 整个芯片的电流,最大也就 150mA,如果用 IO 口直接驱动蜂鸣器,其他地方用电就得省着点了…所以,我们不用 STM32 的 IO 直接驱动蜂鸣器,而是通过三极管扩流后再驱动蜂鸣器,这样 STM32 的 IO 只需要提供不到 1mA 的电流就足够了。IO 口使用虽然简单,但是和外部电路的匹配设计,还是要十分讲究的,考虑越多,设计就越可靠,可能出现的问题也就越少。本章将要实现的是控制 ALIENTEK NANO STM32 开发板上的蜂鸣器发出:“嘀”…“ 嘀”…的间隔声,进一步熟悉 STM32 IO 口的使用。

7.2 硬件设计

本章需要用到的硬件有:

1)指示灯 DS0

2)蜂鸣器

DS0 在上一章已有介绍,而蜂鸣器在硬件上也是直接连接好了的,不需要经过任何设置,

直接编写代码就可以了。蜂鸣器的驱动信号连接在 STM32 的 PB8 上。如图 7.2.1 所示:

stm32蜂鸣器模块资料(STM32F103开发板资料连载)(3)

图 7.2.1 蜂鸣器与 STM32 连接原理图

图中我们用到一个 PNP 三极管(S8550)来驱动蜂鸣器,R25 主要用于控制 PNP 管饱和导

通作用。当 PB.8 输出低电平的时候,蜂鸣器将发声,当 PB.8 输出高电平的时候,蜂鸣器停止

发声。

7.3 软件设计

大家可以直接打开本实验工程。也可以按下面的步骤在实验 1 的基础上新建蜂鸣器实验工

程。复制上一章的 LED 实验工程,然后打开 USER 目录,把目录下面工程 LED.uvprojx 重命名

为 BEEP.uvprojx。,然后在 HARDWARE 文件夹下新建一个 BEEP 文件夹,用来存放与蜂鸣器

相关的代码。如图 7.3.1 所示:

stm32蜂鸣器模块资料(STM32F103开发板资料连载)(4)

图 7.3.1 在 HARDWARE 下新增 BEEP 文件夹

然后我们打开 USER 文件夹下的 BEEP.uvprojx 工程,按

按钮新建一个文件,然后保存在

HARDWARE→BEEP 文件夹下面,保存为 beep.c。在该文件中输入如下代码:

#include "beep.h"

//蜂鸣器 IO 初始化

void BEEP_Init(void)

{

GPIO_InitTypeDef GPIO_Initure;

__HAL_RCC_GPIOB_CLK_ENABLE(); //开启 GPIOB 时钟

GPIO_Initure.Pin=GPIO_PIN_8; //PB8

GPIO_Initure.Mode=GPIO_MODE_OUTPUT_PP; //推挽输出

GPIO_Initure.Pull=GPIO_PULLUP; //上拉

GPIO_Initure.Speed=GPIO_SPEED_HIGH; //高速

HAL_GPIO_Init(GPIOB,&GPIO_Initure);

HAL_GPIO_WritePin(GPIOB,GPIO_PIN_8,GPIO_PIN_SET);

//蜂鸣器对应引脚 GPIOB8 拉高,

}

这段代码 仅包含 1 个函数:void BEEP_Init(void),该函数的作用就是使能 PORTB 的时钟,

同时配置 PB8 为推挽输出。这里的初始化内容跟实验 6 跑马灯实验几乎是一样的,这里就不做

深入的讲解。

保存 beep.c 代码,然后我们按同样的方法,新建一个 beep.h 文件,也保存在 BEEP 文件夹

下面。在 beep.h 中输入如下代码:

#ifndef __BEEP_H

#define __BEEP_H

#include "sys.h"

//蜂鸣器端口定义

#define BEEP PBout(8) // 蜂鸣器控制 IO

void BEEP_Init(void);//初始化

#endif

和上一章一样,我们这里还是通过位带操作来实现某个 IO 口的输出控制,BEEP 就直接代

表了 PB8 的输出状态。我们只需要令 BEEP=0,就可以让蜂鸣器发声。

将 beep.h 也保存。接着,我们把 beep.c 加入到 HARDWARE 这个组里面,这一次我们通过

双击的方式来增加新的.c 文件,双击 HARDWARE,找到 beep.c,加入到 HARDWARE 里面,

如图 7.3.2 所示:

stm32蜂鸣器模块资料(STM32F103开发板资料连载)(5)

图 7.3.2 将 beep.c 加入 HARDWARE 组下

可以看到 HARDWARE 文件夹里面多了一个 beep.c 的文件,然后还是用老办法把 beep.h

头文件所在的路径加入到工程里面。回到主界面,在 main.c 里面编写如下代码:

#include "sys.h"

#include "delay.h"

#include "usart.h"

#include "led.h"

#include "beep.h"

int main(void)

{

HAL_Init(); //初始化 HAL 库

Stm32_Clock_Init(RCC_PLL_MUL9); //设置时钟,72M

delay_init(72); //初始化延时函数

LED_Init(); //初始化 LED

BEEP_Init(); //初始化蜂鸣器端口

while(1)

{

HAL_GPIO_WritePin(GPIOC,GPIO_PIN_0,GPIO_PIN_RESET);

//DS0 拉低,亮 等同 LED0=0;

HAL_GPIO_WritePin(GPIOB,GPIO_PIN_8,GPIO_PIN_SET);

//BEEP 引脚拉高,不响,等同 BEEP=1;

delay_ms(300);//延时 500ms

HAL_GPIO_WritePin(GPIOC,GPIO_PIN_0,GPIO_PIN_SET);

//DS0 拉高,亮 等同 LED0=1;

HAL_GPIO_WritePin(GPIOB,GPIO_PIN_8,GPIO_PIN_RESET);

//BEEP 引脚拉低,响, 等同 BEEP=0;

delay_ms(300);

}

}

注意要将 BEEP 文件夹加入头文件包含路径,不能少,否则编译的时候会报错。这段代码

就实现前面 7.1 节所阐述的功能,同时加入了 DS0(LED0)的闪烁来提示程序运行(后面的代

码,我们基本都会加入这个),整个代码比较简单。

然后编译工程,得到结果如图 7.3.3 所示:

stm32蜂鸣器模块资料(STM32F103开发板资料连载)(6)

图 7.3.3 编译结果

可以看到没有错误,也没有警告。接下来,大家就可以下载验证了。

7.4 仿真与下载

我们可以先用软件仿真,看看结果对不对,根据软件仿真的结果,然后再下载到 NANO

STM32 开发板上面看运行是否正确。首先,我们进行软件仿真。开始仿真,接着显示逻辑分析窗口,点击 Setup,新建 2 个信号:PORTC.0 和 PORTB.8,如图 7.4.1 所示:

stm32蜂鸣器模块资料(STM32F103开发板资料连载)(7)

图 7.4.1 新建仿真信号

接着,点击开始运行。运行一段时间之后,暂停仿真回到逻辑分析窗口,可以看到如图 7.4.2 所示的波形:

stm32蜂鸣器模块资料(STM32F103开发板资料连载)(8)

图 7.4.2 仿真波形

从图中我们可以看出,PC.0 和 PB.8 同时输出高和低电平,和我们预计的效果是一样的,

周期是 0.6s,符合预期设计。接下来可以把代码下载到 NANO STM32 开发板上看看运行结果

是否正确。

下载完代码,可以看到 DS0 亮的时候蜂鸣器叫,而 DS0 灭的时候,蜂鸣器不叫。间隔为

0.3 秒左右,符合预期设计。

至此,我们的本章的学习就结束了。本章,作为 STM32 的入门第二个例子,进一步介绍

了 STM32 的 IO 作为输出口的使用方法,同时巩固了前面的学习。希望大家在开发板上实际验

证一下,从而加深印象。

7.5 STM32CubuMX 配置 IO 口

上一章我们讲解了使用 STM32CubeMX 工具配置 GPIO 的一般方法。本章同样也是配置 IO

口为输出模式。这里我们就直接列出 IO 口配置截图,具体方法请参考 4.8 和上一章跑马灯实验。

根据 7.2 小节讲解,知道 NANO 板上的蜂鸣器是连在 PB8 上。

使用 STM32CubeMX 打开光盘工程模板(双击工程目录的 Template.ioc),目录为“4,程序源

码\标准例程-库函数版本\实验 0-3 Template 工程模板-使用 STM32CubeMX 配置”。我们首先在

IO 口引脚图上,依次配置 2 个 IO 口 PB8 和 PC0 为输出模式,这里我们以 PB8 为例,操作方

法如下图 7.5.1 所示:

stm32蜂鸣器模块资料(STM32F103开发板资料连载)(9)

图 7.5.1 配置 PB8 为输出模式

同样的方法,我们配置 PC0,然后我们进入 Configuration->GPIO 配置界面,配置方法如下

图 7.5.2 所示:

stm32蜂鸣器模块资料(STM32F103开发板资料连载)(10)

图 7.5.2 配置 IO 口详细参数

配置完成 IO 参数之后,接下来我们同样生成工程。打开生成的工程会发现,main.c 文件中

添加了函数 MX_GPIO_Init 函数,内容如下:

static void MX_GPIO_Init(void)

{

GPIO_InitTypeDef GPIO_InitStruct;

/* GPIO Ports Clock Enable */

__HAL_RCC_GPIOD_CLK_ENABLE();

__HAL_RCC_GPIOC_CLK_ENABLE();

__HAL_RCC_GPIOB_CLK_ENABLE();

/*Configure GPIO pin Output Level */

HAL_GPIO_WritePin(GPIOC, GPIO_PIN_0, GPIO_PIN_SET);

/*Configure GPIO pin Output Level */

HAL_GPIO_WritePin(GPIOB, GPIO_PIN_8, GPIO_PIN_SET);

/*Configure GPIO pin : PC0 */

GPIO_InitStruct.Pin = GPIO_PIN_0;

GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;

GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;

HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);

/*Configure GPIO pin : PB8 */

GPIO_InitStruct.Pin = GPIO_PIN_8;

GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;

GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;

HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);

}

该函数实现的功能和蜂鸣器实验的功能一模一样。有兴趣的同学可以直接复制该函数内容

替换蜂鸣器实验中的 BEEP_Init 和 LED_Init 函数内容,替换后会发现实现的现象完全一致。

使用 STM32CubeMX 配置 IO 口就给大家介绍到这里。

,