1、SDK下”buttons_init”
稍微修改了一下便于理解
static void buttons_init(void)
{
ret_code_t err_code;
//这里声明一个按键配置列表,配置了按键对应的引脚号,上下拉,回调函数入口
static app_button_cfg_t buttons[] =
{
{LEDBUTTON_BUTTON, false, BUTTON_PULL, button_event_handler}
};
//初始化按键列表的按键,并设定按键检测的时间间隔为50ms
err_code = app_button_init(buttons, ARRAY_SIZE(buttons),APP_TIMER_TICKS(50));
APP_ERROR_CHECK(err_code);
app_button_enable(); //使能按键,不使能按键不会生效
}
记得在“sdk_config.h”里面使能这个,不然编译会出错
成功初始化后,按下按键就会触发回调函数了
static void button_event_handler(uint8_t pin_no, uint8_t button_action)
{
ret_code_t err_code;
switch (pin_no)
{
case LEDBUTTON_BUTTON:
NRF_LOG_INFO("button:%d",button_action);//将当前按键的状态打印
//跟蓝牙消息有关,后面研究
err_code = ble_lbs_on_button_change(m_conn_handle, &m_lbs, button_action);
if (err_code != NRF_SUCCESS &&
err_code != BLE_ERROR_INVALID_CONN_HANDLE &&
err_code != NRF_ERROR_INVALID_STATE &&
err_code != BLE_ERROR_GATTS_SYS_ATTR_MISSING)
{
APP_ERROR_CHECK(err_code);
}
break;
default:
APP_ERROR_HANDLER(pin_no);
break;
}
}
2、BSP相关的按键使用
static void buttons_leds_init(bool * p_erase_bonds)
{
ret_code_t err_code;
bsp_event_t startup_event;
//这里初始化了按键以及LED,并设定了回调函数入口
//这个函数会调用app_button_init初始化按键IO,分配按键触发的事件为默认事件
err_code = bsp_init(BSP_INIT_LEDS | BSP_INIT_BUTTONS, bsp_event_handler);
APP_ERROR_CHECK(err_code);
//这个函数主要分配按键触发的事件
//我们可以在这里面的"advertising_buttons_configure"添加按键触发的事件
err_code = bsp_btn_ble_init(NULL, &startup_event);
APP_ERROR_CHECK(err_code);
//唤醒绑定按键被按下,会返回1到p_erase_bonds,否则返回0
*p_erase_bonds = (startup_event == BSP_EVENT_CLEAR_BONDING_DATA);
}
static uint32_t advertising_buttons_configure()
{
uint32_t err_code;
err_code = bsp_event_to_button_action_assign(BTN_ID_DISCONNECT,
BTN_ACTION_DISCONNECT,
BSP_EVENT_DEFAULT);
RETURN_ON_ERROR_NOT_INVALID_PARAM(err_code);
err_code = bsp_event_to_button_action_assign(BTN_ID_WHITELIST_OFF,
BTN_ACTION_WHITELIST_OFF,
BSP_EVENT_WHITELIST_OFF);
RETURN_ON_ERROR_NOT_INVALID_PARAM(err_code);
err_code = bsp_event_to_button_action_assign(BTN_ID_SLEEP,
BTN_ACTION_SLEEP,
BSP_EVENT_SLEEP);
//这里的按键标号为3,代表第4个按键
err_code = bsp_event_to_button_action_assign(3,
BSP_BUTTON_ACTION_PUSH,
BSP_EVENT_KEY_3);
RETURN_ON_ERROR_NOT_INVALID_PARAM(err_code);
return NRF_SUCCESS;
}
上面的按键标号是3,因为事件其实是记录在
“static bsp_button_event_cfg_t m_events_list[BUTTONS_NUMBER] = {{BSP_EVENT_NOTHING, BSP_EVENT_NOTHING}};”
这个事件列表里面的,3代表列表的第4个元素。
而m_events_list又在按键初始化列表的默认回调函数中被使用
“static void bsp_button_event_handler(uint8_t pin_no, uint8_t button_action)”
在这个函数里面有一个语句:
“ button = bsp_board_pin_to_button_idx(pin_no);”
在这里,我们输入形参“pin_no”==“BSP_BUTTON_3”,BSP_BUTTON_3为16,16号引脚它会自动寻找16号引脚在按键初始化列表“BUTTONS_LIST”中的位号并返回,(这里应该为第3位)所以,当我们按下“BSP_BUTTON_3”这个按键后,会在“m_events_list”列表的第3个元素。产生绑定的“BSP_EVENT_KEY_3”消息,这个消息会出现在我们设定的回调函数:
“err_code = bsp_init(BSP_INIT_LEDS | BSP_INIT_BUTTONS, bsp_event_handler);”
注意,使用这个功能,需要添加两个源文件“bsp.c”“bsp_btn_ble.c”
路径在“nRF5_SDK_15.0.0_a53641a\components\libraries\bsp”
然后按键按下就能触发事件了
static void bsp_event_handler(bsp_event_t event)
{
ret_code_t err_code;
switch (event)
{
case BSP_EVENT_SLEEP:
break; // BSP_EVENT_SLEEP
case BSP_EVENT_DISCONNECT:
break; // BSP_EVENT_DISCONNECT
case BSP_EVENT_WHITELIST_OFF:
break; // BSP_EVENT_KEY_0
case BSP_EVENT_KEY_3:
nrf_gpio_pin_toggle(LED_4);
break;
default:
break;
}
}