4、【STM32】蜂鸣器/按键实验

2023-05-16

目录

前言

理论学习

一、蜂鸣器简介

二、机械按键简介

三、GPIO配置简介

实践学习 

一、设计规划

1.1 实验目标 

1.2 硬件资源

二、程序设计

2.1 建立工程文件

2.2 led配置

2.3 beep配置

2.4 key配置

2.5 主函数text.c

三、在线调试

3.1 相应寄存变化

3.2 关键变量变化

四、上板验证


前言

使用的是正点原子的探索者开发板进行学习,芯片:STM32F407ZGTx

学习说明此文档为本人的学习笔记,注重实践,关于理论部分会给出相应的学习链接。


本文档添加了对代码的在线调试功能,有助于大家更好理解相关寄存器的变化。


理论学习

一、蜂鸣器简介

探索者开发板上搭载的是电磁式有源蜂鸣器,关于无源蜂鸣器的介绍请参考我另一篇博文:

二、17【FPGA】无源蜂鸣器驱动实验_追逐者-桥的博客-CSDN博客蜂鸣器按其结构可分为电磁式蜂鸣器和压电式蜂鸣器两种类型。压电式蜂鸣器是以压电陶瓷的压电效应,来带动金属片的振动而发声;而电磁式蜂鸣器则是用电磁的原理,通电时将金属振动膜吸下,不通电时以振动膜的弹力弹回。https://blog.csdn.net/ARM_qiao/article/details/124837227有源蜂鸣器自带了震荡电路 ,只需要对其上电即发声;无源蜂鸣器需要提供相应的方波才发声。

32的IO口可以直接驱动LED灯(所需电流较小)。STM32F4的单个IO可以提供25mA电流,而蜂鸣器的驱动电流为30mA左右,但是STM32F4整体才150mA,直接驱动会非常浪费资源,因此IO口并不是直接驱动,而是通过三极管扩流后再驱动蜂鸣器。

二、机械按键简介

开发板上搭载的是机械微动开关按键,这种按键在使用时需要注意其抖动,按下时,信号不会立刻稳定,相关描述请参考:

二、13【FPGA】按键消抖_追逐者-桥的博客-CSDN博客按键消抖代码实现https://blog.csdn.net/ARM_qiao/article/details/124731574需要进行按键消抖,这里通常采用软件程序消抖的方法来避免抖动。

三、GPIO配置简介

由于在上一篇跑马灯博文中已经做了介绍,如果不是特别了解GPIO的配置。请参考:

[Skill] STM32的GPIO工作原理及工作模式_追逐者-桥的博客-CSDN博客STM32的IO口电路原理及工作模式如何选择GPIO口模式https://blog.csdn.net/ARM_qiao/article/details/125080228

实践学习 

一、设计规划

蜂鸣器实验和按键实验与跑马灯类似,都是对GPIO进行操作,因此本博文将两者放到了一起进行实现。

1.1 实验目标 

利用板载的4个按键,来控制板载的两个LED的亮灭和蜂鸣器的开关。

1.2 硬件资源

 除KEY_UP是高电平有效(且外部无上下拉电阻,需要在32内部设置上下拉),其他按键是低电平有效。

二、程序设计

2.1 建立工程文件

如图已经添加完的工程文件目录。

2.2 led配置

板载对应的GPIO口为PF9/10,并将其配置为通用推挽输出模式,输出速度100MHz

  • led.h文件
#ifndef _LED_H
#define _LED_H
#include "sys.h"
//LED端口定义
#define LED0 PFout(9)
#define LED1 PFout(10)

void LED_Init(void);

#endif
  • led.c文件
#include"led.h"

void LED_Init(void)
{
	RCC->AHB1ENR |= 1<<5;   //使能GPIOF时钟
	GPIO_Set(GPIOF, PIN9|PIN10,
			 GPIO_MODE_OUT, GPIO_OTYPE_PP,
			 GPIO_SPEED_100M, GPIO_PUPD_PU);
	//初值
	LED0 = 1;
	LED1 = 1;
}

2.3 beep配置

蜂鸣器比较见到,就是一个GPIO输入 高低电平

  • beep.h
#ifndef _BEEP_H
#define _BEEP_H
#include "sys.h"
#define BEEP PFout(8)

