NRF52832----按键使用

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;
    }
}

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章