nRF51822外设应用[2]:GPIOTE的应用-按键检测
版权声明:本文为博主原创文章,转载请注明作者和出处。 作者:强光手电[艾克姆科技-无线事业部]
1. nRF51822寄存器类型
nRF51822的寄存器和一般的单片机有所差别,nRF51822的寄存器分为下面的三种类型。
- Task :任务寄存器,可以由程序或事件触发。
- Event:事件寄存器,事件可以产生中断或触发任务。
- Register:普通寄存器,和一般单片机的寄存器一样。
Task和event使得操作片上外设十分方便简洁,只需进行少量的配置,即可轻松运用各种外设。同时,Task和event能有效减少CPU的占用时间,降低CPU的负荷。
Task和Event更多的是用来和PPI(可编程外设互连)配合使用,通过PPI 将某个Event和Task连接起来,连接后,该Event即可触发对应的Task执行相应的功能。
示例:实现每隔1S翻转一次指示灯的状态。
- 一般的做法:配置定时器定时时间为1S,每秒产生一次中断,在中断服务程序中通过软件操作翻转指示灯的状态。在这个过程中,必须要通过软件操作才能实现。
- 通过Task和Event实现:配置定时器的相关参数,配置GPIOTE的Task为翻转管脚状态,配置PPI的一个通道用于连接定时器的匹配事件和GPIOTE的Task。这样,当定时器产生匹配事件时,会自动触发GPIOTE的Task,在无需任何软件干预的情况下实现指示灯状态的翻转。
2. GPIOTE(GPIO Tasks and Events)
2.1 功能描述
nRF51822在GPIO的基础上引入了任务和事件(GPIOTE)的概念,nRF51822的GPIOTE共有4个通道,每个通道都可以选择一个管脚,选择的管脚可以配置为Task mode或Event mode。需要注意的是:不能将某个管脚同时分配给多个GPIOTE通道,否则会导致无法预料的错误。
GPIOTE通道的Task可以用来执行以下写操作:
- 置位。
- 清除。
- 翻转。
事件可以由以下的输入状态产生:
- 上升沿。
- 下降沿。
- 任意电平跳变。
2.1.1 管脚Tasks和Events
Tasks和Events通过CONFIG[n](n=0~3)配置,每个CONFIG[n]寄存器对应一组OUT[n] 任务寄存器和IN[n]事件寄存器。OUT[n]用于写管脚,IN[n]由管脚状态变化触发。
当把某个管脚分配给OUT[n]任务或IN[n]事件后,该管脚就只能被GPIOTE模块写操作,正常的GPIO写入无效。
一旦配置OUT[n]任务或IN[n]事件控制某个管脚,那么该管脚的输出值只能通过GPIOTE模块操作,使用GPIO的寄存器操作会被忽略。
当GPIOTE通道被配置用于操作一个任务管脚时,CONFIG[n]寄存器中的OUTINIT决定了该管脚脚的初始值。可以通过配置OUTINIT来设置管脚初始化状态为高电平或是低电平。
2.1.2 PORT事件
GPIOTE除了4个通道外,还包含一个PORT事件。PORT事件由使用GPIO DETECT信号的多个管脚触发,PORT中的任意一个管脚上的上升沿都会触发PORT事件。
可以设置一个或多个GPIO DETECT用来产生PORT事件,PORT事件可以作为唤醒源,也可以作为中断源产生中断。
3. 按键实验程序
本实验使用的程序是:nrf51-app-button-example-master。
3.1 运行环境
- 编译环境:MDK5。
- SDK版本:SDK 8.0.0
3.2 按键检测原理
程序中对按键的处理如下:通过GPIOTE的PORT事件来检测有无按键按下,当检查到按键按下时,启动定时器开始计时(程序中设置的位50ms),在定时器超时中断中若检测到该按键仍然为按下的状态,则认为这是一个有效的按键。在这里使用定时器(软件定时器)是为了消除按键抖动。

图1:按键检测和消抖
若在第一个按键检测流程没有处理完时(该按键的定时器还在运行),又有一个按键按下,这时,定时器会重新开始计时,如下图所示。

