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

这篇具有很好参考价值的文章主要介绍了【stm32】hal库学习笔记-GPIO按键控制LED和蜂鸣器(超详细!)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

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

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

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

硬件特点

GPIO引脚内部结构图
【stm32】hal库学习笔记-GPIO按键控制LED和蜂鸣器(超详细!),stm32学习笔记,stm32,学习,笔记,单片机,嵌入式硬件

GPIO状态

  • 输入浮空状态:上拉下拉电阻均不使用(复位时状态)
  • 输入上拉状态:只使用上拉电阻-引脚外部无输入时读到的电平为高电平

【stm32】hal库学习笔记-GPIO按键控制LED和蜂鸣器(超详细!),stm32学习笔记,stm32,学习,笔记,单片机,嵌入式硬件

按键按下时接地读到低电平

  • 输入下拉状态:只使用下拉电阻-引脚外部无输入时读到的电平为低电平

【stm32】hal库学习笔记-GPIO按键控制LED和蜂鸣器(超详细!),stm32学习笔记,stm32,学习,笔记,单片机,嵌入式硬件

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

涉及到的函数

【stm32】hal库学习笔记-GPIO按键控制LED和蜂鸣器(超详细!),stm32学习笔记,stm32,学习,笔记,单片机,嵌入式硬件

重要函数

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部分原理图
【stm32】hal库学习笔记-GPIO按键控制LED和蜂鸣器(超详细!),stm32学习笔记,stm32,学习,笔记,单片机,嵌入式硬件
按键部分原理图
【stm32】hal库学习笔记-GPIO按键控制LED和蜂鸣器(超详细!),stm32学习笔记,stm32,学习,笔记,单片机,嵌入式硬件

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

MCU图形化配置

连接按键的引脚选择GPIO_Input
连接LED的引脚选择GPIO_Output
并设置相应的用户标签
【stm32】hal库学习笔记-GPIO按键控制LED和蜂鸣器(超详细!),stm32学习笔记,stm32,学习,笔记,单片机,嵌入式硬件

  • KEY0,KEY1,KEY2配置为上拉(Pull-up)
  • PF9,PF10设置为推挽输出(Output Push Pull)
  • 调试引脚设为串行调试引脚WSD
    【stm32】hal库学习笔记-GPIO按键控制LED和蜂鸣器(超详细!),stm32学习笔记,stm32,学习,笔记,单片机,嵌入式硬件
  • 在RCC里将HSE改为晶振
    【stm32】hal库学习笔记-GPIO按键控制LED和蜂鸣器(超详细!),stm32学习笔记,stm32,学习,笔记,单片机,嵌入式硬件
    在时钟树界面
  • 将HSE改为8MHz
  • 主锁相环选择HSE作为时钟源
  • 设置HCLK为168

【stm32】hal库学习笔记-GPIO按键控制LED和蜂鸣器(超详细!),stm32学习笔记,stm32,学习,笔记,单片机,嵌入式硬件

代码部分

编写驱动程序

keyled.c

