STM32学习笔记:蜂鸣器实验

2023-05-16

STM32学习笔记:蜂鸣器实验

蜂鸣器实现原理和led点亮大同小异,所以就不重新编写了。

一.所使用的函数

1.时钟使能函数
  RCC_APB2PeriphClockCmd(uint32_t RCC_APB2Periph, FunctionalState NewState)
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE); //使能GPIOB的时钟
2.引脚初始化函数
  GPIO_Init(GPIO_TypeDef* GPIOx, GPIO_InitTypeDef* GPIO_InitStruct)
  GPIO_Init(GPIOB,&GPIO_InitStructure); 
3.对IO口置1
  GPIO_SetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin)
  GPIO_SetBits(GPIOB,GPIO_Pin_8);
4.对IO口置0
  GPIO_ResetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin)
  GPIO_ResetBits(GPIOB,GPIO_Pin_8);

二.硬件部分

蜂鸣器有两种有源蜂鸣器和无源蜂鸣器。有源和无源这里的“源”不是指电源,而是指震荡源。也就是说,有源蜂鸣器内部带震荡源,所以只要一通电就会叫。而无源内部不带震荡源,所以如果用直流信号无法令其鸣叫。必须用2K~5K的方波去驱动它。
a为有源蜂鸣器,b为无源蜂鸣器

三.代码编写过程整理

1.编写beep.h头文件

#ifndef __BEEP_H
#define __BEEP_H
void beep_Iint(void); //函数声明,在.c的文件中定义
#endif //避免头文件内容被重复定义

2.编写beep.c文件

在该文件中引用了beep.h的头文件,先声明了 void beep_Iint(void) 这个函数,然后对该函数进行定义

#include "beep.h"
#include "stm32f10x.h"

void beep_Iint(void)
{
	GPIO_InitTypeDef GPIO_InitStructure; 
	
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE); //使能GPIOB的时钟
	
	GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP; //设置推挽输出
	GPIO_InitStructure.GPIO_Pin=GPIO_Pin_8; //蜂鸣器对应的引脚为PB8
	GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz; //输出速度为50MHz
    GPIO_Init(GPIOB,&GPIO_InitStructure); //GPIOB初始化
    
	GPIO_SetBits(GPIOB,GPIO_Pin_8); //对IO口置1
}

在这部分编写代码的时候,首先运用到的是rcc头文件中的使能时钟的函数,基本上所有的程序在开始都需要使能时钟,然后就是对时钟进行初始化,在go to definition之后,我们发现它的入口第二个条件是一个结构体,我们就定义了一个指针GPIO_InitStructure指向GPIO_InitTypeDef ,GPIO_InitTypeDef是一个结构体变量,该变量在Stm32f10x_gpio.h头文件中被定义,原型如下:

typedef struct
{
  uint16_t GPIO_Pin;             //GPIO_pins_define
  GPIOSpeed_TypeDef GPIO_Speed;  //GPIOSpeed_TypeDef 
  GPIOMode_TypeDef GPIO_Mode;    //GPIOMode_TypeDef 
    
}GPIO_InitTypeDef;

所以我们分别要对这三个结构体成员进行赋值:

首先,第一个变量为GPIO_Pin是一个16为的无符号数(uint),该数只有16位,每一位代表一个引脚,如果想要要配置某一个端口的某一个引脚只需要把相应的位置1就可以了。在STM32的固件库中有如下引脚号定义:

#define GPIO_Pin_0                 ((uint16_t)0x0001)  /*!< Pin 0 selected */
#define GPIO_Pin_1                 ((uint16_t)0x0002)  /*!< Pin 1 selected */
#define GPIO_Pin_2                 ((uint16_t)0x0004)  /*!< Pin 2 selected */
#define GPIO_Pin_3                 ((uint16_t)0x0008)  /*!< Pin 3 selected */
#define GPIO_Pin_4                 ((uint16_t)0x0010)  /*!< Pin 4 selected */
#define GPIO_Pin_5                 ((uint16_t)0x0020)  /*!< Pin 5 selected */
#define GPIO_Pin_6                 ((uint16_t)0x0040)  /*!< Pin 6 selected */
#define GPIO_Pin_7                 ((uint16_t)0x0080)  /*!< Pin 7 selected */
#define GPIO_Pin_8                 ((uint16_t)0x0100)  /*!< Pin 8 selected */
#define GPIO_Pin_9                 ((uint16_t)0x0200)  /*!< Pin 9 selected */
#define GPIO_Pin_10                ((uint16_t)0x0400)  /*!< Pin 10 selected */
#define GPIO_Pin_11                ((uint16_t)0x0800)  /*!< Pin 11 selected */
#define GPIO_Pin_12                ((uint16_t)0x1000)  /*!< Pin 12 selected */
#define GPIO_Pin_13                ((uint16_t)0x2000)  /*!< Pin 13 selected */
#define GPIO_Pin_14                ((uint16_t)0x4000)  /*!< Pin 14 selected */
#define GPIO_Pin_15                ((uint16_t)0x8000)  /*!< Pin 15 selected */
#define GPIO_Pin_All               ((uint16_t)0xFFFF)  /*!< All pins selected */

其次, GPIOSpeed_TypeDef是一个枚举变量,用来存储GPIO的速度,其定义如下:

typedef enum
{ 
  GPIO_Speed_10MHz = 1,
  GPIO_Speed_2MHz, 
  GPIO_Speed_50MHz
}GPIOSpeed_TypeDef;

它有三种取值,也就是说GPIO的速度有三种取值,枚举变量为1时GPIO的速度对应10MHz,枚举变量为2时GPIO的速度对应2MHz,枚举变量为3时GPIO的速度对应50MHz,总结如下图:

GPIO的速度枚举变量的取值
10MHz1
2MHz2
50MHz3

最后, GPIOMode_TypeDef也是一个枚举变量,用来存储GPIO的工作模式,其定义如下:

typedef enum
{ GPIO_Mode_AIN = 0x0, //模拟输入
  GPIO_Mode_IN_FLOATING = 0x04, //浮空输入
  GPIO_Mode_IPD = 0x28, //带下拉输入
  GPIO_Mode_IPU = 0x48, //带上拉输入
  GPIO_Mode_Out_OD = 0x14, //开漏输出
  GPIO_Mode_Out_PP = 0x10, //推挽输出(我们所选用的模式)
  GPIO_Mode_AF_OD = 0x1C, //复用功能的开漏输出
  GPIO_Mode_AF_PP = 0x18 //复用功能的推挽输出
}GPIOMode_TypeDef;

在对结构体赋值完之后,我们对led的IO口进行置1,主要是为了让led保持熄灭的状态,在这里我们用到了GPIO_SetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin)这个函数:

GPIO_SetBits(GPIOB,GPIO_Pin_8); //对IO口置1

3.编写main.c文件

#include "stm32f10x.h"
#include "beep.h"
#include "delay.h" //这里的delay的头文件是自己写的一个延迟函数的头文件,自己在主函数中编写也是可以的