图2:多个按键处理
3.3 程序下载和验证
3.3.1 程序下载
本实验无需下载协议栈,如果开发板中已经下载了协议栈,需要通过nRF STUDIO进行擦除。
程序可以用nRFgo Studio下载,也可以在MDK中直接下载调试,在这里我们用nRFgo Studio下载。切换到“Program Application”选项卡。点击“Browse…”按钮打开应用程序的HEX文件(位于“…\ nrf51-app-button-example-master\pca10028 \arm5\_build”目录下的 GPIOTE_BUTTON.hex)。点击“Program”下载程序。
3.3.2 实验现象
分别按下S1~S4按键,每按一次,对应的指示灯(D1~D4)状态会翻转一次。
nRF51822外设应用[2]:GPIOTE的应用-按键检测的更多相关文章
- 第12章 GPIO输入—按键检测
第12章 GPIO输入—按键检测 全套200集视频教程和1000页PDF教程请到秉火论坛下载:www.firebbs.cn 野火视频教程优酷观看网址:http://i.youku.com/fi ...
- 第12章 GPIO输入-按键检测—零死角玩转STM32-F429系列
第12章 GPIO输入—按键检测 全套200集视频教程和1000页PDF教程请到秉火论坛下载:www.firebbs.cn 野火视频教程优酷观看网址:http://i.youku.com/fi ...
- 第13章 GPIO输入—按键检测
本章参考资料:<STM32F76xxx参考手册>.库帮助文档<STM32F779xx_User_Manual.chm>. 按键检测使用到GPIO外设的基本输入功能,本章中不再赘 ...
- 第33章 TIM—电容按键检测—零死角玩转STM32-F429系列
第33章 TIM—电容按键检测 全套200集视频教程和1000页PDF教程请到秉火论坛下载:www.firebbs.cn 野火视频教程优酷观看网址:http://i.youku.com/fir ...
- Atitit.android js 的键盘按键检测Back键Home键和Menu键事件
Atitit.android js 的键盘按键检测Back键Home键和Menu键事件 1. onKeyDown @Override public boolean onKeyDown(int keyC ...
- 【C语言】单片机上的按键检测框架
又好久没来写blog,最近在做项目发现之前写的stm32操作都忘了,还好做了个记录,回来看了下很多忘了的就又知道怎么做了. 下面是我之前写的一个按键检测的框架,适合比较多的按键操作,从信号接收.滤波. ...
- STM32f103按键检测程序实现长按短按
背景 只要使用单片机,按键检测基本上是一定要实现的功能.按键检测要好用,最重要的是实时和去抖.初学者往往会在主循环调用按键检测程序(实时)并利用延时去抖(准确).这种在主循环内延时的做法对整个程序非常 ...
- 按键检测GPIO输入
1. 项目 通过按键控制开关LED灯,按下按键灯亮,再按一下灯灭. 2. 代码 mian.c #include "stm32f10x.h" //相当于51单片机中的 #includ ...
- nRF5芯片外设GPIO和GPIOTE介绍
nRF51/nRF52同时包含GPIO和GPIOTE两种外设,经常有人将两者搞混,今天我们就来介绍一下这2种外设有什么不同,及使用注意事项. GPIO和GPIOTE都属于芯片外设,但两者功能完全不一样 ...
随机推荐
- 开启mysql远程访问
一.登陆mysql以后执行以下命令: GRANT ALL ON *.* TO username@'%' IDENTIFIED BY 'password' WITH GRANT OPTION; FLUS ...
- linux下静态库和动态库一些东西
http://www.cnblogs.com/changefuture/archive/2011/12/22/2297460.html Linux 动态链接库和静态库示例 文件预览 文件目录树如下, ...
- 【294】◀▶ Python 字符串说明
目录: 一.Python访问字符串中的值 二. Python 转义字符 三.Python 字符串运算符 参考:Python 字符串 一.Python访问字符串中的值 Python不支持单字符类型, ...
- C++——STL容器
序列式容器:vector,list,deque:stack,queue(容器适配器),heap,priority_queue,slist 关联式容器:(底层都是红黑树)set,map,multiset ...
- SpringBoot20 集成SpringSecurity02 -> 利用SpringSecurity进行前后端分离的登录验证
1 SpirngBoot环境搭建 创建一个SpringBoot项目即可,详情参见三少的相关博文 参考博文 -> 点击前往 SpirngBoot项目脚手架 -> 点击前往 2 引入Spirn ...
- Docker学习笔记_安装和使用mysql
一.系统环境和准备 1.宿主机OS:Win10 64位 2.虚拟机OS:Ubuntu18.04 3.操作账号:docker 二.安装 1.搜索mysql镜像:docker search mysql 2 ...
- webservice CXF 相关面试题
Web Service的优点(1) 可以让异构的程序相互访问(跨平台)(2) 松耦合(3) 基于标准协议(通用语言,允许其他程序访问) 1:WEB SERVICE名词解释.JSWDL开发包的介绍.JA ...
- NEERC17 J Journey from Petersburg to Moscow
CF上可以提交. 链接 依然是很妙的解法. 我们可以枚举每一个出现过的边权$L$,然后把所有边的边权减掉这个$L$,如果小于$L$就变为$0$,然后跑一遍最短路然后加上$k * L$更新答案即可. ...
- Codeforces 429B B. Working out
题目意思: 给n*m的矩阵,每个格子有个数,A从(1,1)出发只能向下或右走,终点为(n,m),B从(n,1)出发只能向上或右走,终点为(1,m).两个人的速度不一样,走到的格子可以获的该格子的数,两 ...
- javascript总结15:Break语句 与 continue语句
1 Break语句 解释:在循环体内,只要代码遇到break,程序立马结束当前循环. 当前循环指的是break语句所在的循环体. for (var i =1; i<10; i++){ if(i% ...