[nRF51822] 5、 霸屏了——详解nRF51 SDK中的GPIOTE(从GPIO电平变化到产生中断事件的流程详解)

:由于在大多数情况下GPIO的状态变化都会触发应用程序执行一些动作。为了方便nRF51官方把该流程封装成了GPIOTE,全称:The GPIO Tasks and Events (GPIOTE) 。

从GPIO电平变化到产生中断事件的流程详解 

1、GPIOTE概览

  nRF51上面有32个GPIO,由于在大多数情况下GPIO的状态变化都会触发应用程序执行一些动作。为了方便nRF51官方把该流程封装成了GPIOTE,全称:The GPIO Tasks and Events (GPIOTE) 。GPIOTE提供使用任务和事件访问GPIO引脚功能。此外,用这个lib你可以把让多个模块共用一个相同的GPIOTE中断,当GPIOTE发生中断,其中断处理程序会确定是那个引脚,并将该事件通知对应的模块。

            图:Users are being notified of a pin transition event(user表示各个模块)

GPIOTE的users必须配置相应的引脚,除非用在SENSE用途(在该用途下引脚应该被配置为GPIO_PIN_CNF_SENSE_Disabled)

模块需要指定那个引脚在何种电平变换下产生中断事件(电平变换类型——由低到高,由高变低,both)

Note

  尽管应用使用了Scheduler,但是GPTOTE的事件句柄还是直接来自GPTOTE中断句柄。

2、初始化GPIOTE模块

  初始化之前不能使用该模块的API,再次建议使用APP_GPIOTE_INIT代替app_gpiote_initIt来进行初始化,因为前者负责为每个user保留所需的内存(MAX_USERS指明最多需要多少分users,即多少个模块将注册并使用GPIOTE模块)

1 // Macro to initialize GPIOTE module and reserving necessary memory for each of user.
2 APP_GPIOTE_INIT(MAX_USERS);

note

  初始化只能一次!!!

3、GPIOTE的寄存器

  每个user必须注册自己以使自己在GPIO状态变化时被通知到。在注册时,user必须提供回调处理程序,以通知一个转换事件,以及自己感兴趣的引脚的转换方式。下图32位的bitmask是用来代表32GPIO引脚的。user能够将感兴趣事件注册为引脚由低到高或由高到低变化。

图:GPIO Pin representation using 32-bit bitmask

  在注册成功时user被指派一个user id,user需要记下该id为后续向GPIOTE模块发请求提供唯一识别。该唯一识别是函数的一个输出参数p_user_id,如下:

 1 // GPIOTE user identifier for the example module.
 2 static app_gpiote_user_id_t   m_example_user_id;// GPIOTE event handler.
 3 static void example_gpiote_event_handler(uint32_t event_pins_low_to_high, uint32_t event_pins_high_to_low);
 4 .
 5 .
 6 .
 7 uint32_t  low_to_high_bitmask = 0x0000000F; // Bitmask to be notified of transition from low to high for GPIO 0-3
 8 uint32_t  high_to_low_bitmask = 0x0000000E; // Bitmask to be notified of transition from high to low for GPIO 0-2
 9 uint32_t retval;retval = app_gpiote_user_register(&m_example_user_id,
10                                                   low_to_high_bitmask,
11                                                   high_to_low_bitmask,
12                                                   example_gpiote_event_handler);
13
14 if (retval != NRF_SUCCESS){
15     // Failed to register with user with GPIO module!
16 }
17
18 .
19 .
20 .

ps:默认情况下,初始化之后GPIOTE是失能的。因此,必须有一个user调用app_gpiote_user_enable来使能GPIOTE。

  

下面是一个用户注册的引脚状态变化事件的回调函数:

 1 // GPIOTE event handler.
 2 void example_gpiote_event_handler (uint32_t event_pins_low_to_high, uint32_t event_pins_high_to_low)
 3 {
 4     .
 5     .
 6     .
 7     if (event_pins_low_to_high & 0x00000001)
 8     {
 9         // GPIO pin 0 transitioned from low to high.
10         // Take necessary action.
11     }
12     if (event_pins_high_to_low & 0x00000004)
13     {
14         // GPIO pin 2 transitioned from high to low.
15         // Take necessary action.
16     }
17
18     .
19     .
20     .
21 }

