我在高职教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 作为输出口的使用方法,同时巩固了前面知识的学习。希望大家在开发板上实际验证一下,从而加深印象。

(本文完)

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C++语法04 标准输入语句

标准输入 使用格式:cin >> 输入的意思就是把一个值放到变量里面去,也就是变量的赋值,这个值是由我们自己输入的。 (注意:输入变量前要先定义,输入完之后要按Enter键。) 输入多个变量,与输出类似,…

【R语言入门】开启R的会话并大步向前!

R语言入门 – 开启R的会话并大步向前! R Programming Essentials – Launch R Session and Go Forward! By Jackson@ML 名言引述 There are only two kinds of languages: the ones people complain about and the ones nobody uses. –Bjarne Stroustrup 0. R语言的诞生 1…

LabVIEW程序内存泄漏分析与解决方案

维护他人编写的LabVIEW程序时,若发现程序运行时间越长,占用内存越大直至崩溃,通常是内存泄漏导致的。本文从多角度分析内存泄漏的可能原因,包括数组和字符串处理、未释放的资源、循环中的对象创建等,并提供具体的解决方…

前端开发之浏览器垃圾回收机制

前端开发之浏览器垃圾回收机制 V8引擎,作为Chrome浏览器和Node.js等环境下的JavaScript运行引擎,其垃圾回收机制是确保高效内存管理的关键。 V8垃圾回收机制的深度解析与优化 V8 JavaScript引擎采用了高效的垃圾回收机制,其中核心的实现特…

【细胞分割 + 图谱配准】论文综述

文章目录 一、细胞分割1.1、细胞分割:cellposeCellpose3: one-click image restoration for improved cellular segmentationCellpose 2.0: how to train your own modelCellpose: a generalist algorithm for cellular segmentation 1.2、细胞分割与染色 —— Cell…

《c语言》 switch case语句中定义变量

这两种情况涉及到C/C语言中switch语句的一个特殊用法和作用域的规则。关键的区别在于变量声明位置和作用域。 第一种方式 int main() {switch (1){case 1:int a; // 错误:在这里声明变量是不允许的break;} }在第一种方式中,直接在switch语句的第一个{后…

算法体系-19 第十九节 暴力递归到动态规划

一 动画规划的概念 优化出现重复解的递归 一旦写出递归来,改动态规划就很快 尝试策略和状态转移方程是一码事 学会尝试是攻克动态规划最本质的能力 如果你发现你有重复调用的过程,动态规划在算过一次之后把答案记下来,下回在越到重复调用过程…

MySQL中的隐式转换(Implicit Conversion)

MySQL中的隐式转换(Implicit Conversion)指的是在SQL语句的执行过程中,数据库管理系统(DBMS)自动进行的数据类型转换。这种转换通常发生在数据类型不匹配但需要进行比较、计算或赋值等操作时。 以下是一些关于MySQL隐…

助力全息通信技术!GPS-Gaussian实现2K实时人体新视点合成

论文标题: GPS-Gaussian: Generalizable Pixel-wise 3D Gaussian Splatting for Real-time Human Novel View Synthesis 论文作者: Shunyuan Zheng, Boyao Zhou, Ruizhi Shao, Boning Liu, Shengping Zhang, Liqiang Nie, Yebin Liu 项目地址&#x…

vscode不能进行go跳转

辗转反侧,弄了好久好久终于出山了 总结:跟vscode版本插件有关 老版本vscode DocsTool修改成godoc 新版本vscode go get golang.org/x/tools/goplslatest setting中 "go.useLanguageServer": true, "[go]": {"editor.snipp…

7.无代码爬虫八爪鱼采集器软件——采集规则/项目的创建与网址输入

接上篇 6.零代码网页爬虫软件基础实操——下载与安装八爪鱼采集器 八爪鱼免费爬虫软件下载: 八爪鱼采集器下载 小白数据采集神器​​https://affiliate.bazhuayu.com/retrieve 直接复制粘贴要采集的网站在这里就可以进入采集规则的设计器 自定义任务 通过这个功能…

移动端浏览器调试工具vconsole

方案一&#xff1a;通过CDN地址引入 步骤一&#xff1a;通过CDN地址引入 <script src"https://cdn.bootcss.com/vConsole/3.2.2/vconsole.min.js"></script> 步骤二&#xff1a;实例化 <script> var vConsole new VConsole(); </script&g…

WebSocket——学习

WebSocket WebSocket 的基本概念什么是 WebSocket&#xff1f;WebSocket 的优点 WebSocket 的工作原理握手过程数据传输 WebSocket APIJavaScript WebSocket API WebSocket 服务器端实现使用 Java 实现 WebSocket 服务器使用 Netty 实现 WebSocket 服务器 WebSocket 应用场景总…

力学中应变的度量01——我好几年的疑惑终于有解了

文章目录 0、背景描述1、拉伸比&#xff08;率&#xff09; λ \lambda λ2、应变的引入3、一维应变概念的拓展4 总结 0、背景描述 在学校里的时候&#xff0c;我就一直很好奇应变的定义为何如此花里胡哨、五花八门&#xff0c;各种教材又都只是定义&#xff0c;从来不解释究竟…

Kylin V10 Server 下TongRDS独立哨兵服务配置手册

一、网络架构设计 部署类型 目录 IP Port 中心节点 /opt/rds/pcenter 10.8.3.34 6300 服务节点 /opt/rds/pmemedb 10.8.3.35 TongRDS 协议端口:6200 Redis 仿真端口:6379 哨兵监听端口:26379 10.8.3.36 二、部署服务节点 1.查看操作系统信息 [root@localhost ~]# cat /etc/.…

代码随想录算法训练营Day41|背包问题、分割等和子集

背包问题 二维 46. 携带研究材料&#xff08;第六期模拟笔试&#xff09; (kamacoder.com) dp数组有两维&#xff0c;横轴表示背包重量j&#xff08;0-j&#xff09;&#xff0c;纵轴表示不同物品&#xff08;0-i&#xff09;&#xff0c;dp[i][j]即表示从下标为[0-i]的物品…

使用volta管理前端开发环境

背景&#xff1a;公司有新老不同的产品&#xff0c;使用的node版本不一样&#xff0c;每次都要手动切换node版本&#xff0c;对应的项目才能运行。这样很麻烦&#xff0c;有没有好的解决方法&#xff0c;就找到了volta。 1.为什么是volta&#xff1f; 管网介绍&#xff1a;使用…

国内外典型的知识图谱项目

文章目录 早期的知识库项目互联网时代的知识图谱中文开放知识图谱垂直领域知识图谱 从人工智能的概念被提出开始&#xff0c;构建大规模的知识库一直都是人工智能、自然语言理解等领域的核心任务之一。下面分别介绍早期的知识库项目、互联网时代的知识图谱、中文开放知识图谱和…

MYSQL 字母大小转换

1、UCASE() 解释&#xff1a;把数值列(字段)的字每母转换为大写。 语法格式&#xff1a;SELECT UCASE(column_name) FROM table_name 中文注释&#xff1a;select UCASE(数值列/字段) from 表名 ; 用法&#xff1a; SELECT UCASE(column_name) FROM table_name;2、LCASE(…

【论文阅读笔记】PA-SAM: Prompt Adapter SAM for High-Quality Image Segmentation

1.论文介绍 PA-SAM: Prompt Adapter SAM for High-Quality Image Segmentation PA-SAM&#xff1a;用于高质量图像分割的提示适配器SAM 2024年 ICME Paper Code 2.摘要 Segment Anything Model&#xff0c;SAM在各种图像分割任务中表现出了优异的性能。尽管SAM接受了超过10亿…