51822代码篇4

来源:互联网 发布:演唱会订票软件 编辑:程序博客网 时间:2024/06/01 10:51

     51822的按键,在代码里使用了GPIOE的sense中断的触发方式,下面函数开辟了GPIOE所需的空间

static void gpiote_init(void)
{
    APP_GPIOTE_INIT(APP_GPIOTE_MAX_USERS);
}

其实就是开辟了一个结构体,因为APP_GPIOTE_MAX_USERS被设为1

typedef struct
{
    uint32_t                   pins_mask;             /**< Mask defining which pins user wants to monitor. */
    uint32_t                   pins_low_to_high_mask; /**< Mask defining which pins will generate events to this user when toggling low->high. */
    uint32_t                   pins_high_to_low_mask; /**< Mask defining which pins will generate events to this user when toggling high->low. */
    uint32_t                   sense_high_pins;       /**< Mask defining which pins are configured to generate GPIOTE interrupt on transition to high level. */
    app_gpiote_event_handler_t event_handler;         /**< Pointer to function to be executed when an event occurs. */
} gpiote_user_t;

在这个结构体里,将会记录所用到的pin脚,和他们的状态,以及一个在gpioe中断里面会调用执行的函数。

 

在按键初始化函数里面,将会配置相应的io口为输入,将按键信息注册到上面的gpiote_user_t 结构体里,

为按键创建timer任务。

static void buttons_init(void)
{
    static app_button_cfg_t buttons[] =
    {
        {SIGNAL_ALERT_BUTTON,  false, BUTTON_PULL, button_event_handler},
        {STOP_ALERTING_BUTTON, false, BUTTON_PULL, button_event_handler}
    };
   
    APP_BUTTON_INIT(buttons, sizeof(buttons) / sizeof(buttons[0]), BUTTON_DETECTION_DELAY, false);
}

在botton使能函数里,将会对gpioe的sense脚进行配置

uint32_t app_button_enable(void)
{
    if (mp_buttons == NULL)
    {
        return NRF_ERROR_INVALID_STATE;
    }

    return app_gpiote_user_enable(m_gpiote_user_id);
}

 

所以整个的流程是:

1.   开辟GPIOE空间

2.   根据按键数组buttons[ ]  配置io为输入,注册gpioe的状态结构体,创建按键的timer任务

3.   在app_button_enable函数里配置gpioe寄存器

4.   当有按键按下,首先进入gpioe的中间函数进行判断。

5.   在gpioe中断里开始按键的timer任务

6.   在按键timer任务函数里调用button_event_handler

 

整个按键的实现代码跳转的比较多,在代码里通过记录按键的初始状态,来判断按键是按下还是

抬起,而不是像比较通用的以知高低电平来判断,这样做法通用性更好,但也耗费了代码量。

0 0
原创粉丝点击