前言:
如今咱们对“beep函数c语言”大约比较关切,我们都想要分析一些“beep函数c语言”的相关知识。那么小编也在网摘上网罗了一些对于“beep函数c语言””的相关资讯,希望各位老铁们能喜欢,同学们一起来了解一下吧!1)实验平台:【正点原子】 NANO STM32F103 开发板
2)摘自《正点原子STM32 F1 开发指南(NANO 板-HAL 库版)》关注官方微信号公众号,获取更多资料:正点原子
第七章 蜂鸣器实验
上一章,我们介绍了 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 所示:
图 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 所示:
图中我们用到一个 PNP 三极管(S8550)来驱动蜂鸣器,R25 主要用于控制 PNP 管饱和导
通作用。当 PB.8 输出低电平的时候,蜂鸣器将发声,当 PB.8 输出高电平的时候,蜂鸣器停止
发声。
7.3 软件设计
大家可以直接打开本实验工程。也可以按下面的步骤在实验 1 的基础上新建蜂鸣器实验工
程。复制上一章的 LED 实验工程,然后打开 USER 目录,把目录下面工程 LED.uvprojx 重命名
为 BEEP.uvprojx。,然后在 HARDWARE 文件夹下新建一个 BEEP 文件夹,用来存放与蜂鸣器
相关的代码。如图 7.3.1 所示:
然后我们打开 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 所示:
可以看到 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 所示:
可以看到没有错误,也没有警告。接下来,大家就可以下载验证了。
7.4 仿真与下载
我们可以先用软件仿真,看看结果对不对,根据软件仿真的结果,然后再下载到 NANO
STM32 开发板上面看运行是否正确。首先,我们进行软件仿真。开始仿真,接着显示逻辑分析窗口,点击 Setup,新建 2 个信号:PORTC.0 和 PORTB.8,如图 7.4.1 所示:
图 7.4.1 新建仿真信号
接着,点击开始运行。运行一段时间之后,暂停仿真回到逻辑分析窗口,可以看到如图 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 所示:
同样的方法,我们配置 PC0,然后我们进入 Configuration->GPIO 配置界面,配置方法如下
图 7.5.2 所示:
配置完成 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 口就给大家介绍到这里。