int main (void)
{
	beep_Iint(); //我们之前编写的LED初始化函数,对IO口进行配置并且进行初始化
	delay_init(); //自己编写的延迟函数的初始化
	while(1)
	{
		GPIO_SetBits(GPIOB,GPIO_Pin_5); //IO口置0
		delay_ms(300);
		GPIO_ResetBits(GPIOB,GPIO_Pin_5); //IO口置1
		delay_ms(300);
	}
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

STM32学习笔记:蜂鸣器实验 的相关文章

  • go语言获取发送信号的进程pid

    背景 今天在发布一个程序之前 xff0c 给qa提测的时候 xff0c qa反馈程序运行10几分钟之后 xff0c 退出了 排查过程 在程序中加日志 xff0c 发现程序捕获到了一个SIGTERM信号 xff0c 然后做了一些退出前的清理工
  • ubuntu-E:Encountered a section with no Package: header的解决办法

    刚才打开ubuntu xff0c 我的版本是12 04 正想使用sudo apt get install build essential 时 xff0c 出现了如下错误 xff1a E Encountered a section with
  • scrcpy源码阅读及在Ubuntu上的实现(一)——了解原理

    那开篇就问问为什么需要研究这个源码吧 xff1a 在移动互联网的时代下 xff0c 手机的功能是日益增加的 xff0c 要使工作变得更加的高效 xff0c 那么键盘鼠标其实是必不可少的 在许多软件的架构中 xff0c 其实并没有提供对应的桌
  • 文件或目录损坏且无法读取的解决办法

    方法很简单 用 chkdsk 命令即可 详解如下 开始 运行 输入 cmd 输入 chkdsk 盘符 f 等命令运行完即可 这里要注意的是 那个冒号后面要空一格 别跟着就写 34 f 34
  • Linux技巧-如何查看系统信息-硬盘、分区信息以及磁盘用量

    使用 hdparm 获得硬盘的生产厂家 xff0c 类型等基本信息 xff0c 这里我们之提供简单的使用 xff0c 以后 hdparm i dev sda 通过 smartctl命令来获取硬盘的详细信息 xff1a smartctl a
  • 朋友答App技术服务支持

    朋友答App有任何使用问题 xff0c 欢迎留言交流
  • Matlab调用Cuda程序

    目录 一 环境配置 1 GPU 43 VisualStudio 43 Matlab版本适配性查看 2 Matlab环境配置 二 使用Matlab编译CUDA工程 1 建立CUDA工程并编写GPU代码 2 编写可供Matlab编译的CUDA代
  • python函数参数*args**kwargs用法实例

    http www jb51 net article 44104 htm python当函数的参数不确定时 xff0c 可以使用 args和 kwargs args没有key值 xff0c kwargs有key值 下面看例子 复制代码 代码如
  • 简易图解移轴镜头 (Tilt-Shift Lens) 原理 简易图解移轴镜头 (Tilt-Shift Lens) 原理

    http fotomen cn 2012 10 tilt shift lens 移轴镜 Tilt Shift Lens 是颇昂贵的玩意 xff0c 例如 Canon 的 TS E 24mm f 3 5L II xff0c 官方零售价是 HK
  • GTA5最新线上小助手

    https wwr lanzoui com ivR9Wsuixmb 密码 4ug1
  • DELL-R730服务器U盘安装操作系统指南

    一 系统安装注意事项 xff1a 1 DELL服务器安装系统 xff0c 根据实际情况先做raid5 xff0c 因为我们有3块硬盘 xff1b 2 安装系统前先把U盘做成启动盘 xff0c 然后下载相应的阵列卡驱动 xff0c 阵列卡驱动
  • VCS2018 linux 安装

    VCS linux 安装 自己去网上找2018版本的vcs 和verdi xff0c 就不贴出来了 xff0c 这里把安装过程中遇到的一些问题留作记录 声明 xff1a 只做学术研究 xff0c 不做商业用途 xff0c 公司使用推荐购买正
  • Ubuntu mate 20.04及无vnc的Ubuntu 系统开启vnc

    Ubuntu mate 20 04及无vnc的Ubuntu 系统开启vnc 目录 Ubuntu mate 20 04及无vnc的Ubuntu 系统开启vnc1 介绍2 步骤 1 介绍 2 步骤 1 介绍 我学习ros机器人的过程中 xff0
  • OpenCV入门(四)——边缘检测

    目录 0x01 梯度算子 0x02 一阶微分算子 0x03 二阶微分算子 0x04 图像差分运算 0x05 非极大值抑制 0x06 基本边缘算子 Sobel 0x07 基本边缘算子 Laplace 0x08 基本边缘检测算子 Roberts
  • python教程:9种元组常用操作方法

    基础知识 xff5e 总之多记多看就对了 一 元组定义 元组不可变 xff0c 当我们需要创建一组不可改变的数据时 xff0c 通常是将这些数据放进元组中 tu 61 1 2 3 39 a 39 39 b 39 39 c 39 小括号定义元
  • 3D打印Gcode命令指令简析

    G0 xff1a 快速移动 G1 xff1a 控制移动 坐标轴XYZE移动控制 xff08 G0和G1一样 xff09 例子 xff1a G0 F2000 X30 Y30 Z30 E3 G2 xff1a 顺时针画弧 G3 xff1a 逆时针
  • 数学建模(一)—— 人口增长模型的确定

    一 题目要求二 相关的基础知识2 1 马尔萨斯 Malthus 人口指数增长模型2 2 逻辑斯蒂 Logistic 增长模型2 3 改进的Logistic模型2 4 BP神经网络模型 三 模型的建立与求解3 1 Malthus模型3 2 L
  • 将火狐浏览器视频播放倍速设置为3倍速及其以上

    看视频最快只能两倍速 xff1f 使用火狐浏览器看视频时将视频播放倍速提升到最快16倍速的方法来了 xff01 xff01 xff01 step1 xff1a 打开火狐浏览器页面左上角的应用程序菜单 xff0c 点击扩展和主题 xff1b
  • 折半插入排序算法

    折半插入排序 xff08 Binary Insertion Sort xff09 是对插入排序算法的一种改进 所谓插入排序 xff0c 就是不断的依次将元素插入前面已排好序的序列中 由于前半部分为已排好序的数列 xff0c 这样我们不用按顺
  • VOC2007数据集详细分析

    VOC数据集官网链接 http host robots ox ac uk pascal VOC VOC2007数据集官网链接 http host robots ox ac uk pascal VOC voc2007 index html V

随机推荐

  • Requirement already satisfied解决办法

    遇到的问题 xff1a 当使用电脑中安装的Python 3 7的IDLE去运行某一个python文件时 xff0c 会出现ModuleNotFoundError No module named 39 numpy 39 的报错 xff0c 需
  • 使用Python将DOTA数据集的格式转换成VOC2007数据集的格式

    一 VOC2007数据集二 DOTA数据集三 将DOTA数据集的格式转换成VOC2007数据集的格式 一 VOC2007数据集 VOC2007数据集的文件结构如下图所示 其中 xff0c 文件夹Annotations中存放的是图像的标注信息
  • 设计一个卷积神经网络模型用于遥感图像的场景分类

    遥感图像场景分类是指对遥感图像中场景语义内容标签的映射过程 xff0c 对高分辨率遥感影像的信息提取及内容理解有着重要的意义 主要的场景分类方法可以分为三类 xff1a 第一类是基于底层视觉特征的场景分类方法 xff0c 第二类是基于中层视
  • 使用Python随机生成数据的一些方法

    通过Python Faker生成测试数据通过Python基础语法生成一些随机数利用26个字母和10个数字随机生成5个八位密码生成5个2位小数点的随机数生成5个随机整数数 通过Python Faker生成测试数据 通过Python Faker
  • 源码阅读及理论详解《 Informer: Beyond Efficient Transformer for Long Sequence Time-Series Forecasting 》

    Informer论文 xff1a https arxiv org pdf 2012 07436 pdf Informer源码 xff1a GitHub zhouhaoyi Informer2020 The GitHub repository
  • Python实现排序

    在Python中可以使用提供的sort排序法对list实现排序 Python提供两种内置排序的函数分别是sort 和sorted xff0c 这两种函数用法差别在于sort 会直接修改原始的list进行排序 xff0c sorted 可迭代
  • Python排序进阶版:根据一个列表的顺序对其他列表进行排序

    在Python中如果需要根据列表A对列表B进行排序的问题时有以下2种方法 xff1a 方法1 xff1a 根据列表B中每个元素的下标来获取列表A中对应位置的元素 xff0c 将其作为排序依据即可 a span class token ope
  • 基于MATLAB GUI的系统设计(四)

    接下来学习的是关于图像处理方面的知识 实例一 xff1a 对图像进行灰度处理 直方图均衡化处理 二值处理以及用Canny算子对图像进行边缘检测 第一步 xff1a GUIDE画界面 第二步 xff1a 编辑代码 function varar
  • HashMap的工作原理(图文+例子)详解,绝对简单通俗易懂

    目录 什么是HashMap xff1f HashMap的内部结构 内部结构之数组 内部结构之链表 Put方法与Get方法原理 JDK1 7月JDK1 8中HashMap的区别 什么是HashMap xff1f 基于哈希表的 Map 接口的实
  • vnc序列号

    5D7L8 ZQXSA 2L5D4 4UFB4 PWDLA 8KNFU MZZHE WA449 2SLLH 48Q7A
  • A星(A*、A Star)路径规划算法详解(附MATLAB代码)

    首先看看运行效果 xff0c 分别有三种模式 xff0c 代码运行前需要通过鼠标点击设置起点和终点 第一种模式直接输出最短路径 第二种模式输出最短路径的生成过程 第三种模式输出最短路径的生成过程和详细探索的过程 代码获取 gitee链接 x
  • ubuntu系统支持GIGABYTE X570 I AORUS PRO WIFI主板温度及风扇转速检测

    原文链接 xff1a How to fix bugs in Ubuntu 20 04 LTS after installation 43 all necessary programs ITCooky Recipes Not getting
  • 计算机启动过程(windows XP 系统)

    计算机启动过程 xff08 windows XP 系统 xff09 共五步 1 预引导 Pre Boot 阶段 xff1b 2 引导阶段 xff1b 3 加载内核阶段 xff1b 4 初始化内核阶段 xff1b 5 登陆 第一个阶段 首先
  • 2006年6月21日

    最近住了一段时间医院 xff0c 在那里除了休息就是休息 xff0c 回来都一周了 xff0c 我都没有适应了学校的生活 xff0c 一天除了睡觉就是看世界杯 哈哈 xff0c 得要有个好心态 看一点东西就算一点 xff0c 写出来 xff
  • 2006 年6月23日

    我为网上下载的一个TDI的源代码写了一个source文件 xff0c 可是编译时却出现了如下问题 can 39 t open include file 34 netpnp h 34 以及 can 39 t open input file 3
  • Linux搭建Web服务器(三)——服务器编程基本框架以及事件处理模式

    目录 0x01 服务器编程基本框架 0x02 两种高效的事件处理模式 Reactor 模式 Proactor 模式 模拟Proactor 模式 0x01 服务器编程基本框架 虽然服务器程序的种类繁多 xff0c 但是其基本框架都是一样的 x
  • 解决docker容器IP不固定问题

    创建了两个容器 xff0c 做好mysql的主从配置了 xff0c 重启docker容器之后 xff0c 发现容器的ip地址变了 xff0c 这就尴尬了 xff0c 首先了解到了docker默认采用 bridge 连接 xff0c 启动容器
  • VSCode 基本使用

    一 VSCode 界面功能介绍 1 Git History xff0c 相当于 git log 3 打开上一提交版本的更改记录 4 显示提交注释 5 向右分屏 6 直接定位到第几行 7 解析当前文件的语言 8 切换项目 xff08 基于 P
  • keras中实现简单的反卷积

    我这里将反卷积分为两个操作 xff0c 一个是UpSampling2D xff0c 用上采样将原始图片扩大 xff0c 然后用Conv2D 这个函数进行卷积操作 xff0c 就可以完成简单的反卷积 xff1a UpSampling2D xf
  • STM32学习笔记:蜂鸣器实验

    STM32学习笔记 xff1a 蜂鸣器实验 蜂鸣器实现原理和led点亮大同小异 xff0c 所以就不重新编写了 一 所使用的函数 span class token number 1 span 时钟使能函数 span class token