#ifndef INC_BUTTON_H_
#define INC_BUTTON_H_
#include "main.h"
#include "stdbool.h"
typedef struct {
GPIO_TypeDef *port;
uint16_t pinNumber;
GPIO_PinState onState;
} BUTTON_CONTROL;
extern uint8_t buttonFlag;
bool buttonGetPressed(uint8_t num);
#endif /* INC_BUTTON_H_ */
// button.c
#include "button.h"
// Button Port, Pin 정보, Pull-Up이므로 0에서 ON
BUTTON_CONTROL button[1] = {
{GPIOD, GPIO_PIN_2, 0}
};
uint8_t buttonFlag = 0;
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin) {
if (GPIO_Pin == GPIO_PIN_2) {
buttonFlag = 1;
}
}
// Button이 눌리면 Debounce 처리해서 True 반환
bool buttonGetPressed(uint8_t num) {
static uint32_t prevTime = 0xffffffff; // 초기값 최대치 설정, 처음부터 Debounce
if(prevTime == 0xffffffff) {
prevTime = HAL_GetTick(); // prevTime 초기화 작업
}
bool ret = false;
if(HAL_GPIO_ReadPin(button[num].port, button[num].pinNumber) == button[num].onState) {
uint32_t currTime = HAL_GetTick();
if(currTime - prevTime >= 300) { // Debounce Code
if(HAL_GPIO_ReadPin(button[num].port, button[num].pinNumber) == button[num].onState) {
ret = true;
}
prevTime = currTime;
}
}
return ret;
}