欧启标O老师STM32课程笔记(二)——蜂鸣器发声

2023-10-27

1 硬件原理

        下图为蜂鸣器的电路图,分析这个电路,想让蜂鸣器发声,则需要有电流流过蜂鸣器。当BEEP(即PB8)为高电平时,三极管导通,电流流过蜂鸣器,蜂鸣器发声;反之,当BEEP(即PB8)为低电平时,三极管截止,蜂鸣器不发声。所以控制蜂鸣器的发声,只需要控制PB8管脚的输出电平即可。

4630e61281d919e794111fe6c8298df4.png

2 IO输出配置

        STM32F10系列的IO口结构以及输出模式可参考这篇博客STM32 I/O端口基本结构理解_弦续北上i的博客-CSDN博客_stm32io口结构,本文不再赘述,本文主要介绍具体的实现。

        配置IO口的输出,需要三个步骤:

        (1) 使能PB时钟;

        (2) 设置引脚为输出模式;

        (3) 设置电平高低。

2.1 使能PB时钟

        如下图所示:PB端口使能寄存器为RCC_APB2ENR,对应bit3,所以,代码为:

//使能GPIOB时钟
RCC_APB2ENR |= (1<<3);

2.2 设置引脚为输出模式

        配置引脚输出模式使用的寄存器为 GPIOB_CRH,这里将配置为:通用推挽输出模式、最大速度10MHz,即:

GPIOB_CRH&= ~(15<<0);//清零寄存器相关位	
GPIOB_CRH|=1<<0;//设置输出模式为通用推挽输出,频率为10MHz

2.3 设置电平高低

        设置GPIOB端口输出电平高低的寄存器为GPIOB_ODR,PB8输出电平高低的设置方法为:

//设置PB8输出高电平
GPIOB_ODR |= (1<<8);
//设置PB8输出低电平
GPIOB_ODR &= ~(1<<8);

3 完整代码

结合上一节所说的定义寄存器的方法,可以得到STM32F1上的完整代码如下:

//寄存器定义
#define RCC_APB2ENR  (*(volatile unsigned int*)(0x40021018))
#define GPIOB_CRL  (*(volatile unsigned int*)(0x40010c00))
#define GPIOB_CRH  (*(volatile unsigned int*)(0x40010c04))
#define GPIOB_ODR  (*(volatile unsigned int*)(0x40010c0c))


//类型定义
#define uint16_t unsigned short

//函数声明
void BEEP_Init(void);
void Delay(void);

int main()
{
	//系统初始化
	BEEP_Init();
	
	//间隔发声
	while(1)
	{
		//设置PB8输出高电平,蜂鸣器发声
		GPIOB_ODR |= (1<<8);
		//延时
		Delay();
		//设置PB8输出低电平,蜂鸣器不发声
		GPIOB_ODR &= ~(1<<8);
		//延时
		Delay();
	}
    
}

void BEEP_Init()
{
	//使能GPIOB时钟
    RCC_APB2ENR |= (1<<3);
    //设置PB8的工作模式为输出
	
    GPIOB_CRH&= ~(15<<0);//清零寄存器相关位	
    GPIOB_CRH|=1<<0;//设置输出模式为通用推挽输出,频率为10MHz
	
    //设置PB8输出低电平,初始状态为不发声
    GPIOB_ODR &= ~(1<<8);
	return;
}

void Delay()
{
	uint16_t i,j;
	for(i=0;i<1000;i++)
		for(j=0;j<3000;j++);
	return;
}

欧启标老师课上STM32F4上的完整代码如下:

/*定义寄存器*/
#define GPIOF_MODER (*(volatile unsigned *)0x40021400) //模式配置,=00 输入,=01 输出
#define GPIOF_OTYPER (*(volatile unsigned *)0x40021404) //输出电路类型配置寄存器。=0 推挽输出
#define GPIOF_OSPEEDR (*(volatile unsigned *)0x40021408) //x 输出速度配置寄存器。=00,2MHz. 
#define GPIOF_PUPDR (*(volatile unsigned *)0x4002140C) //上下拉配置寄存器。=00 无上下拉,=01 上拉
#define GPIOF_ODR (*(volatile unsigned *)0x40021414) //输出数据寄存器,=0 低电平,=1 输出高电平
//时钟系统相关寄存器的定义
#define RCC_AHB1ENR (*(volatile unsigned *)0x40023830) //外设时钟使能寄存器。=1 对应外设时钟使能
/*函数声明*/ 
void Delay(void); 
void Beep_Init(void);
/*主函数*/
int main(void)
{
	Beep_Init(); //初始化蜂鸣器接口
	while(1)
	{
		GPIOF_ODR &= ~(1<<8); //关闭蜂鸣器
		Delay(); //延时
		GPIOF_ODR |= (1<<8); //打开蜂鸣器
		Delay(); //延时
	}
}
/*蜂鸣器*/ 
void Beep_Init(void)
{
	RCC_AHB1ENR |= 1<<5; //使能 PORTF 时钟
	GPIOF_MODER &= ~(3<<(8*2)); //配置 PF8 引脚相关位 bit16,bit17 为 0 –--清 0
	GPIOF_MODER |= (1<<(8*2)); //配置 PF8 为输出----设置值
	GPIOF_OTYPER &= ~(1<<8); //电路工作方式为推挽
	GPIOF_OSPEEDR &= ~(3<<(8*2));//对应位清 0
	GPIOF_OSPEEDR |= (2<<(8*2)); //响应速度 50M,其他值亦可
}
/*延时函数定义*/ void Delay(void)
{
	int i, j;
	for(i = 0; i < 200; i ++)
	for(j = 0; j < 300; j ++);
}

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

欧启标O老师STM32课程笔记(二)——蜂鸣器发声 的相关文章

  • 程序设计综合实习(C语言):学生成绩文件管理

    一 目的 1 掌握文件指针的概念和运用 2 掌握文件的相关操作 打开 读 写 关闭 3 掌握文件的定位操作 二 实习环境 Visual Stdio 2022 三 实习内容与步骤 1 定义一个结构体数组 存放10个学生的学号 姓名 三门课的成
  • 转:人生比努力更重要的是选择,与时俱进是成功的源泉。

    如果有一天你隔壁开火锅店的张三 卖手机卖得比你好 你不用觉得惊讶 因为 这是一个跨界的时代 每一个行业都在整合 都在交叉 都在相互渗透 移动互联网改变生活 未来我们的生活会是什么样子呢 我们设想一下 晚上带着家人去吃饭 拿出手机点击附近餐厅