4、Enable/Disable GPIOTE

  一个注册过的user能够在任何时间失能或使能GPIOTE模块。当GPIOTE失能时事件将不能被接收,初始化之后GPIOTE默认是失能的。下面例子展示失能或使能GPIOTE模块:

 1 uint32_t retval;
 2
 3 // Enable notifications for example user module which is already registered.
 4 retval = app_gpiote_user_disable(m_example_user_id);
 5 if (retval != NRF_SUCCESS)
 6 {
 7     // Enabling notifications failed. Take corrective/needed action.
 8     .
 9     .
10 }
11
12  .
13  .
14  .
15 // Enable notifications for example user module which is already registered.
16 retval = app_gpiote_user_enable(m_example_user_id);
17 if (retval != NRF_SUCCESS)
18 {
19     // Enabling notifications failed. Take corrective/needed action.
20     .
21     .
22 }

5、Reading GPIOTE State

  一个注册过的user能够通过读取状态信息获取GPIOs的当前状态。

 1 uint32_t retval;
 2 uint32_t gpio_pin_state;
 3
 4 retval = app_gpiote_pins_state_get(m_example_user_id,&gpio_pin_state);
 5 if (retval != NRF_SUCCESS)
 6 {
 7     // Failed to read state information. Take corrective action.
 8 }else{
 9     .
10     .
11     if (gpio_pins_state & 0x00000006) // Checks if pin one and two are set
12     {
13         // Take necessary action
14     }
15     .
16     .
17 }

历史关联文章

[nRF51822] 3、 新年也来个总结——图解nRF51 SDK中的Button handling library和FIFO library

[nRF51822] 4、 图解nRF51 SDK中的Schedule handling library 和Timer library

@beautifulzzzz 2016-01-01 continue~ 

时间: 2024-08-05 07:07:53

[nRF51822] 5、 霸屏了——详解nRF51 SDK中的GPIOTE(从GPIO电平变化到产生中断事件的流程详解)的相关文章

[nRF51822] 3、 新年也来个总结——图解nRF51 SDK中的Button handling library和FIFO library

:本篇是我翻译并加入自己理解的nRF51 SDK中按钮相关操作的库和先进先出队列库.虽然是nRF51的SDK,但是通过此文你将更多地了解到在BSP(板级支持)上层嵌入式程序或OS的构建方法. 1.按钮相关操作库 按键管理程序是通过GPIO事务和事件管理程序来检测一个按钮是否被按下的.当然,其中也做了消抖的工作——在GPIOTE事件中启动一个定时器用来延时一段时间,当该定时器失效后如果按钮仍然处于按下状态,则会产生一个按钮事件.如果在延时的过程中又有一个新的GPIOTE,那么这个定时器会重新被启动

吐血分享:QQ群霸屏技术教程(接单篇)

在文章<QQ群霸屏技术教程(利润篇)>中,阿力推推提及到QQ群霸屏技术变现的方式,稍显粗略,这里详尽介绍下(老鸟漂过). 资本 资本之上,才谈得上接单,没技能,接个毛线. 1擅长点. 建议从擅长的点上扩展,深挖更有效,不一定非要涉猎QQ群. 我去,你让我看你QQ群系列文章,而不接QQ群单子,干啥,调戏我呀.少侠,老夫不敢,不接QQ群单,了解下这个逻辑,还是有益的. 任何游戏规则,核心思路都差不多,表现路径和方式套路不同罢了. 于QQ群,别人能上排名,你不能上,勿怪平台,不断打磨吧. 2资源号.

吐血分享:QQ群霸屏技术教程之霸屏实施细则

小号,再不养,成本抗不住了;QQ群,再不玩,真的就玩不动啦. 霸屏系列,坚持下来差不多10来篇,最近更新的几篇,算是霸屏系列的更新版,毕竟相当的规则变动了. 经营自己,是一种前瞻能力,霸屏十篇,有多少执行? 霸屏思维 剖析自己,每个人适合的群类型,是不一样的.只有对应了,效果才会持续. 兴趣:游戏.影视.娱乐.动漫等 交流:童鞋.亲友.同事.办公等 行业:金融(股票.银行.证券.外汇等).it(开发.优化.策划.建站.平面.广告等).传统(搬家.家政等). 在<QQ群霸屏技术教程(接单篇)>中

