nrf52832 gpiote中断下按键

1、平台的条件

1.1 软件平台:sdk14.2
1.2 硬件平台: nrf52832

说明:
只是介绍代码怎么使用,直接点
QQ: 1297311998 ,如果有什么问题,请高手不吝赐教

2 使用步骤

2.1 添加以下文件

nrf52832 gpiote中断下按键_第1张图片

2.2 添加一个定时器,用于消抖、短按和长按

static uint8_t key_timeout_enable = 0;
APP_TIMER_DEF(check_key_timer);

static void check_key_timeout(void * p_context)
{
	key_timeout_enable = 1;
}
// 初始化按键检测定时器
void init_check_key_timer(void)
{
    ret_code_t err_code;
    err_code = app_timer_create(&check_key_timer,
                                APP_TIMER_MODE_SINGLE_SHOT,
                                check_key_timeout);
    APP_ERROR_CHECK(err_code);
}

/*****************************************************
*function : start_key_timer
*****************************************************/
void start_check_key_timer(uint8_t type)
{
	ret_code_t err_code;
	
	if(type == true)
	{
		err_code = app_timer_start(check_key_timer,
								   APP_TIMER_TICKS(500),
								   NULL);
		APP_ERROR_CHECK(err_code);
	}
	else if(type == false)
	{
		app_timer_stop(check_key_timer);
	}

}

2.3 按键中断初始化


#define keyPin  26  // 按键 io
/*****************pin io gpiote*****************************/
void pin_hand(nrf_drv_gpiote_pin_t pin_no, nrf_gpiote_polarity_t action)
{
	if(nrf_gpio_pin_read(keyPin)==0)
	{ 
		// 中断进来-----执行用户函数
	     start_check_key_timer(true);
	}
}

/**********************************************
*funtion     :key_ledInit
*description : init led and key; key use gpiote driver
**********************************************/
void key_ledInit(void)
{
	// clear gpiote 
	if (!nrf_drv_gpiote_is_init())
	{
		nrf_drv_gpiote_init();
	}
	
	nrf_drv_gpiote_in_config_t config = GPIOTE_CONFIG_IN_SENSE_TOGGLE(false);

	config.pull = NRF_GPIO_PIN_PULLUP,
	config.sense = NRF_GPIOTE_POLARITY_HITOLO;
	nrf_drv_gpiote_in_init(keyPin,&config,pin_hand);
	nrf_drv_gpiote_in_event_enable(keyPin,true);
}

按键检测函数,放在mian 函数while

void check_device_key(void)
{
	static uint8_t key_Valid = false;
	
	if(key_timeout_enable==0) return;
	
	key_timeout_enable = 0;
	BLE_RTT("key_time_count %d\r\n",key_time_count);
	

	if(0==nrf_gpio_pin_read(KEY_PIN))
	{	
		key_Valid = true;
	}
	else
	{
		key_time_count    = 0;
		key_Valid = false;
	}
	if(key_Valid == true) // °´¼ü»¹ÔÚ
	{
		if(++key_time_count>=long_key_time) // long key 
		{
          	key_Valid = false;
			key_pressed_count = 0;
			key_time_count    = 0;
			start_check_key_timer(false);
			BLE_RTT("device long key %d\r\n",long_key_enable)
		}
    }
	else //if(key_time_count<=short_key_time)// short key
	{
		key_pressed_count = 0;
		key_time_count    = 0;
		start_check_key_timer(false);
		BLE_RTT("device short_key %d\r\n",short_key);
		key_Valid = false;
	}

}

你可能感兴趣的:(nRF52832_ble)