随机推荐

  • 汇编语言程序设计的实验环境及上机步骤

    汇编语言源程序编制完成后 在计算机上的操作过程分为四个阶段 编辑 汇编 连接 运行调试 如图1 一 实验环境 汇编语言程序设计的实验环境如下 硬件环境 微型计算机 Intel x86系列CPU 一台 软件环境 Windows98 2000
  • 类和对象

    一 类 每个类都定义了自己的作用域 每个类的成员函数和成员变量都在这个作用域内 成员函数可以任意访问所在类的其他函数和成员变量 C 的封装特性是对外的 在类内是可以任意调用和使用的 类似于C中的结构体 要访问类定义的对象的成员 类定义的对象
  • 通过css实现对勾(√)和叉号(×)

    通过css实现对勾 和叉号 第一种方式 HTML span class status correct span span class status incorrect span CSS correct display inline bloc
  • 字符编码和字符集

    编码和解码 按照某种规则 将字符存储到计算机中 称为 编码 那么 将计算机中的二进制数据按照某种规则解析显示出来 称为 解码 字符编码 就是一套自然语言的字符和二进制数据之间的对应规则 把这种对应规则 写成一张表 就是 编码表 也叫字符集
  • kv遍历

    var builder var builderKey var builderValue for var i 0 i lt message length i var c message charAt i var nextStr message
  • 互联网高可用架构探讨

    高可用指标与问题 高可用 英文单词High Availability 缩写HA 它是分布式系统架构设计中一个重要的度量 业界通常用多个9来衡量系统的可用性 如下表 既然有可用率 有一定会存在不可用的情况 系统宕机一般分为有计划的和无计划的
  • 数码管:3位6脚的数码管分析和编码

    基本简介 一个1位数码管共有8段 ABCDEFG 小数点 如下图 按照我们常规的设计方案一个 IO 口控制一个段 一个1位数码管那么就需要8个IO 当然我们也可以使用扩展 IO 芯片 例如 74HC164 74HC595 那么这种方案就占用
  • Linux 中卷组不真实存在情况下,强制删除卷组及其PV信息

    由于手误删除lVm顺序不对 导致真实pV 已经不存在 但是卷组信息及其PV信息还存在系统中 pvdisplay和vgdisplay都能看到信息 这时候可以到 dev 目录下手动rm 掉 pv 再查看卷组 就真的不存在了
  • Android取消点击效果,Android中如何取消listview的点击效果

    Android中如何取消listview的点击效果 在xml文件里面有listselecter的属性引用 android layout width match parent android layout height wrap conten
  • 【3D游戏基础】蒙皮骨骼动画与骨架

    效果 目标 画出蒙皮动画的骨架 视频 https www bilibili com video BV1pM411m7Yw PPT https zfxdvouj61 feishu cn file boxcnwgESO6zdQetO7oNhKb
  • vant Cascader 级联选择 异步加载

  • .suo介绍

    suo suo是一种文件的格式 suo 解决方案用户选项 记录所有将与解决方案建立关联的选项 以便在每次打开时 它都包含用户所做的自定义设置 比如VS布局以及项目最后编译的而又没有关掉的文件用于下次打开时用 其中 VS布局包括 监视器123
  • Linux性能测试工具

    在Linux Benchmark Suite Homepage网站上列举了诸多Linux性能测试工具 包括CPU RAM ROM Cache net等性能测试 lmbench 测试工具 这个工具集中包含以下几种测试工具 我们主要使用到bw
  • 织梦DedeCMS移动站的搜索功能实现方法

    很早之前在做博客的时候 就考虑到把搜索功能在移动端实现 初略的做完后 发现移动端总是会跳转到pc模版 很不友好 前几天 刚好有时间就把这个功能给实现了 其实很简单 接下来放出教程 一 复制 plus search php文件 打开PC端的文
  • ClickHouse之单表多表查询优化

    文章目录 1 本文简介 2 单表查询优化 1 Prewhere 替代 where 2 数据采样 3 指定select字段查询与分区裁剪 4 orderby结合 where limit 5 避免构建虚拟列 6 uniqCombined 替代
  • Maven Helper mvn项目冲突如何解决

    一般用这款插件来查看maven的依赖树 一 安装 File gt setting gt Plugins gt 在搜索框中填写Maven Helper然后搜索 单击Install按钮进行安装 装完重启IDE 二 使用 当Maven Helpe
  • 使用BP神经网络和Elman Net预测航班价格(Matlab代码实现)

    欢迎来到本博客 博主优势 博客内容尽量做到思维缜密 逻辑清晰 为了方便读者 座右铭 行百里者 半于九十 本文目录如下 目录 1 概述 2 运行结果 3 参考文献 4 Matlab代码实现 1 概述 BP神经网络模型是目前应用最为广泛神经网络
  • Unity 自定义鼠标样式

    using System Collections using System Collections Generic using Framework using UnityEngine
  • BCryptPasswordEncoder的matches方法返回false

    用BCryptPasswordEncoder 做加密 在判断时要用该对象的matches方法 第一个参数为明文 第二个参数才是密文 public static void main String args BCryptPasswordEnco
  • 欧启标O老师STM32课程笔记(二)——蜂鸣器发声

    1 硬件原理 下图为蜂鸣器的电路图 分析这个电路 想让蜂鸣器发声 则需要有电流流过蜂鸣器 当BEEP 即PB8 为高电平时 三极管导通 电流流过蜂鸣器 蜂鸣器发声 反之 当BEEP 即PB8 为低电平时 三极管截止 蜂鸣器不发声 所以控制蜂