第三讲:KEY和BUZZ
学习内容:
1、蜂鸣器代码:复用PB3为GPIO-output,使用HAL_GPIO_WritePin(GPIOx.GPIO_PIN_x,GPIO_PIN_SET or RESET)
2、KEY例程
需要判断GPIO口的输入状态:HAL_GPIO_ReadPin,返回值为GPIO_PIN_SET or GPIO_PIN_RESET
注意:在使用新的引脚前一定要在Cube里面初始化新的引脚!
(1)宏定义:
#define B1 HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_0)
#define BUZZ_ON HAL_GPIO_WritePin(GPIOB,GPIO_PIN_3,GPIO_PIN_RESET)
#define LED1_ON HAL_GPIO_WritePin(GPIOC,GPIO_PIN_8,GPIO_PIN_RESET)
以此类推,可让代码更简洁
(2)按键消抖及松手检测:
按键消抖:
增加一个延迟函数:5到10ms即可 HAL_Delay()
松手检测:
while函数,等待手抬起来:while(!B1);
使用if-else函数判断的时候,需要注意判断完将Value清零;
在读取按键值的时候,可以单独设置一个子函数void key_scan(void);
3、长短按检测:
每间隔一段时间(10ms)对按键进行检测
(1)C语言枚举:
把一些固定的值单独列出来
定义枚举别名:
typedef enum
{
KEY_Check,
KEY_Press,
KEY_Release,
}KEY_State;
定义了一个名称为KEY_State的枚举,包括3个枚举值,和key_scan配合使用,检测长按短按
(2)default:只用于switch语句,代表默认处理和默认值
(3)SysTick_handler中断函数在执行HAL时是自动调用的(每隔1ms,执行一次),在it.c中调用外部的函数或者变量(例如m ain.c)中的时候,在External中加入,ex:extern void Key_scan(void);
通过修改SysTick_Handler中的函数,可以实现每10ms执行一次Key_Scan,判断是长按还是短按。
具体实现如下:默认为check状态,当检测到有按键按下的时候进入press状态,同时判断是按的哪个按键;之后进入release状态,如仍有按键按压,则press_time加10ms;若已经松开,则KEY_Flag=1,代表一次按键按压已经完成,之后根据presstime判断是长按还是短按,并且执行操作。
注意:循环使用的变量,例如KEY_Press_Time和Flag在使用完后一定要恢复初始化!!!
4、初始化GPIO函数配置
主要在stm32g4xx.hal.gpio.h和.c文件里面,主要有:
HAL_GPIO_Init
HAL_GPIO_ReadPin()
HAL_GPIO_WritePin()
HAL_GPIO_LockPin (较少使用)
5、LL库
(1)LL库的LL_SYSTICK_ENABLEIN()需要用户手工调用;
(2)LL库中用0、1代替GPIO_PIN_SET or RESEY;
(3)LL库中的库函数略有不同,EX:LL_GPIO_IsInputPinSet;