#include "keyled.h"
//编写函数扫描被按下的按键
KEYS ScanPressedKey(uint32_t timeout)
{
	uint32_t tickstart=HAL_GetTick();
	const uint32_t btnDelay=20;//延时时间
	while(1)
	{
#ifdef KEY0_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 KEY1_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 KEY2_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 KEY_UP_Pin
		if(HAL_GPIO_ReadPin(KEY_UP_GPIO_Port,KEY_UP_Pin)==GPIO_PIN_SET)
		{
			HAL_Delay(btnDelay);
			if(HAL_GPIO_ReadPin(KEY_UP_GPIO_Port,KEY_UP_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_0=0,
	KEY_1,
	KEY_2,
	KEY_UP,
	KEY_NONE,
}KEYS;
//定义参数-表示一直等待按键按下
#define KEY_WAIT_ALWAYS		0//函数声明
KEYS ScanPressedKey(uint32_t timeout);
#ifdef LED0_Pin
	#define LED0_Toggle()	HAL_GPIO_TogglePin(LED0_GPIO_Port, LED0_Pin)//实现翻转
	#define LED0_ON()	 HAL_GPIO_WritePin(LED0_GPIO_Port, LED0_Pin, GPIO_PinState PinStateGPIO_PIN_SET)//实现打开
	#define LED0_OFF()	 HAL_GPIO_WritePin(LED0_GPIO_Port, LED0_Pin, GPIO_PIN_RESET)//实现关闭
#endif

#ifdef LED1_Pin
	#define LED1_Toggle()	HAL_GPIO_TogglePin(LED1_GPIO_Port, LED1_Pin)
	#define LED1_ON()	 HAL_GPIO_WritePin(LED1_GPIO_Port, LED1_Pin, GPIO_PinState PinStateGPIO_PIN_SET)
	#define LED1_OFF()	 HAL_GPIO_WritePin(LED1_GPIO_Port, LED1_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_PinState PinStateGPIO_PIN_SET)
	#define Buzzer_OFF()	 HAL_GPIO_WritePin(Buzzer_GPIO_Port, Buzzer_Pin, GPIO_PIN_RESET)
#endif

应用驱动程序

【stm32】hal库学习笔记-GPIO按键控制LED和蜂鸣器(超详细!),stm32学习笔记,stm32,学习,笔记,单片机,嵌入式硬件
【stm32】hal库学习笔记-GPIO按键控制LED和蜂鸣器(超详细!),stm32学习笔记,stm32,学习,笔记,单片机,嵌入式硬件
如此设置后出现no such file or directory,经过上网查找后找到如下解决办法
【stm32】hal库学习笔记-GPIO按键控制LED和蜂鸣器(超详细!),stm32学习笔记,stm32,学习,笔记,单片机,嵌入式硬件
(来自CSDN博主tuxinbang1989)

编写主程序
/* USER CODE BEGIN Includes */
#include "keyled.h"
/* USER CODE END Includes */
  while (1)
  {
	  KEYS curKey=ScanPressedKey(KEY_WAIT_ALWAYS);
	  switch (curKey)
	  {
	  case KEY_0:
	  	  LED0_Toggle();
	  	  break;
	  case KEY_1:
	  	  LED1_Toggle();
	  	  break;
	  case KEY_2:
	  	  LED0_Toggle();
	  	  LED1_Toggle();
	  	  break;
	  case KEY_UP:
	  	  Buzzer_Toggle();
	  	  break;
	  default:
		  break;
	  }
	  HAL_Delay(200);//消除按键弹起时的的抖动影响

按键控制蜂鸣器

有源蜂鸣器原理图
【stm32】hal库学习笔记-GPIO按键控制LED和蜂鸣器(超详细!),stm32学习笔记,stm32,学习,笔记,单片机,嵌入式硬件
有源蜂鸣器是指自带了震荡电路的蜂鸣器,这种蜂鸣器一接上电就会自己震荡发声。而如
果是无源蜂鸣器,则需要外加一定频率(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,有源滤波器都可
    【stm32】hal库学习笔记-GPIO按键控制LED和蜂鸣器(超详细!),stm32学习笔记,stm32,学习,笔记,单片机,嵌入式硬件

成果演示

【stm32】hal库学习笔记-GPIO按键控制LED和蜂鸣器(超详细!),stm32学习笔记,stm32,学习,笔记,单片机,嵌入式硬件
上键翻转蜂鸣器状态
KEY0翻转红灯,KEY1翻转绿灯
KEY2同时翻转两个灯状态文章来源地址https://www.toymoban.com/news/detail-807142.html

到了这里,关于【stm32】hal库学习笔记-GPIO按键控制LED和蜂鸣器(超详细!)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【STM32】按键控制LED亮灭实验——GPIO、LED、KEY、SYS

    无锁存时:当按下独立按钮时LED亮,松开LED灭。 锁存时:当按下独立按钮时LED亮,松开LED仍亮,再按下独立按钮时LED熄灭。 硬件部分 软件部分 1、引入头文件 2、主函数 首先时钟、led、按键初始化 锁存时:当按下独立按钮时LED亮,松开LED仍亮,再按下独立按钮时LED熄灭。常

    2024年02月08日
    浏览(100)
  • 【STM32】STM32学习笔记-LED闪烁 LED流水灯 蜂鸣器(06-2)

    电路图示例1 电路图示例2 main.c 接线图如下图所示: 点击下载,现象为LED闪烁。 main.c main.c stm32F103工程模板 01-LED闪烁.rar 02-LED流水灯.rar 03-蜂鸣器示例程序.rar 参考: 【STM32】江科大STM32学习笔记汇总

    2024年03月19日
    浏览(59)
  • 3、stm32:GPIO输出——LED闪烁、LED流水灯、蜂鸣器

    目录 一、GPIO简介 二、GPIO基本结构 三、GPIO模式 四、GPIO常用寄存器 (1)端口配置低高寄存器(GPIOx_CRL/GPIOx_CRH)(x=A…E) (2)端口输入数据寄存器(GPIOx_IDR)(x=A…E) (3)端口输出数据寄存器(GPIOx_ODR)(x=A…E) (4)端口位设置/清除寄存器(GPIOx_BERR)(x=A…E) (5)端口位清除寄存器(GP

    2024年02月09日
    浏览(45)
  • STM32-03基于HAL库(CubeMX+MDK+Proteus)输入检测案例(按键控制LED)

    搭建完成开发STM32开发环境之后,开始GPIO的学习。上一节已经测试了使用GPIO的输出模式,实现LED点亮的功能。 本次案例实现GPIO的输入检测功能,实现按键状态检测,通过按键状态控制LED。 需求分析: 接线:PA6-KEY1、PA7-KEY2、PA0-LED1、PA1-LED2; KEY1控制LED1、KEY2控制LED2; 按键闭

    2024年04月23日
    浏览(57)
  • stm32——hal库学习笔记(GPIO)

    一、GPIO的八种模式分析(熟悉) GPIO_Mode_IN_FLOATING 浮空输入 GPIO_Mode_IPU 上拉输入 GPIO_Mode_IPD 下拉输入 GPIO_Mode_AIN 模拟输入 GPIO_Mode_Out_OD 开漏输出 GPIO_Mode_Out_PP 推挽输出 GPIO_Mode_AF_OD 复用开漏输出 GPIO_Mode_AF_PP 复用推挽输出 应用总结 1、上拉输入、下拉输入可以用来检测外部信号

    2024年02月21日
    浏览(42)
  • STM32 HAL库实现三位数码管显示(74HC595+按键+蜂鸣器)

    1、加强数码管学习,实现数码显示变量数据(三位数的显示); 2、3位数码+2个按键+蜂鸣器实现模拟电磁炉功率调节及显示; 关于74HC595的STM32F103的驱动以及数码的显示等请查阅我写的上一篇博客:https://blog.csdn.net/luojuan198780/article/details/136653377 实验效果参考下面网址视频:

    2024年03月17日
    浏览(85)
  • GPIO(STM32)点亮LED灯、按键KEY

    GPIO(general porpose intputoutput):通用输入输出端口的简称。可以通过软件控制其输出和输入。stm32芯片的GPIO引脚与外部设备连接起来,从而实现与外部通信,控制以及数据采集的功能。 在STM32F4xx芯片上的GPIO口被分成各个组,一共有7组IO口,以A、B、C、D、E、F、G等命名(不同

    2024年04月14日
    浏览(43)
  • 学习笔记|认识蜂鸣器|控制原理|电磁炉LED实战|逻辑运算|STC32G单片机视频开发教程(冲哥)|第八集(上):蜂鸣器应用

    反面包上黑胶的是有源蜂鸣器。 在背面裸露的一块线路板的是无源蜂鸣器。 YX55675-无源蜂鸣器模块的资料 提取码:nl73 1、有源蜂鸣器内部带震荡源,所以只要一通电就会叫(一边高电平,一边低电平),而无源内部不带震荡源,所以如果用直流信号无法令其鸣叫(必须不断给高

    2024年02月11日
    浏览(58)
  • Stm32f103c8t6(proteus仿真)学习——3.按键控制LED灯

    按键:button 电阻:res 先配置LED灯的GPIO 编写LED亮灭的函数 实现按下按键LED灯的状态取反 led.c总代码 先配置按键的GPIO 获取当前按键键值的函数 key.c总代码 5.1 按键按下实现LED亮或者灭 仿真效果图: 5.2 按键按下实现LED状态取反 仿真效果图: 百度网盘 链接:https://pan.baidu.co

    2024年02月07日
    浏览(60)
  • verilog学习笔记- 11)按键控制蜂鸣器实验

    蜂鸣器按照驱动方式主要分为有源蜂鸣器和无源蜂鸣器,其主要区别为蜂鸣器内部是否含有震荡源。一般的有源蜂鸣器内部自带了震荡源,只要通电就会发声。而无源蜂鸣器由于不含内部震荡源,需要外接震荡信号才能发声。                                          

    2024年02月02日
    浏览(42)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包