我在高职教STM32——GPIO入门之蜂鸣器

        大家好,我是老耿,高职青椒一枚,一直从事单片机、嵌入式、物联网等课程的教学。对于高职的学生层次,同行应该都懂的,老师在课堂上教学几乎是没什么成就感的。正因如此,才有了借助 CSDN 平台寻求认同感和成就感的想法。在这里,我准备陆续把自己花了很多心思的教学设计分享出来,主要面向广大师生朋友,单片机老鸟就略过吧。欢迎点赞+关注,各位的支持是本人持续输出的动力,多谢多谢!


        本篇我们延续上一章闪烁灯的主题,通过 STM32 的 IO 口来控制开发板上的有源蜂鸣器,实现发声控制。通过本篇的学习,你将进一步了解 STM32 的 IO 口作为输出口使用的方法。

【学习目标】

  1. 理解蜂鸣器的电路原理
  2. 续领悟 GPIO 的初始化和电平控制
  3. 会利用函数手册查找、使用函数

一、认识蜂鸣器

1.1 蜂鸣器的应用和分类

        蜂鸣器是一种一体化结构的电子讯响器,采用直流供电,广泛应用于计算机、打印机、复印机、报警器、电子玩具、汽车电子设备、电话机等电子产品中作发声器件。蜂鸣器按构造方式的不同,可分为电磁式蜂鸣器和压电式蜂鸣器;按其驱动方式的不同,可分为有源蜂鸣器和无源蜂鸣器。我们开发板上的蜂鸣器是电磁式的有源蜂鸣器,如图1所示。

图1 开发板上的有源蜂鸣器

        这里的有源或无源不是指电源的“源”,而是指有没有自带振荡源。有源蜂鸣器内部自带了振荡电路,一通电就会发声,声音频率固定;无源蜂鸣器则没有自带振荡电路,必须外部提供 2~5kHz 左右的方波驱动,才能发声,音调也会随驱动信号的频率变化而改变。

1.2 蜂鸣器的驱动电路

        上一篇,我们利用 STM32 的 IO 口去直接驱动 LED。本章的蜂鸣器,是否也能直接驱动呢?让我们来简单分析下:STM32F1 的单个 IO 最大可以提供 25mA 电流(来自数据手册),而蜂鸣器的驱动电流大概是 30mA,两者十分相近,但是全盘考虑,STM32F1 整个芯片的电流,最大也就 150mA,如果用 IO 口直接驱动蜂鸣器,其他地方用电就得省着点了。因此,在开发板的电路设计上,是将 IO 口信号通过三极管扩流后再驱动蜂鸣器,如图2所示,这样只需要提供不到 1mA 的电流就足够了。

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

        从上图可知,蜂鸣器的驱动信号连接在 STM32 的 PB3 引脚上,用一个 NPN 三极管 Q7 来驱动蜂鸣器,R55 主要用于防止蜂鸣器的误发声。当 PB3 输出高电平的时候,蜂鸣器发声;当 PB3 输出低电平的时,蜂鸣器停止发声。由此可见,IO 口使用虽然简单,但是和外部电路的匹配设计,还是十分讲究的,考虑越多,设计就越可靠,可能出现的问题也就越少。

二、蜂鸣器编程实践

2.1 任务描述

        实验现象很简单,我们让开发板上的蜂鸣器发出“嘀”…“嘀”的鸣响。这个实验的目的在于进一步熟悉 IO 口的使用,如果大家明白了上面蜂鸣器的发声原理,就会发现这个实验的控制方式跟上一章的闪烁灯如出一辙,也是“高电平—延时—低电平—延时”的循环套路。然而,PB3 这个引脚跟其他 IO 口相比有点特殊,我们对它初始化的时候还有一些附加操作,详见下面的代码分析。

2.2 工程文件清单

        按照上一章对工程文件的管理,控制一类新的硬件就增加一对与之匹配的驱动文件,即图3中的 beep.cbeep.h

图3 蜂鸣器工程文件清单

2.3 工程代码剖析

1. beep.h 源码剖析

        和上一章控制 LED 类似,代码清单1里定义了两个宏:BEEP_ONBEEP_OFF,用来实现向 PB3 输出高电平和低电平的操作,这样既简化了书写,还能见名知意。此外,头文件里肯定少不了函数声明,这里只有一个蜂鸣器端口初始化的函数。

