NRF按键中断BSP长按功能实现

最近在使用Nordic公司的NRF开发板进行开发,需要使用长按功能,看到网上这方面的总结不太多。因此写一篇关于长按功能的实现分析。

首先是按钮的初始化,初始化的入口在bsp_init()中,为了实现按钮功能,使用了 bsp_event_to_button_action_assign()这个函数,同一个按钮可以assign多个动作响应,每个动作可以对应于一个相应的动作处理事件,可用的按钮动作有三个,已经在bsp_config.h中定义过。

按钮动作处理事件可以使用预定义的事件或自己在bsp.h中定义。

NRF按键中断BSP长按功能实现_第1张图片

当按钮被按下或释放,会产生一个中断,相应的中断处理函数是bsp.c中的bsp_button_event_handler(uint8_t pin_no, uint8_t button_action)函数,该函数的流程图绘制如下:

NRF按键中断BSP长按功能实现_第2张图片

如果按钮定义了长按定时器,那么在短按的时候就会触发这个定时器,如果在定时器结束之前释放了按钮,则进入释放事件处理;如果定时器结束时还没有释放按钮,那么就进入长按处理函数。可以看到按钮释放后返回了一个event变量,这个变量会通过callback函数注册,然后再main.c 中的回调函数里做相应处理。

原代码可以实现短按(长按)按下,短按释放,长按到时的功能。需要注意的是长按仅仅只是由计时器检测,因此长按功能会和按钮按下以及按钮释放事件同时触发,在很多功能中我们希望短按长按各自有不同的功能,长按也不会触发短按的功能。由于长按短按都会按下按钮,不论如何都无法分开。因此在实际使用时需要检测短按释放长按释放,但此时虽然长按时返回了一个长按事件处理,如果不作任何处理则按钮释放的时候又会产生一次释放事件。因此在长按功能下添加一条:

NRF按键中断BSP长按功能实现_第3张图片

在release动作处理中不需要添加其他代码,这样按钮释放时程序检测到长按时已经做过相应处理,因此按钮释放时就不会再触发释放事件,由此可以实现检测按钮长按释放。

最后main.c中会检测回调,进行相应处理,不管你开头使用的是自己的还是预定义的事件最后都会回到这里处理,在这里写上你想要的事件处理代码即可:

NRF按键中断BSP长按功能实现_第4张图片

参考:https://blog.csdn.net/zhanghuaishu0/article/details/79927306?utm_source=blogxgwz3

https://infocenter.nordicsemi.com/index.jsp?topic=%2Fstruct_nrf5gs%2Fstruct%2Fnrf5gs.html&cp=1

 

你可能感兴趣的:(NRF)