【STM32F4】HAL库 CubeMX(二)--------按键实验(蜂鸣器实验)

文章目录

  • 一、IO口的8种工作模式
  • 二、蜂鸣器实验
    • 1.引脚配置
    • 2.时钟配置
    • 3.代码实现
    • 4.Define使代码简化,可读性高
  • 三、按键实验
    • 1.引脚配置
    • 2.时钟配置(F4->84M,F1->72M)
    • 3.代码实现
  • 总结


# 前言 在前面已经学习了点亮LED以及完成了跑马灯实验,本篇博客将跟大家一起学习蜂鸣器的配置以及按键的配置。

关于蜂鸣器,同LED类似,均是IO的推挽输出模式,配置过程大相径庭。本片博客主要是学习按键的配置(输入模式)以及按键的判断。


一、IO口的8种工作模式

STM32F4 的 IO 可以由软件配置成如下 8 种模式中的任何一种:
1、输入浮空
2、输入上拉
3、输入下拉
4、模拟输入
5、开漏输出
6、推挽输出
7、推挽式复用功能
8、开漏式复用功能

二、蜂鸣器实验

1.引脚配置

1、查看手册,正点原子的蜂鸣器接在PF8上。
2、设置PF8为GPIO_Output模式。
3、设置PF8的GPIO参数
【STM32F4】HAL库 CubeMX(二)--------按键实验(蜂鸣器实验)_第1张图片
【STM32F4】HAL库 CubeMX(二)--------按键实验(蜂鸣器实验)_第2张图片

2.时钟配置

同前文的配置,F4选择84M,F1选择72M。
【STM32F4】HAL库 CubeMX(一)--------创建工程(点亮LED)

3.代码实现

通过GPIO的置高函数和置低函数,实现对蜂鸣器的设置。
代码如下(示例):

	HAL_GPIO_WritePin(GPIOF, GPIO_PIN_8, GPIO_PIN_SET);//开启蜂鸣器
	HAL_Delay(500);//500ms延时
	HAL_GPIO_WritePin(GPIOF, GPIO_PIN_8, GPIO_PIN_RESET);//关闭蜂鸣器

4.Define使代码简化,可读性高

在某些经常操作的函数,可以使用宏定义的方式,使得代码可读性更高,所以我们可以将LED和蜂鸣器的操作用几个宏定义来实现。

	#define LED0_ON()	HAL_GPIO_WritePin(GPIOF, GPIO_PIN_9, GPIO_PIN_RESET);
	#define LED0_OFF()	HAL_GPIO_WritePin(GPIOF, GPIO_PIN_9, GPIO_PIN_SET);
	#define LED1_ON()	HAL_GPIO_WritePin(GPIOF, GPIO_PIN_10, GPIO_PIN_RESET);
	#define LED1_OFF()	HAL_GPIO_WritePin(GPIOF, GPIO_PIN_10, GPIO_PIN_SET);
	#define BEEP_ON()	HAL_GPIO_WritePin(GPIOF, GPIO_PIN_8, GPIO_PIN_SET);
	#define BEEP_OFF()	HAL_GPIO_WritePin(GPIOF, GPIO_PIN_8, GPIO_PIN_RESET);

上方代码的写入,我们在主函数里面使用宏定义会让代码更容易理解(下面代码将用宏定义)

三、按键实验

1.引脚配置

1、查看手册,正点原子的四个按键分别是KEY0->PE4、KEY1->PE3、KEY2->PE2、WK_UP->PA0。
2、设置PE2、PE3、PE4、PA0为GPIO_Input模式。
3、设置PE2、PE3、PE4、PA0的GPIO参数。
【STM32F4】HAL库 CubeMX(二)--------按键实验(蜂鸣器实验)_第3张图片
【STM32F4】HAL库 CubeMX(二)--------按键实验(蜂鸣器实验)_第4张图片
【STM32F4】HAL库 CubeMX(二)--------按键实验(蜂鸣器实验)_第5张图片

注意:相同配置的引脚可以用control或者shift选中后一键配置

2.时钟配置(F4->84M,F1->72M)

如有不理解之处,请查看上一篇博客。

3.代码实现

1、按照前面所说,对于各个引脚的操作进行宏定义
【STM32F4】HAL库 CubeMX(二)--------按键实验(蜂鸣器实验)_第6张图片

#define LED0_ON() HAL_GPIO_WritePin(GPIOF, GPIO_PIN_9, GPIO_PIN_RESET)
#define LED0_Reversal()	HAL_GPIO_TogglePin(GPIOF, GPIO_PIN_9)//翻转LED0
#define LED1_Reversal()	HAL_GPIO_TogglePin(GPIOF, GPIO_PIN_10)//翻转LED1
#define BEEP__Reversal() HAL_GPIO_TogglePin(GPIOF, GPIO_PIN_8)//翻转BEEP

#define KEY0 HAL_GPIO_ReadPin(GPIOE,GPIO_PIN_4)//读取PE4电平
#define KEY1 HAL_GPIO_ReadPin(GPIOE,GPIO_PIN_3)//读取PE3电平
#define KEY2 HAL_GPIO_ReadPin(GPIOE,GPIO_PIN_2)//读取PE2电平
#define WK_UP HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_0)//读取PA0电平
#define KEY0_Press 1//KEY0被按下标志位
#define KEY1_Press 2//KEY1被按下标志位
#define KEY2_Press 3//KEY2被按下标志位
#define WK_UP_Press 4//WK_UP被按下标志位

2、在主函数内添加按键判断函数(放在BEGIN和END之间)
【STM32F4】HAL库 CubeMX(二)--------按键实验(蜂鸣器实验)_第7张图片

uint8_t KEY_Scan(uint8_t mode);
uint8_t KEY_Scan(uint8_t mode)
{
     
	static uint8_t key_up=1;//按键松开标志
	if(mode)key_up=1; //支持连按
	if(key_up&&(KEY0==0||KEY1==0||KEY2==0||WK_UP==1))
	{
     
		HAL_Delay(10);//去抖动
		key_up=0;
		if(KEY0==0)return KEY0_Press;
		else if(KEY1==0)return KEY1_Press;
		else if(KEY2==0)return KEY2_Press;
		else if(WK_UP==1)return WK_UP_Press;
	}else if(KEY0==1&&KEY1==1&&KEY2==1&&WK_UP==0)key_up=1;
	return 0;//无按键按下
}

3、在主函数内添加按键处理函数(放在BEGIN和END之间)
【STM32F4】HAL库 CubeMX(二)--------按键实验(蜂鸣器实验)_第8张图片

	uint8_t key = 0;
	LED0_ON();//先点亮LED0
	key=KEY_Scan(0);//得到键值
	if(key)
	{
     
		switch(key)
		{
      
			case WK_UP_Press: //控制蜂鸣器翻转
				BEEP__Reversal();
			break;
			case KEY0_Press: //控制LED0翻转
				LED0_Reversal();
			break;
			case KEY1_Press: //控制LED1翻转
				LED1_Reversal();
			break;
				case KEY2_Press: //同时控制LED0、LED1翻转
				LED0_Reversal();
				LED1_Reversal();
			break;
		}
	}else HAL_Delay(10);

总结

以上就是今天要学习的内容,本文仅仅简单介绍GPIO的两种模式,大家可以深入了解一下其他的模式,后面我们也会更新┗|`O′|┛ 嗷~~。

为了更好的结合原子的视频,代码均改写自STM32F4开发指南库函数版本。

在这里插入图片描述

你可能感兴趣的:(单片机,stm32)