关于蜂鸣器,同LED类似,均是IO的推挽输出模式,配置过程大相径庭。本片博客主要是学习按键的配置(输入模式)以及按键的判断。
STM32F4 的 IO 可以由软件配置成如下 8 种模式中的任何一种:
1、输入浮空
2、输入上拉
3、输入下拉
4、模拟输入
5、开漏输出
6、推挽输出
7、推挽式复用功能
8、开漏式复用功能
1、查看手册,正点原子的蜂鸣器接在PF8上。
2、设置PF8为GPIO_Output模式。
3、设置PF8的GPIO参数
同前文的配置,F4选择84M,F1选择72M。
【STM32F4】HAL库 CubeMX(一)--------创建工程(点亮LED)
通过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);//关闭蜂鸣器
在某些经常操作的函数,可以使用宏定义的方式,使得代码可读性更高,所以我们可以将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、查看手册,正点原子的四个按键分别是KEY0->PE4、KEY1->PE3、KEY2->PE2、WK_UP->PA0。
2、设置PE2、PE3、PE4、PA0为GPIO_Input模式。
3、设置PE2、PE3、PE4、PA0的GPIO参数。
注意:相同配置的引脚可以用control或者shift选中后一键配置
如有不理解之处,请查看上一篇博客。
#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之间)
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之间)
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开发指南库函数版本。