吐血分享:QQ群霸屏技术教程(利润篇)

QQ群技术,不论日进几百,空隙时间多的可以尝试,日进100问题不大. QQ群技术,如何赚钱,能赚多少钱?不同行业,不同关键词,不同力度,不一样的产出. 群费 群费,这个和付费群是有区别的,群费在手机端显示. QQ群费,这个常见于一些兴趣群.同城群之类的,等同于份子钱,比如聚个会,结伴游啥的. 1.手机端,以群主的身份点开自己的群. 2.点击右上角的群成员图标. 3.点击更多,进入群应用,找到群费. 4.点击发布群费,设置金额. 5.群费发布后,会显示到QQ群中,这个操作只有群主可以做. 群费,这

Android菜单详解——理解android中的Menu

Android菜单详解--理解android中的Menu 前言 今天看了pro android 3中menu这一章,对Android的整个menu体系有了进一步的了解,故整理下笔记与大家分享. PS:强烈推荐<Pro Android 3>,是我至今为止看到的最好的一本android书,中文版出到<精通Android 2>. 理解Android的菜单 菜单是许多应用程序不可或缺的一部分,Android中更是如此,所有搭载Android系统的手机甚至都要有一个"Menu&qu

吐血分享:QQ群霸屏技术教程2017(问题篇)

霸屏技术,问题篇后,暂时搁置,尔望后续. 这里针对操作中,经常遇到的问题,做个简单整理. 回忆下,排名流程. 1.建群,品牌产品群,做任何关键词都是品牌产品群,皆因其有独特的优势. 2.拉人,填充群人数. 3.优化,关键词细节处理好. 4.解散,拉人的后置问题,解散,然后恢复,恢复后群介绍是空白的,2个小时后,完善好资料,再隔5个小时,重新用定位软件,整体的把群(介绍.名称.位置.分类)修改一遍. 排名,其后就坐等排名,80%的行业这个方式就可以做上首页. 5.竞争度的原因,可能排不上来,这个时

方别《QQ群霸屏技术》,又见《QQ群建群细则》

规则,时刻变动;QQ群系列,咱们再来一轮. QQ群霸屏技术,你说建群貌似很菜,大家仿佛都知道,其实只知其一不知其二. QQ群类别 群分类,常规的就以下几种. 普通群. 建群随意,偏个性化,一言不合就拉人进群,营销的话大多分类会选择品牌产品,这个是霸屏系列的核心推荐. 普通群,是前期笔者对霸屏系列常规的基础打法,规则背后,咱慢慢完善. 同城群. 三类:私密群.同城群.兴趣群. 同城群会被推荐,但是如果没运营,后续不会被推荐.隔三差五的互动,市场的打理,是必须的. 2.1.推荐 群地点附近,附近的群

unity3d-配置Android环境,打包发布Apk流程详解

31:unity3d-配置Android环境,打包发布Apk流程详解 作者 阿西纳尼 关注 2016.08.28 22:52 字数 498 阅读 1806评论 0喜欢 5 Unity配置Android环境,打包发布安卓流程 一:SDK与JDK下载地址:http://pan.baidu.com/s/1mhVaXHe下载完成后,解压文件 SDK文件 二.安装 JDK 运行安装程序jdk-7u67-windows-x64 Java-JDK 分别点击下一步进行安装. 安装中 在安装过程中先后会出现两次选

CentOS 5,6 系统启动流程详解

一.linux 组成介绍 1.linux 组成: Linux: kernel+rootfs(根文件系统) kernel: 进程管理.内存管理.网络管理.驱动程序.文件系统.安全功能 rootfs: 程序和glibc 库:函数集合, function, 调用接口(头文件负责描述) 过程调用: procedure,无返回值 函数调用: function 程序:二进制执行文件 2.内核设计流派: 单内核(monolithic kernel): Linux 把所有功能集成于同一个程序 微内核(micro