【stm32】hal库学习笔记-GPIO按键控制LED和蜂鸣器(超详细!)

news2024/9/24 17:46:22

【stm32】hal库学习笔记-GPIO按键控制LED和蜂鸣器

注:本学习笔记基于stm32f4系列
使用的开发板为正点原子stmf407ZGT6探索者开发板

GPIO引脚使用时,可输入或输出数字信号
例如:
检测按键输入信号(Read_Pin)输出信号(Write_Pin)
输出信号点亮或熄灭LED

硬件特点

GPIO引脚内部结构图
GPIO引脚内部结构图

GPIO状态

  • 输入浮空状态:上拉下拉电阻均不使用(复位时状态)
  • 输入上拉状态:只使用上拉电阻-引脚外部无输入时读到的电平为高电平
  • 输入下拉状态:只使用下拉电阻-引脚外部无输入时读到的电平为低电平
  • 模拟状态:不使用任何内部的上拉下拉电阻-用于ADC输入/DAC输出引脚
  • 开漏输出(Output Open Drain)
  • 推挽输出:输出1时引脚为高电平,输出0时引脚为低电平
    若要增强引脚的输出驱动能力,则可使用上拉-如GPIO输出高电平点亮LED
  • 复用功能推挽
  • 复用功能开漏

涉及到的函数

在这里插入图片描述

重要函数

HAL_GPIO_WritePin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin, GPIO_PinState PinState);
HAL_GPIO_ReadPin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin)
HAL_GPIO_TogglePin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin)

按键控制LED

LED部分原理图
LED部分原理图
按键部分原理图
按键部分原理图

实现功能:
按下KEY0时,使LED1的输出翻转
按下KEY1时,使LED2的输出翻转
按下KEY2时,使LED1与LED2的状态都翻转

MCU图形化配置

连接按键的引脚选择GPIO_Input
连接LED的引脚选择GPIO_Output
并设置相应的用户标签
在这里插入图片描述

  • KEY0,KEY1,KEY2配置为上拉(Pull-up)
  • PF9,PF10设置为推挽输出(Output Push Pull)
  • 调试引脚设为串行调试引脚WSD
    在这里插入图片描述
  • 在RCC里将HSE改为晶振
    在这里插入图片描述
    在时钟树界面
  • 将HSE改为8MHz
  • 主锁相环选择HSE作为时钟源
  • 设置HCLK为168

在这里插入图片描述

代码部分

编写驱动程序

keyled.c

#include "keyled.h"
//编写函数扫描被按下的按键
KEYS ScanPressedKey(uint32_t timeout)
{
	uint32_t tickstart = HAL_GetTick();
	const uint32_t btnDelay = 20;//延时时间
	while (1)
	{
#ifdef KeyRight_Pin
		if (HAL_GPIO_ReadPin(Key0_GPIO_Port, Key0_Pin) == GPIO_PIN_RESET)
		{
			HAL_Delay(btnDelay);//延时消除前抖动
			if (HAL_GPIO_ReadPin(Key0_GPIO_Port, Key0_Pin) == GPIO_PIN_RESET)
				return KEY_0;
		}
#endif
#ifdef KeyDown_Pin
		if (HAL_GPIO_ReadPin(Key1_GPIO_Port, Key1_Pin) == GPIO_PIN_RESET)
		{
			HAL_Delay(btnDelay);
			if (HAL_GPIO_ReadPin(Key1_GPIO_Port, Key1_Pin) == GPIO_PIN_RESET)
				return KEY_1;
		}
#endif
#ifdef KeyLeft_Pin
		if (HAL_GPIO_ReadPin(Key2_GPIO_Port, Key2_Pin) == GPIO_PIN_RESET)
		{
			HAL_Delay(btnDelay);
			if (HAL_GPIO_ReadPin(Key2_GPIO_Port, Key2_Pin) == GPIO_PIN_RESET)
				return KEY_2;
		}
#endif
#ifdef KeyUp_Pin
		if (HAL_GPIO_ReadPin(KeyUp_GPIO_Port, KeyUp_Pin) == GPIO_PIN_SET)
		{
			HAL_Delay(btnDelay);
			if (HAL_GPIO_ReadPin(KeyUp_GPIO_Port, KeyUp_Pin) == GPIO_PIN_SET)
				return KEY_UP;
		}
#endif
		if (timeout != KEY_WAIT_ALWAYS) {
			if ((HAL_GetTick() - tickstart) > timeout)
				break;
		}
	}
	return KEY_NONE;
}//若没有按键被按下,超时后跳出循环

