一、资源

硬件:NRF52840蓝牙模块;
软件:SDK17.0.2中ble_central_and_periphera的lble_app_hrs_rscs_relay工程。

二、SDK配置

点击sdk_config.h文件,再点击Configuration Wizard


勾选nRF_Drivers中GPIOTE选项

保存,每改动一次sdk_config.h文件中的内容编译时需要花费比较长的时间。

三、代码编写

.c文件

/********************************************************************** INCLUDES*/
#include "nrf_drv_gpiote.h"
#include "app_timer.h"
#include "app_error.h"#include "board_gpi.h"#include "nrf_log.h"static void irqCallbackFunc(nrf_drv_gpiote_pin_t pin, nrf_gpiote_polarity_t action);
static void timer_irqDebounceCallback(void *arg);
static void timer_resetCallback(void *arg);/********************************************************************** LOCAL VARIABLES*/
APP_TIMER_DEF(s_longPressTimer);                                                        // 按键长按定时器
APP_TIMER_DEF(s_irqDebounceTimer);                                                      // 中断消抖的定时器
static uint8 s_irqValue;                                                                // 中断值/********************************************************************** PUBLIC FUNCTIONS*/
/**@brief 按键中断初始化函数@param 无@return 无
*/
void Board_KeyInit(void)
{ret_code_t errCode = nrf_drv_gpiote_init();                                           // GPIOE驱动初始化APP_ERROR_CHECK(errCode);nrf_drv_gpiote_in_config_t inConfig = GPIOTE_CONFIG_IN_SENSE_TOGGLE(false);          // 双边沿中断触发inConfig.pull = NRF_GPIO_PIN_PULLUP;                                             // 默认上拉inConfig.sense = NRF_GPIOTE_POLARITY_TOGGLE;errCode = nrf_drv_gpiote_in_init(KEY1_IRQ_IO, &inConfig, irqCallbackFunc);APP_ERROR_CHECK(errCode);nrf_drv_gpiote_in_event_enable(KEY1_IRQ_IO, true);
}/**@brief 按键中断初始化函数@param 无@return 无
*/
void CreatDebounceTimer(void)
{app_timer_create(&s_longPressTimer, APP_TIMER_MODE_SINGLE_SHOT, timer_resetCallback);app_timer_create(&s_irqDebounceTimer, APP_TIMER_MODE_SINGLE_SHOT, timer_irqDebounceCallback);
}/********************************************************************** LOCAL FUNCTIONS*/
/**@brief IRQ中断回调函数@param pin -[in] 引脚@param action -[in] 动作@return 无
*/
static void irqCallbackFunc(nrf_drv_gpiote_pin_t pin, nrf_gpiote_polarity_t action)
{s_irqValue = 0;                                                                   app_timer_start(s_irqDebounceTimer, IRQ_DEBOUNCE_TIMEOUT, NULL);                    // 启动中断消抖的定时器
}/**@brief IRQ中断消抖定时器的回调函数@param 无@return 无
*/
static void timer_irqDebounceCallback(void *arg)
{UNUSED_PARAMETER(arg);app_timer_stop(s_longPressTimer);                                                // 在定时器计时过程中再次按下按键停止长按定时器// 消抖后if(nrf_gpio_pin_read(KEY1_IRQ_IO) == 0)                    {NRF_LOG_INFO("key");s_irqValue |= LOCK_SWITCH_IRQ_ON_VALUE;                                         // 保存中断值app_timer_start(s_longPressTimer, LONG_PRESS_TIMEOUT, NULL);            // 启动按键长按定时器}}/** @brief 按键超长按定时回调函数@param 无@return 无
*/
static void timer_resetCallback(void *arg)
{UNUSED_PARAMETER(arg);if(nrf_gpio_pin_read(KEY1_IRQ_IO) == 0){NRF_LOG_INFO("key long");s_irqValue |= RESET_IRQ_VALUE;}
}/****************************************************END OF FILE****************************************************/

.H文件


#ifndef _BOARD_GPI_H_
#define _BOARD_GPI_H_/********************************************************************** INCLUDES*/
#include "common.h"/********************************************************************** DEFINITIONS*/
#define LOCK_SWITCH_IRQ_ON_VALUE        0x01                // 中断值
#define LOCK_SWITCH_IRQ_OFF_VALUE       0x02
#define RESET_IRQ_VALUE                 0x04
#define CONTROL_PLUG_IRQ_VALUE          0x08#define KEY1_IRQ_IO                     NRF_GPIO_PIN_MAP(1,11)  // P1.11                #define LONG_PRESS_TIMEOUT              APP_TIMER_TICKS(5000)   // 按键长按超时时间#define IRQ_DEBOUNCE_TIMEOUT            APP_TIMER_TICKS(20)  // 超时时间(20ms)/********************************************************************** API FUNCTIONS*/
void Board_KeyInit(void);
void CreatDebounceTimer(void);#endif /* _BOARD_GPI_H_ */

NRF52840由于GPIO多出了P1,需要对多出来的P口进行拓展,所以需要使用NRF_GPIO_PIN_MAP()来使用不同的端口。

四、使用例子

将上面的.C文件和.H文件移植到自己的工程,配置完成之后再main.c文件里包含.H文件就可以调用接口啦。

/**@brief Function for initializing the timer.*/
static void timer_init(void)
{ret_code_t err_code = app_timer_init();APP_ERROR_CHECK(err_code);// add by wudeCreatDebounceTimer();
}/**@brief Function for initializing the application main entry.*/
int main(void)
{bool erase_bonds;// Initialize.log_init();timer_init();
//    buttons_leds_init(&erase_bonds);Board_KeyInit();  // 按键初始化power_management_init();ble_stack_init();scan_init();gap_params_init();gatt_init();conn_params_init();db_discovery_init();peer_manager_init();hrs_c_init();rscs_c_init();services_init();advertising_init();// Start execution.NRF_LOG_INFO("Relay example started.");if (erase_bonds == true){// Scanning and advertising is done upon PM_EVT_PEERS_DELETE_SUCCEEDED event.delete_bonds();}else{adv_scan_start();}// Enter main loop.for (;;){idle_state_handle();}
}

五、编译下载

完成上面步骤之后就可以编译代码下载程序到NRF52840模块上,通过RTT查看调试信息。

NRF52840 GPIO输入按键短按和长按功能完成。

NRF52840学习——GPIO输入,实现按键短按和长按相关推荐

  1. 【打卡帖】7日玩转ESP32——(第2日) GPIO输入,按键的长按和短按

    文章目录 一.硬件准备 二.知识要点 三.参考例程 四.今日作业 五.参考答案 5.1 知识点 5.2 中断方式 5.3 定时扫描 六.打卡~ 一.硬件准备 开发板上面有一个Boot Button按键 ...

  2. 【51定时器】独立按键-短按与长按

    之前的代码用Delay(xms)延时,是阻塞性延时,程序会卡住20ms,还有while写检测按键松手一般会卡个500ms,这样程序会慢很多. 用定时器写按键就不会出现上面的问题 //定时器0初始化模板 ...

  3. (二)DSP28335基础教程——GPIO输入(矩阵按键扫描)

    0 前言 GPIO输入功能是28335非常重要的部分,可通过外部数字逻辑信号的输入,作为逻辑触发控制的判断条件.比如在电机控制中,通过判断输入管脚的电平状态,实现电机调速.在显示屏人机界面下,也可通过 ...

  4. stm32f407zgt6的KEY实例:长按键+短按键(查询方法,非中断)+LCD显示

    1.实验目的 按键key.h 按键key.c 的理解和使用,修改 使用查询方式进行判断按键 返回按键长按的数值,和短按的数值 2.实验理论 短按和长按 按下- 判断是不是等于0 ----延时去抖动 - ...

  5. 8位单片机只用一个定时器T0进行红外解码,包括短按、长按处理,模拟串口打印数据

    最近自己在网上搜了很多资料,发现很多的红外解码,关于重码的处理的代码很少,分享一下红外解码包括重码的处理. 使用单片机:EN8F156 功能说明:红外遥控器解码,只使用定时器T0定时100us进行按键 ...

  6. 乐鑫Esp32学习之旅⑦ esp32上利用GPIO中断做一个按键的短按和长按的回调事件,再也无须担心触发源。(附带Demo)

    本系列博客学习由非官方人员 半颗心脏 潜心所力所写,仅仅做个人技术交流分享,不做任何商业用途.如有不对之处,请留言,本人及时更改. 1. 爬坑学习新旅程,虚拟机搭建esp32开发环境,打印 " ...

  7. F28335矩阵键盘的3种工作方式代码及按键消抖讨论(包括利用GPIO输入量化实现按键消抖)

    文章目录 前言 1. 延时消抖 1.1 硬件电路 1.2 3种工作方式的代码 2. 利用GPIO输入量化实现按键消抖 2.1 理论分析 2.1 代码分析 前言 本文是在学习普中TMS320F28335 ...

  8. STM32——GPIO输入——按键检测

    硬件介绍 当按键置空时,IO接地 按键按下之后,IO口接通3.3V高电压,电流比较大,为了避免损坏IO,这里需要加装一个限流电阻.可以看到IO口是默认低电平,按键按下后产生一个上升沿,和平常的电路设计 ...

  9. ARM(IMX6U)裸机按键输入实验(BSP+SDK、GPIO输入与输出、按键消抖)

    参考:Linux之ARM(IMX6U)裸机按键输入实验(GPIO的输出与输入) 作者:一只青木呀 发布时间: 2020-08-17 21:43:37 网址:https://blog.csdn.net/ ...

  10. 物联网系统RT-Thread学习---软件包使用(按键)

    前文回顾 <物联网系统RT-Thread学习-开发环境搭建> <物联网系统RT-Thread学习-内核学习> <物联网系统RT-Thread学习-设备和驱动学习> ...

最新文章

  1. 《晓肚知肠:肠菌的小心思》荣获“2018年度中国好书”奖
  2. windows live writer向cnblog发布文章设置(转)
  3. python 爬虫代码_python之路(一)_爬虫—爬一下网页代码输出到文件
  4. python是c语言_python与c语言
  5. 两种方式实现word转markdown
  6. BZOJ4997 [Usaco2017 Feb]Why Did the Cow Cross the Road III
  7. 计算机学院志愿服务活动 2013/12/23 爱心6+1,计算机学院赴淮南南站开展志愿服务活动...
  8. ASN.1编解码与编程
  9. ftk学习记(消息框篇)
  10. shell-最近7天目录
  11. Sql语句优化案例-两表关联查询
  12. CAML语法- Query写法
  13. 空手套白狼-我的互联网草根创业亲身经历
  14. java.lang.null_java.lang.nullpointerexception 怎么解决
  15. 狐妖小红娘服务器维护,3月7游戏更新公告 狐妖小红娘版本上线
  16. 解密:顺丰是一家什么样的公司
  17. 苹果Mac远程控制软件:Screens
  18. skb_buff 详解(二)
  19. sql 数据库创建及建表,
  20. python设备分组(部门分组等)功能设计

热门文章

  1. landset8各波段_landsat8卫星全面
  2. MySQL恢复数据库(mysql命令)
  3. matlab求数组转置,数组与矩阵运算 - MATLAB Simulink - MathWorks 中国
  4. 神舟刷蓝天w650dbios_Hasse神舟笔记本卡logo解决,刷BIOS方法,教你修复神船
  5. 什么是CMMI能力成熟度模型?企业为什么要做?
  6. j2ee框架之jvn
  7. 利用Linux socket 模拟大华IPC发送广播包,让大华客户端搜索到一个模拟的ip摄像头
  8. 网络序、主机序、点分十进制的IP地址转换
  9. 图片 后台 的一些官网 改字体的一些网站
  10. 计算机系统结构总复习