//-----------------------------------------------------------------------
// 代码清单1:beep.h文件源码
//-----------------------------------------------------------------------

#ifndef  _BEEP_H_
#define  _BEEP_H_

#include "stm32f10x.h"

//------------------------------------------------------------------------
// 端口宏定义
//------------------------------------------------------------------------
#define  BEEP_PIN	GPIO_Pin_3

//------------------------------------------------------------------------
// 库函数操作宏定义
//------------------------------------------------------------------------
#define  BEEP_ON	GPIO_SetBits(GPIOB, BEEP_PIN)
#define  BEEP_OFF	GPIO_ResetBits(GPIOB, BEEP_PIN)
#define  BEEP_TOG	GPIO_WriteBit(GPIOB, BEEP_PIN, \
					(BitAction)(1-GPIO_ReadOutputDataBit(GPIOB, BEEP_PIN)))

//------------------------------------------------------------------------
// 函数声明
//------------------------------------------------------------------------
void Beep_Init(void);	//蜂鸣器端口初始化函数


#endif

2. beep.c 源码剖析

        如代码清单2所示,该文件只有一个 Beep_Init() 函数,完成对蜂鸣器 IO 口的初始化。

/**
 ************************************************************************
 * 代码清单2:beep.c
 * 描    述:蜂鸣器驱动
 * 平    台:OneNET STM32开发板V3.2
 * 作    者:老耿
 * 日    期:yyyy/mm/dd
 * 固 件 库:ST3.5.0
 * 版    本:V1.0
 * 说    明:初始化即可
 * 修改记录:无
 ************************************************************************
**/

//----------------------------------------------------------------------
// 必要的头文件
//----------------------------------------------------------------------
#include "beep.h"


/**
 ************************************************************************
 * 函 数 名:Beep_Init
 * 功    能:蜂鸣器IO口初始化
 * 入口参数:无
 * 出口参数:无
 * 说    明:注意PB3引脚的特殊性
 ************************************************************************
**/
void Beep_Init(void)
{
	//定义一个GPIO初始化对象(结构体)
	GPIO_InitTypeDef  gpio_initstruct;
	
	//打开必要的外设时钟
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB|RCC_APB2Periph_AFIO, ENABLE);
	
	//PB3引脚有特殊性,需要禁用默认的JTAG功能
	GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable, ENABLE);
	
	//填充初始化结构体,并执行生效
	gpio_initstruct.GPIO_Pin = BEEP_PIN;
	gpio_initstruct.GPIO_Mode = GPIO_Mode_Out_PP;
	gpio_initstruct.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GPIOB, &gpio_initstruct);
	
	//上电蜂鸣器关闭
	BEEP_OFF;
}

        大家应该看到了,上面的初始化跟上一章的 LED 端口初始化相比,还是有点不一样的。STM32F10x 系列的 MCU 复位后,PA13/14/15 以及 PB3/4 默认配置为 JTAG 功能。但是,这里的 PB3 并非 JTAG 调试引脚,于是就有了调用 GPIO_PinRemapConfig() 这个引脚重映射库函数,而参数
GPIO_Remap_SWJ_JTAGDisable 的意思是禁用 JTAG 调禁模式,使能 SW 调试模式。由于 SW调试模式并不使用 PB3 引脚,这样我们就即保障了程序可以正常地下载和调试,又可以用 PB3 作为普通 IO 口控制蜂鸣器了。

        由此可见,PB3 已经不是单纯的 IO 口了,还附加了调试功能。因此,我们在初始化的时候还打开了IO口复用这个外设(RCC_APB2Periph_AFIO)的时钟。

3. main.c源码剖析

        主程序很简单,见代码清单3,请结合注释来阅读。

/**
 ******************************************************
 * 代码清单3:main.c
 * 项    目:有源蜂鸣器
 * 任务描述:上电后嘀嘀嘀
 * 实验平台:OneNET STM32开发板V3.2
 * 作    者:老耿
 * 日    期:yyyy/mm/dd
 ******************************************************
**/

//-----------------------------------------------------
// 必要的头文件
//-----------------------------------------------------
#include "delay.h"
#include "beep.h"


