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

    科技2023-09-29  97

    文章目录

    一、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参数

    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参数。

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

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

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

    3.代码实现

    1、按照前面所说,对于各个引脚的操作进行宏定义

    #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开发指南库函数版本。

    Processed: 0.019, SQL: 8