void  BEEP_Init(void);

#endif
  • beep.c

由于蜂鸣器是高电平有效,因此将端口配置为下拉推挽输出

#include"beep.h"

void BEEP_Init(void)
{
	RCC->AHB1ENR |= 1<<5;
	GPIO_Set(GPIOF, PIN8,
			 GPIO_MODE_OUT, GPIO_OTYPE_PP, 
			 GPIO_SPEED_100M, GPIO_PUPD_PU);
	BEEP = 0;   //初值关闭蜂鸣器
}

2.4 key配置

  • key.h
#ifndef _KEY_H
#define _KEY_H
#include "sys.h"
#define KEY0  PEin(4)   //PE4
#define KEY1  PEin(3)	//PE3
#define KEY2  PEin(2)	//PE2
#define WK_UP PAin(0)	//PA0
#define KEY0_PRES 1   //KEY0 
#define KEY1_PRES 2   //KEY1 
#define KEY2_PRES 3   //KEY2 
#define WKUP_PRES 4   //KEY_UP ( WK_UP)

void KEY_Init(void);
u8 KEY_Scan(u8 mode);       //按键扫描函数

#endif
  • key.c
#include"key.h"
#include"delay.h"     //ÐèÒªÑÓ³ÙÅжÏÏû³ý¶¶¶¯
void KEY_Init(void)
{
	RCC->AHB1ENR |= 1<<0;    //GPIOA
	RCC->AHB1ENR |= 1<<4;    //GPIOE
	GPIO_Set(GPIOA, PIN0, GPIO_MODE_IN,
			 0, 0,  			
			 GPIO_PUPD_PD);     //PA0 高电平有效因此为下拉
	GPIO_Set(GPIOE, PIN2|PIN3|PIN4, GPIO_MODE_IN,
			 0, 0,
			 GPIO_PUPD_PU);     //低电平有效,上拉
}
u8 KEY_Scan(u8 mode)
{
	static u8 key_up = 1;   //静态局部变量
	if(mode) key_up = 1;    //当有按键按下时,按下标志
	if(key_up && (KEY0==0 || KEY1==0 || KEY2==0 || WK_UP==1))  
	{
		delay_ms(10);       //ÑÓ³ÙÅжϣ¬ÒÔÏû³ý¶¶¶¯
		key_up = 0;
		if(KEY0==0) return 1;
		else if(KEY0==0) return 1;
		else if(KEY1==0) return 2;
		else if(KEY2==0) return 3;
		else if(WK_UP==1) return 4;
	}
	else if(KEY0==1 && KEY1==1 && KEY2==1 && WK_UP==0) 
		key_up =1;
	return 0;    //ÎÞ°´¼ü°´ÏÂ
}

一定要注意高低电平有效,本人在敲代码的时候PA0(高电平有效)设置为了上拉(有问题);PE2-4(低电平)设置为了下拉(错误)。   如果这样设置就会出现,按键是否按下一直有效,因为按下也是相应的状态。 

2.5 主函数text.c

#include "sys.h"
#include "delay.h"
#include "led.h"
#include "beep.h"
#include "key.h"
int main(void)
{
	u8 key;
	Stm32_Clock_Init(336,8,2,7);   //设置时钟 168M
	delay_init(168);
	LED_Init();
	BEEP_Init();
	KEY_Init();
	LED0 = 0;
	while(1)
	{
		key = KEY_Scan(0);   
		if(key)
		{
			switch(key)
			{
				case WKUP_PRES:    
					BEEP =! BEEP;
					break;
				case KEY2_PRES:
					LED0 =! LED0;
					break;
				case KEY1_PRES:
					LED1 =! LED1;
					break;				
				case KEY0_PRES:
					LED0 =! LED0;
					LED1 =! LED1;
					break;													
			}  
		}else delay_ms(10);      		       
	}	
}

三、在线调试

下载完成完成后,打开调试,点击运行,并调出相关的寄存器。

3.1 相应寄存变化

  • 按键GPIOE口,可以看出按键的相关位的状态,如图由于按键低电平有效(上拉),此时相应的位被拉高。

  • LED灯/蜂鸣器的GPIOF口,输出数据ODR 寄存器状态(低电平有效),默认LED0亮;蜂鸣器高电平有效(不响) 。

 当KEY0按键按下时,PE4由高电平变为低电平,LED0,LED1状态转换

 蜂鸣器类似,这里不做演示。