//-----------------------------------------------------
// 主函数
//-----------------------------------------------------
int main()
{
	delay_init();	//延时初始化
	Beep_Init();	//蜂鸣器初始化
	
	//主循环
	while(1)
	{
		BEEP_ON;
		delay_ms(300);
		BEEP_OFF;
		delay_ms(300);
        
        //或者简化成以下两句
        //BEEP_TOG;
        //delay_ms(300);
	}
}

三、验证与测试

        同样,我们通过ST-Link下载代码,下载完成后,蜂鸣器开始“嘀嘀嘀”鸣响,间隔为0.3秒左右,符合预期设计。

        至此,我们的本章的学习就结束了。作为 STM32 的入门第二个例子,进一步介绍了 GPIO 作为输出口的使用方法,同时巩固了前面知识的学习。希望大家在开发板上实际验证一下,从而加深印象。

(本文完)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/719011.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

聚四氟乙烯离心管 四氟反应管 消解管 PTFE螺口带盖管 特氟龙试管

一、产品介绍 样品悬浮液盛放在管状试样容器中,在离心机的高速旋转下,由于巨大的离心力作用,使悬浮的微小颗粒 以一定的速度沉降,从而与溶液得以分离。这种带密封盖或压盖的管状试样容器,就是离心管。 PTFE离心管&…

《STM32 HAL库》RCC 相关系列函数详尽解析—— HAL_RCC_OscConfig()

