...

반응형

인터럽트 방식으로 버튼 입력을 받아서 버튼을 토글 시키는 예제입니다
디바이스트리에서 출력할 포트와 버튼에 대한 설정이 되어 있어야 됩니다

#include <stdio.h>
#include <zephyr/kernel.h>
#include <zephyr/drivers/gpio.h>

/* 1000 msec = 1 sec */
#define SLEEP_TIME_MS   1000

// 디바이스 트리에서 led0 노드를 가져옴
#define LED0_NODE DT_ALIAS(led0)

// 디바이스 트리에서 button 노드를 가져옴
#define BUTTON DT_ALIAS(button)

// 가져온 led 노드를 구주체로 초기화
static const struct gpio_dt_spec led0 = GPIO_DT_SPEC_GET(LED0_NODE, gpios);
// 가져온 button 노드를 구주체로 초기화
static const struct gpio_dt_spec button = GPIO_DT_SPEC_GET(BUTTON, gpios);

void button_pressed(const struct device *dev, struct gpio_callback *cb,
		    uint32_t pins)
{
	gpio_pin_toggle_dt(&led0);
}

int main(void)
{
	int ret;

	// gpio가 준비되었는지 확인
	if (!gpio_is_ready_dt(&led0)) {
		return 0;
	}

	// gpio가 준비되었는지 확인
	if (!gpio_is_ready_dt(&button)) {
        return 0;
    }

	// button 핀을 입력으로 설정
	ret = gpio_pin_configure_dt(&button, GPIO_INPUT);

	// led 핀을 출력으로 설정
	ret = gpio_pin_configure_dt(&led0, GPIO_OUTPUT_ACTIVE);

	// 입력 핀을 인터럽트 핀으로 설정
	ret = gpio_pin_interrupt_configure_dt(&button,GPIO_INT_EDGE_TO_ACTIVE);

	// 에러 처리가 필요할 경우 추가
	// if (ret < 0) { 
	// 	return 0;
	// }

	static struct gpio_callback button_cb_data;

	// 버튼핀 눌렀을때 실행 될 콜백 함수 설정
	gpio_init_callback(&button_cb_data, button_pressed, BIT(button.pin));
	// 버튼에 콜백 함수 추가
	gpio_add_callback(button.port, &button_cb_data);

	while (1) {


	}
	return 0;
}
반응형