3.2 关键变量变化

点击可以添加变量,然后添加变量;也可以直接选中变量点击右键选择“add "key"to Watch1。

在变量key后面打一个断点,将代码运行到此

 在板子上按下KEY0,可以观察到扫描函数返回值,key=1。与上面的寄存器变化相对应。

四、上板验证

整体编译没有问题:

 下载到板卡中即可实现相应的功能。

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

4、【STM32】蜂鸣器/按键实验 的相关文章

  • ubuntu下为APT设置代理

    Ubuntu下为APT设置代理 一 最简单的方法 图形界面方法 xff1a 新立得软件包管理器 gt 设置 gt 首选项 gt 网络 进行设置代理就可以了 二 编辑命令 方法1 xff1a 如果您 希望apt get xff08 而不是其他
  • typora主题更改(以及旧版本下载地址)

    目录 1 Typora官网2 旧版Typora下载地址3 Typora主题商店3 1 找到本地主题文件夹3 2 添加新主题并使用 4 在Typora中使用LaTeX主题 1 Typora官网 官网地址 xff1a https typora
  • 将投影矩阵P利用QR分解分解出摄像机内外参数(Opencv)

    将投影矩阵P利用QR分解分解出摄像机内外参数 xff08 Opencv xff09 将投影矩阵P利用QR分解分解出摄像机内外参数 输入 xff1a P xff1a 投影矩阵 xff0c 3 4 输出 xff1a K xff1a 内参数矩阵
  • (转载)依赖、关联、聚合、组合

    类与类图 1 类 Class 封装了数据和行为 xff0c 是面向对象的重要组成部分 xff0c 它是具有相同属性 操作 关系的对象集合的总称 2 在系统中 xff0c 每个类具有一定的职责 xff0c 职责指的是类所担任的任务 xff0c
  • ubuntu14.0.4升级指定内核以及默认内核启动

    一 xff0c 更新到指定的内核版本 1 首先查看当前的内核版本 xff0c 打开终端在窗口输入以下命令 uname a 2 在ubuntu的终端窗口内搜索可用升级的内核版本 apt cache showpkg linux headers
  • 解决Cannot download “https://github.com/sass/node-sass/releases/download...问题

    因很早做了一个小demo xff0c 并且在其他成熟的电脑上 xff08 node配置好的 xff09 下载依赖包没什么问题 xff0c 最近就在新的电脑上配置好所有东西后 xff0c 去下载这个demo的依赖包 xff0c 就出现了nod
  • 如何阅读 Redis 源码?

    在这篇文章中 xff0c 我将向大家介绍一种我认为比较合理的 Redis 源码阅读顺序 xff0c 希望可以给对 Redis 有兴趣并打算阅读 Redis 源码的朋友带来一点帮助 第 1 步 xff1a 阅读数据结构实现 刚开始阅读 Red
  • C语言DFS和BFS解决迷宫问题

    C语言DFS与BFS 迷宫问题 题目描述 给定一个 N times MN M 方格的迷宫 xff0c 迷宫里有 TT 处障碍 xff0c 障碍处不可通过 在迷宫中移动有上下左右四种方式 xff0c 每次只能移动一个方格 数据保证起点上没有障
  • 2022第9周、第10周总结

    差分 最近看到了一个关于差分的题目 题目描述 给定一个长度为n的数列a1 a2 an xff0c 每次可以选择一个区间 l r xff0c 使得这个区间内的数都加1或者都减1 请问至少需要多少次操作才能使数列中的所有数都相等 xff1f 在
  • 装箱问题(DP)

    题目描述 有一个箱子容量为V xff08 正整数 xff0c 0 xff1c xff1d V xff1c xff1d 20000 xff09 xff0c 同时有n个物品 xff08 0 xff1c n xff1c xff1d 30 xff0
  • 丑数(c语言)

    题目描述 我们把只包含质因子2 3和5的数称作丑数 xff08 Ugly Number xff09 例如6 8都是丑数 xff0c 但14不是 xff0c 因为它包含因子7 习惯上我们把1当做是第一个丑数 输入一个数n xff0c 判断它是
  • 2022/12/30总结

    今日学习了二叉树有关知识 二叉树 二叉树通俗来讲就是一个有俩个指针的链表 他们大多长这个样子 xff1a 这里还有俩个概念了 xff0c 二叉树分为完全二叉树和满二叉树 上面所说的是满二叉树 xff0c 顾名思义就是每个父节点都相应的有俩个
  • 滑动窗口算法

    滑动窗口 滑动窗口有俩种 xff1a 定窗口和不定窗口 滑动窗口说白了就是双指针的运用 定窗口说明是一个特定窗口大小 xff0c 通常用来解决相邻的元素 xff0c 最大值 xff0c 最小值 不定窗口说的是 xff0c 先由右指针去找到第
  • 本学期学习计划

    第7周 学习MySQL 写7个基础题 第8周 熟悉C 43 43 语言 学习maven 写7个基础题 第9周 巩固java和MySQL和maven 写5道中等题 第10周 写好项目框架 写5道中等的题目 第11周 写好项目一些基本功能 刷5
  • 2023/4/2总结

    题解 线段树OR树状数组 Virtual Judge vjudge net 正如这道题目一样 xff0c 我的心情也如此 1 这道题是线段树问题 xff0c 更改学生值即可 xff0c 不需要用到懒惰标记 2 再去按照区间查找即可 xff0
  • 2023/4/27总结

    第一周任务 Virtual Judge vjudge net 1 这道题目穷举即可 最多90次 include lt stdio h gt int getLucky int x int a 10 i n t 61 x max 61 0 mi
  • 2023/5/4总结

    刷题 xff1a 第二周任务 Virtual Judge vjudge net 这一题用到了素筛 然后穷举即可 include lt stdio h gt define Maxsize 500000 int a Maxsize long l
  • Epoll原理解析

    从事服务端开发 xff0c 少不了要接触网络编程 Epoll 作为 Linux 下高性能网络服务器的必备技术至关重要 xff0c Nginx Redis Skynet 和大部分游戏服务器都使用到这一多路复用技术 Epoll 很重要 xff0
  • 2023/5/7总结

    最近还是在项目上 xff1a 主要实现了 xff1a 把头像的数据传给服务器 xff1a 服务器开一个文件夹接收 发送文件是 xff0c 用字节流传递很容易出错 xff0c 我因此坏掉了很多文件 这样写就没有坏掉 xff0c 之前一直是图片
  • 2023/5/9总结

    项目 xff1a 这俩天在看文件分流 xff0c 虽然看的原理是把文件切割 xff0c 传输的时候带着下标值 xff0c 或者在字节头去实现 xff0c 然后在服务器当中结合 但是实现起来遇到了很多问题 xff1a 1 需要另外开辟端口号来