观前提示:函数完整代码在文末,本文梳理了函数HAL_RCC_OscConfig()的主要逻辑和实现方法f105时钟树详解图 HAL_RCC_OscConfig() 函数介绍: 此函数是一个用于初始化RCC(Reset and Clock Control)振荡器(Osc…

【ArcGIS微课1000例】0120:ArcGIS批量修改符号的样式(轮廓)

ArcGIS可以批量修改符号的样式,如样式、填充颜色、轮廓等等。 文章目录 一、加载实验数据二、土地利用符号化三、批量修改符号样式四、注意事项一、加载实验数据 订阅专栏后,从私信查收专栏配套的完整实验数据包,打开0120.rar中的土地利用数据,如下图所示: 查看属性表: …

全光万兆时代来临:信而泰如何推动F5G-A(50PONFTTR)技术发展

技术背景 F5G-A(Fifth Generation Fixed Network-Advanced,第五代固定网络接入)是固定网络技术的一次重大升级,代表了光纤网络技术的最新发展。F5G-A旨在提供更高的带宽、更低的延迟、更可靠的连接以及更广泛的应用场景。 F5G-A六…

ORION Space Scene Generation Framework

ORION太空场景生成框架是一个涵盖所有太空场景生成方面的系统,从程序化的行星和宇宙飞船到任何相关的特效,支持所有管道。 重要提示!!!:ORION资产可以从Sky Master ULTIMATE升级,从而可以与Sky Master ULTIMATE的全容积行星云和大气效果相结合,最适合在云层中飞行。 这…

HTML静态网页成品作业(HTML+CSS)——美食火锅介绍网页(1个页面)

🎉不定期分享源码,关注不丢失哦 文章目录 一、作品介绍二、作品演示三、代码目录四、网站代码HTML部分代码 五、源码获取 一、作品介绍 🏷️本套采用HTMLCSS,未使用Javacsript代码,共有1个页面。 二、作品演示 三、代…

springboot知识点大全

文章目录 LombokLombok介绍Lombok常用注解Lombok应用实例代码实现idea安装lombok插件 Spring InitializrSpring Initializr介绍Spring Initializr使用演示需求说明方式1: IDEA创建方式2: start.spring.io创建 注意事项和说明 yaml语法yaml介绍使用文档yaml基本语法数据类型字面…

rk3568 适配WiFi模组(四)

rk3568 适配WiFi模组(Pcie+USB) 本篇文章简单讲解由Pcie+USB组成WiFi模组在rk3568 Android12适配过程。RTL8822CE是Realtek推出的一款802.11ac WiFi +蓝牙5.0组合模块。PCI Express(Peripheral Component Interconnect Express)总线WiFi,USB(Universal Serial Bus)连接蓝…

搜索与人工智能相结合如何解决企业数据问题?

作者:来自 Elastic Fermi Fang 企业数据是好处还是负担? 组织正被数据淹没 —— 从安全事件日志和应用程序错误消息到物联网指标和帮助中心常见问题解答。这些丰富的信息通常存在于孤立的孤岛中,在整合这些信息以提升客户体验、提高运营弹性…

关于html简单的学习和链接博客

HTML(超文本标记语言)是用于创建网页的标准标记语言。它通过使用一系列元素和标记来定义网页的结构和布局。这些元素用于表示标题、段落、链接、图像、列表和网页上各种其他类型的内容。HTML是网络的基础,是创建和设计网站的关键。 下面简单…

第十七课,海龟画图习题课(一)

图案一,半圆 import turtleturtle.circle(50, 180)turtle.left(90)turtle.forward(100) 图案二,同心圆 import turtleturtle.circle(100)turtle.right(90)turtle.penup()turtle.forward(50)turtle.pendown()turtle.left(90)turtle.circle(150) 图案三&am…

MYSQL部分术语及原理解释(缓冲池、LRU、redo log buffer、WAL、Checkpoint、LSN)

文章目录 一、缓冲池 Buffer Pool二、 LRU List、Free List、Flush List三、 重做日志缓存redo log buffer四、WAL与Checkpoint五、LSN 总结来自《MySQL技术内幕 InnoDB存储引擎》 第二版 一、缓冲池 Buffer Pool InnoDB存储引擎的MySQL是基于磁盘的数据库系统。缓冲池是一片内…

Ubuntu与RedHat Linux的不同

部署Ubuntu 安装在服务器上的系统一般追求极致的稳定,所以安装系统时为了避免潜在的问题,所以选的时候应该往后推选几个版本 首先因为现在使用的电脑是MacBook,还是最新的Mac所以在部署的时候要注意其安装的支持芯片架构(最新的…

事务所管理系统的设计

管理员账户功能包括:系统首页,个人中心,管理员管理,客户管理,评论管理,基础数据管理,公告信息管理 客户账户功能包括:系统首页,个人中心,律师管理&#xff0…

【Python机器学习实战】----基于AdaBoost分类树模型、梯度提升分类树模型、Bagging分类树模型以及随机森林分类模型对空气质量等级进行预测

🎩 欢迎来到技术探索的奇幻世界👨‍💻 📜 个人主页:一伦明悦-CSDN博客 ✍🏻 作者简介: C软件开发、Python机器学习爱好者 🗣️ 互动与支持:💬评论 &…

【Redis实战篇】redis的擅长实现的功能

🔥作者主页:小林同学的学习笔录 🔥小林同学的专栏:JAVA之基础专栏 【Redis实战篇】Redis有可能出现的问题以及如何解决问题_redis实现用户登录可能造成哪些问题-CSDN博客 本文接上面的文章 目录 2.优惠券秒杀 2.1 全局唯一ID 2.…

微信小程序-界面提示框和消息

一.Loading加载框 小程序提供了wx.showLoading用来在加载界面的时候使用,比如加载图片和数据的时候可以使用。 常常和wx.hideLoading()配合使用,否则加载框一直存在。 其效果如下: 代码如下: //显示加载消息wx.showLoading({//提…

【Java】已解决java.lang.CloneNotSupportedException异常

文章目录 问题背景可能出错的原因错误代码示例正确代码示例注意事项 已解决java.lang.CloneNotSupportedException异常 在Java编程中,java.lang.CloneNotSupportedException是一个常见的运行时异常,它发生在尝试调用对象的clone()方法时,但该…

【Effective Web】常见的css布局方式--三栏布局

常见的css居中方式–三栏布局 第一种实现&#xff1a;table布局&#xff08;不推荐&#xff09; 缺点&#xff1a;在table加载前&#xff0c;整个table都是空白的&#xff0c;且修改布局排版都十分困难 <table class"container"><td class"left"…

C++及cmake语法介绍

c/cmake学习 文章目录 c/cmake学习1. c1.1 基本模型1.1.1 for循环1.1.2 main函数1.1.2 带参数函数编译函数 2. CMAKE2.1 相关命令2.1.1 编译基本命令2.1.2 动态库静态库编译2.1.3 消息输出2.1.4 cmake变量常见参数1. 设置构建类型2. 设置编译器标志3. 指定编译器4. 设置安装路径…