keyled.h

#include "main.h"
//创建枚举类型
typedef enum {
	KEY_NONE = 0,
	KEY_1,
	KEY_2,
	KEY_UP,
	KEY_NONE
} KEYS;
//定义参数-表示一直等待按键按下
#define KEY_WAIT_ALWAYS		0

KEYS ScanPressedKey(uint32_t timeout);
//LED1的宏定义函数
#ifdef	LED1_Pin
	#define LED1_Toggle()	HAL_GPIO_TogglePin(LED1_GPIO_Port, LED1_Pin)//实现翻转
	#define LED1_OFF()		HAL_GPIO_WritePin(LED1_GPIO_Port, LED1_Pin, GPIO_PIN_SET)//实现打开
	#define LED1_ON()		HAL_GPIO_WritePin(LED1_GPIO_Port, LED1_Pin, GPIO_PIN_RESET)//实现关闭
#endif
//LED2的宏定义函数
#ifdef	LED2_Pin
	#define LED2_Toggle()	HAL_GPIO_TogglePin(LED2_GPIO_Port, LED2_Pin)
	#define LED2_OFF()		HAL_GPIO_WritePin(LED2_GPIO_Port, LED2_Pin, GPIO_PIN_SET)
	#define LED2_ON()		HAL_GPIO_WritePin(LED2_GPIO_Port, LED2_Pin, GPIO_PIN_RESET)
#endif
//蜂鸣器的宏定义函数
#ifdef	Buzzer_Pin
	#define Buzzer_Toggle()	HAL_GPIO_TogglePin(Buzzer_GPIO_Port, Buzzer_Pin)
	#define Buzzer_ON()		HAL_GPIO_WritePin(Buzzer_GPIO_Port, Buzzer_Pin, GPIO_PIN_SET)
	#define Buzzer_OFF()	HAL_GPIO_WritePin(Buzzer_GPIO_Port, Buzzer_Pin, GPIO_PIN_RESET)
#endif
应用驱动程序

在这里插入图片描述
在这里插入图片描述