随机推荐

  • putty使用方法,中文教程

    转自 http hi baidu com dba chen blog item ce6a7f54cb6522173b29351e html putty使用方法 xff0c 中文教程 序言 大致内容罗列如下 xff1a 最简单的使用 xff0
  • 用 VNC + Putty 把图形界面带出防火墙

    用 VNC 43 Putty 把图形界面带出防火墙 转自http blog sina com cn s blog 53a2aec8010009b6 html 2007 05 24 18 15 24 转载 分类 xff1a 工作 单位的服务器
  • 配置VNC+PuTTY+SSH Tunnel访问Linux

    转自 http blog 163 com yunlei ma blog static 12720893520098492716722 配置VNC 43 PuTTY 43 SSH Tunnel访问Linux 2009 09 04 21 27
  • 如何在c/c++里输出系统时间

    include lt stdio h gt include lt time h gt void main time t rawtime struct tm timeinfo time amp rawtime timeinfo 61 loca
  • 控制台窗口操作

    用于控制台窗口操作的API函数如下 xff1a GetConsoleScreenBufferInfo 获取控制台窗口信息 GetConsoleTitle 获取控制台窗口标题 ScrollConsoleScreenBuffer 在缓冲区中移动
  • 图像增强?图像复原??

    图像增强的目标是改进图片的质量 xff0c 例如增加对比度 xff0c 去掉模糊和噪声 xff0c 修正几何畸变等 xff1b 图像复原是在假定已知模糊或噪声的模型时 xff0c 试图估计原图像的一种技术 图像增强按所用方法可分成频率域法和
  • SQL SERVER DATETIME 常用日期格式转换

    我们经常出于某种目的需要使用各种各样的日期格式 xff0c 当然我们可以使用字符串操作来构造各种日期格式 但是有现成的函数为什么不用呢 xff1f SQL Server中文版的默认的日期字段datetime格式是yyyy mm dd Thh
  • hadoop学习之自定义对象实现 writeable

    Hadoop虽然 已经实现了一些非常有用的Writable xff0c 如Text IntWritable NullWritable等 xff0c 但有时候需要构造一些更加复杂的结果存入context中 xff0c 使用这些方法可能就不是那
  • C语言宏的用法详解

    1 简介 宏在C语言中是一段有名称的代码片段 无论何时使用到这个宏的时候 xff0c 宏的内容都会被这段代码替换掉 主要有两种宏 xff0c 他们的区别主要是在使用上面 xff0c 一种是在使用时类似于数据对象称为Object like x
  • Linux--day04\05

    知识点和问题 1 Linux组基本介绍2 查看文件的所有者3 创建一个组police 再创建一个用户tom xff0c 将tom放在police中 xff0c 然后使用tom来创建ok txt文件 xff0c 看看情况如何 4 使用root
  • 如何在Ubuntu上运行.run文件

    在Ubuntu上运行 run文件 xff0c 有以下几个步骤 xff1a 1 打开一个终端 ctrl 43 alt 43 t 2 cd 到 run文件所在目录 3 输入 34 chmod 43 x foo run 34 4 输入 34 fo
  • /dev/tty、/dev/ttyS/、/dev/ttyUSB区别

    1 dev tty 当前控制终端Terminal 可以使用命令 ps ax 来查看进程与哪个控制终端相连 xff0c 使用命令 tty 可以查看它 具体对应哪个实际终端设备 2 dev ttyn和 dev console xff08 虚拟
  • 怎么解决你的Segmentation fault (core dumped)问题

    http westsoftware blog 163 com blog static 260941092011460252776 开发一个Linux Unix C C 43 43 程序的时候 xff0c 有时候会出现莫名的core dump
  • 前端生成图表

    http www cnblogs com skiler p 6679828 html 1 常用的前端生成图表的工具HighCharts和echarts 2 具体内容可参考官方文档 xff0c 有一些具体实例 xff0c JS和HTML的代码
  • C语言与C++的区别终于有人说清楚了!

    点击蓝字 关注我们 来源于网络 xff0c 侵删 1 前言 在很大程度上 xff0c C 43 43 是C的超集 xff0c 这意味着一个有效的C程序也是一个有效的C 43 43 程序 C和C 43 43 的主要区别是 xff0c C 43
  • python3,浅谈with的神奇魔法

    在实际的编码过程中 xff0c 有时有一些任务 xff0c 需要事先做一些设置 xff0c 事后做一些清理 xff0c 这时就需要python with出场了 xff0c with能够对这样的需求进行一个比较优雅的处理 xff0c 最常用的
  • archlinux安装配置vnc+openbox

    为什么用openbox xff0c 因为它很小 xff0c 占用资源少 够我用了 我用linux大部分只用命令行界面就够了 图形界面程序用的最多的也就是浏览器了 安装相关软件包 span class token comment 更新下系统
  • 安装vsftpd,并将用户锁定到家目录中,不能切换其他目录

    安装vsftpd span class token function rpm span ivh vsftpd 3 0 2 28 el7 x86 64 rpm 创建用户 span class token function useradd sp
  • c语言——http编程

    HTTP协议简介 超文本传输协议是一种用于分布式 协作式和超媒体信息系统的应用层协议 HTTP是一个客户端终端 xff08 用户 xff09 和服务器端 xff08 网站 xff09 请求和应答的标准 xff08 一般基于TCP xff09
  • 4、【STM32】蜂鸣器/按键实验

    目录 前言 理论学习 一 蜂鸣器简介 二 机械按键简介 三 GPIO配置简介 实践学习 一 设计规划 1 1 实验目标 1 2 硬件资源 二 程序设计 2 1 建立工程文件 2 2 led配置 2 3 beep配置 2 4 key配置 2