编写主程序
  while (1)
  {
	  KEYS curKey=ScanPressedKey(KEY_WAIT_ALWAYS);
	  switch (curKey)
	  {
	  case KEY_0:
	  	  LED1_Toggle();
	  	  break;
	  case KEY_1:
	  	  LED2_Toggle();
	  	  break;
	  case KEY_2:
	  	  LED1_Toggle();
	  	  LED2_Toggle();
	  	  break;
	  case KEY_UP:
	  	  Buzzer_Toggle();
	  	  break;
	  default:
		  break;
	  }
	  HAL_Delay(200);//消除按键弹起时的的抖动影响

按键控制蜂鸣器

有源蜂鸣器原理图
有源蜂鸣器原理图
有源蜂鸣器是指自带了震荡电路的蜂鸣器,这种蜂鸣器一接上电就会自己震荡发声。而如
果是无源蜂鸣器,则需要外加一定频率(2~5Khz)的驱动信号,才会发声。
图中 Q4 是用来扩流,R65 则是一个下拉电阻,避免 MCU 复位的时候,蜂鸣器可能发声的
现象。BEEP 信号直接连接在 MCU 的 PF8 上面,PF8 可以做 PWM 输出,可使用 PWM 来控制蜂鸣器实现“唱歌”。

实现功能:
按下KEY_UP按键时,蜂鸣器输出翻转

MCU图形化配置

连接蜂鸣器的引脚选择GPIO_Output
并设置相应的用户标签

  • KEY_UP配置为下拉(Pull-down)
  • PF8设置为下拉推挽输出(Output Push Pull)
  • 将初始状态改为High(防止一复位蜂鸣器就响)
  • 最大输出频率-若为无源蜂鸣器则改为High,有源滤波器都可
    在这里插入图片描述

成果演示

在这里插入图片描述
上键翻转蜂鸣器状态
KEY0翻转红灯,KEY1翻转绿灯
KEY2同时翻转两个灯状态

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

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

相关文章

PHP面试小结(20240108)

PHP 部分 1. php的包管理工具是如何实现自动加载的 换句话问:composer 实现原理是什么?spl_autoload_register() 首先,Composer 是 PHP 的一个包管理和包依赖管理的工具 , 打开安装之后生成的 "vendor" 文件, 里面有个…

Spring Boot 的约定优于配置,你的理解是什么?

对于 Spring Boot 约定优于配置 这个问题,看看高手是如何回答的? 一、问题解析 我从 4 个点方面来回答。 1. 首先, 约定优于配置是一种软件设计的范式,它的核心思想是减少软件开发人员对于配置项的维护,从而让开发人…

Windows如何给已经启动的Docker容器添加或者修改端口映射(通过修改配置文件实现)

需求:已经启动的Docker容器添加或者修改端口映射 找到配置文件: \wsl.localhost\docker-desktop-data*data*\docker\containers[hash_of_the_container] 有些版本在: \wsl$\docker-desktop-data*version-pack-data*\community\docker\contai…

Linux编辑器---vim

目录 1、vim的基本概念 2正常/普通/命令模式(Normal mode) 2、1命令模式下一些命令(不用进入插入模式) 3插入模式(Insert mode) 4末行/底行模式(last line mode) 4、1底行模式下的一些命令 5、普通用户无法进行sudo提权的解决方案 6、vim配置问题 6、1配…

计算机找不到msvcr100.dll无法继续执行的5种解决方法,实测有效

“msvcr100.dll文件丢失这一问题,时常给计算机用户带来诸多困扰与不便。作为Microsoft Visual C运行库中的一个关键动态链接库文件,msvcr100.dll在系统和应用程序的正常运行中扮演着不可或缺的角色。一旦该文件发生丢失或损坏,可能会引发一系…

基于easyexcel实现导出excel,包括导出图片以及导出下拉框

基于easyexcel实现导出excel&#xff0c;包括导出图片以及导出下拉框 1.最基本的导出excel 1.引入maven <dependency><groupId>com.alibaba</groupId><artifactId>easyexcel</artifactId><version>3.1.1</version> </dependen…

MySQL复合查询解析

&#x1f388;行百里者半九十&#x1f388; &#x1f388;目录&#x1f388; 概念多表查询自连接子查询单行子查询多行子查询in关键字all关键字any关键字 多列子查询在from中使用子查询合并查询unionunion all 总结 概念 之前我们很多的查询都只是对于单表进行查询&#xff0c…

DMA技术在STM32中优化UART、SPI和I2C通信性能的研究与实现

DMA&#xff08;Direct Memory Access&#xff0c;直接存储器访问&#xff09;技术可以在STM32微控制器上优化UART、SPI和I2C等通信性能。DMA可以实现数据的高速传输&#xff0c;减轻CPU的负担&#xff0c;提高系统性能。在本篇文章中&#xff0c;我将探讨DMA技术在STM32中优化…

【C语言基础篇】结构控制(中)循环结构

文章目录 一、循环结构 1. while语句 2. for语句 3. do while语句 4. 循环结构总结 C语⾔是结构化的程序设计语⾔&#xff0c;这⾥的结构指的是顺序结构、选择结构、循环结构。也就是说在C语言所有的代码都是这三种结构。 本篇文章将会着重讲解循环结构 顺序结构和选…

数据结构图算法

算法就要多练,我在国庆节放假的时间编写了图的算法题,写完让我受益匪浅,希望可以帮助到大家. 文章目录 前言 一、图的数据结构 1.图的邻接表数据结构定义 2.图的邻接矩阵的存储形式 二、邻接表建立图代码 三、邻接表删除边(基本操作考试不考) 四、邻接表删除顶点及销毁整…

【MySQL进阶】索引

索引机制 索引介绍 MySQL 官方对索引的定义为&#xff1a;索引&#xff08;index&#xff09;是帮助 MySQL 高效获取数据的一种数据结构&#xff0c;**本质是排好序的快速查找数据结构。**在表数据之外&#xff0c;数据库系统还维护着满足特定查找算法的数据结构&#xff0c;这…

用el-image-viewer实现全局预览图片

背景 在后台管理系统中&#xff0c;一些预览图片的场景&#xff0c;通常都是使用 el-image-viewer 去实现&#xff0c;但是如果多个地方都需要预览图片&#xff0c;又要重复的去写 el-image-viewer 以及一些重复的和预览相关的代码。 可以把预览图片的组件放在根文件&#x…

洛谷P2615 [NOIP2015 提高组] 神奇的幻方(C语言)

这普及题太水了&#xff0c;你按照他给的条件来列判断语句。 按题目一步一步模拟 首先将1写在第一行的中间。 若K-1在第一行但不在最后一列&#xff0c;则将K填在最后一行&#xff0c;K-1所在列的右一列&#xff1b; 若K-1在最后一列但不在第一行&#xff0c;则将K填在第一…

深入解析与实践:Ajax异步请求在Web开发中的应用指南

一、概述 1、定义 ​ Ajax&#xff08;Asynchronous JavaScript and XML&#xff09;异步请求是现代Web开发中不可或缺的技术组件&#xff0c;它允许网页在不刷新整个页面的情况下从服务器获取并更新数据&#xff0c;从而实现动态、流畅的交互体验。 2、异步和同步 浏览器访…

【NVIDIA】Jetson Orin Nano系列:安装 Qt6、firefox、jtop、flameshot

1、使用命令安装 sudo apt install qtcreator sudo apt install qt6-* sudo apt install libqt6* sudo apt install qml-qt6 sudo apt install qmlscene-qt6 sudo apt install assistant-qt6 sudo apt install designer-qt62、启动 qtcreator 3、常用工具安装 sudo apt in…

计算机找不到msvcp120.dll的修复方法,总结五种可靠的方法

在计算机使用过程中&#xff0c;遭遇“找不到msvcp120.dll”这一问题的困扰是许多用户都可能遇到的情况。这一特定的系统文件msvcp120.dll&#xff0c;作为Microsoft Visual C Redistributable Package的重要组成部分&#xff0c;对于运行某些应用程序至关重要。当系统提示无法…

如何在 Element Plus 中使用自定义 icon 组件 (非组件库内置icon)

先说原理就是将 svg 文件以 vue 组件文件的方式使用 需求&#xff1a;我想要在 Element Plus 得评分组件中使用自定义得图标。 el-rate v-model"value1" /> 组件本身是支持自定义图标的&#xff0c;但是教程中只说明了如何使用 element-plus/icons-vue 图标库内置…

学习Spring的第八天

先对自定义类使用MyComponet的注解&#xff0c;在设置这个MyComponet的的属性(一个 interface接口)&#xff0c;然后&#xff0c;扫描(BaseClassScanUtils.java执行,这文件不重要)当前包下是否有这个注解的类&#xff0c;再用MyComponentBeanFactoryPostProcessor.java(后工厂…

蓝桥杯真题(Python)每日练Day1

说明&#xff1a;在CSP认证的基础上&#xff08;可以看看本人CSP打卡系列的博客&#xff09;备赛2024蓝桥杯&#xff08;Python&#xff09;&#xff0c;本人专业&#xff1a;大数据与数据科学 因此对python要求熟练掌握&#xff0c;通过练习蓝桥杯既能熟悉语法又能锻炼算法和思…

vulnhub-dc2靶场

DC2 配置环境vmware17 nat网络配置 下载地址:DC and Five86 Series Challenges - DC-1 &#xff08;似乎从2024/1/18左右找不到这个资源了&#xff09; 攻击机kali与其在同一网段下 ip:192.168.52.130 信息收集 arp-scan -l #内网探测&#xff0c;扫描目标ip发现目标ip1…