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)状态会翻转一次。

时间: 2024-11-05 19:03:55

nRF51822外设应用[2]:GPIOTE的应用-按键检测的相关文章

第12章 GPIO输入-按键检测—零死角玩转STM32-F429系列

第12章 ????GPIO输入-按键检测 全套200集视频教程和1000页PDF教程请到秉火论坛下载:www.firebbs.cn 野火视频教程优酷观看网址:http://i.youku.com/firege ? 本章参考资料:<STM32F4xx参考手册>.库帮助文档<stm32f4xx_dsp_stdperiph_lib_um.chm>. 按键检测使用到GPIO外设的基本输入功能,本章中不再赘述GPIO外设的概念,如您忘记了,可重读前面"GPIO框图剖析"小

第12章 GPIO输入—按键检测

第12章     GPIO输入-按键检测 全套200集视频教程和1000页PDF教程请到秉火论坛下载:www.firebbs.cn 野火视频教程优酷观看网址:http://i.youku.com/firege 本章参考资料:<STM32F4xx参考手册>.库帮助文档<stm32f4xx_dsp_stdperiph_lib_um.chm>. 按键检测使用到GPIO外设的基本输入功能,本章中不再赘述GPIO外设的概念,如您忘记了,可重读前面"GPIO框图剖析"小节,

GPIO输入——按键检测

当按下一个按键时,系统是如何检测到的呢? 我们通过LED灯的亮灭状态来间接完成按键检测.当按下按键时,LED灯亮,再次按下时,LED灯灭. 要完成这个实验,我们就会用到GPIO外设的基本输入功能. 查阅开发板的按键原理图,如图3-1. 图3-1 图中的K1.K2即为按键.以K1为例,当未按下按键时,其PA0引脚处于接地状态,即低电平,按下按键时,引脚接到电源,输入状态为高电平.所以只要我们检测按键对应引脚(这里是PA0)的输入电平状态,即可判断按键是否被按下.这便是按键的检测原理了. 有一点需要

第13章 GPIO输入—按键检测

本章参考资料:<STM32F76xxx参考手册>.库帮助文档<STM32F779xx_User_Manual.chm>. 按键检测使用到GPIO外设的基本输入功能,本章中不再赘述GPIO外设的概念,如您忘记了,可重读前面"GPIO框图剖析"小节,STM32 HAL库中GPIO初始化结构体GPIO_TypeDef的定义与"定义引脚模式的枚举类型"小节中讲解的相同. 13.1  硬件设计 按键机械触点断开.闭合时,由于触点的弹性作用,按键开关不会

nRF5芯片外设GPIO和GPIOTE介绍

nRF51/nRF52同时包含GPIO和GPIOTE两种外设,经常有人将两者搞混,今天我们就来介绍一下这2种外设有什么不同,及使用注意事项. GPIO和GPIOTE都属于芯片外设,但两者功能完全不一样,使用过程中不要将两者混淆.GPIO就大家通常理解的普通IO口,用来对IO口进行读写等操作.因此,如果你需要读某个IO口状态,或者将某个IO口置1,那么请使用nrf_gpio.h里面的API,比如 nrf_gpio_cfg_input用来将IO设为输入模式 nrf_gpio_pin_set用来输出1

按键检测程序应&quot;等待按键释放&quot;

按键S4是下拉,S1.S2.S3为上拉.一定要等待按键释放,否则按一次S1可能会运行key_scan()函数好几次. 1 /******************************************************************************* 2 * Function Name : key_scan 3 * Description : 按键扫描.优先级S4>S0>S1>S2.一定要等待按键释放 4 * Input : None 5 * Output

按键检测

1 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> 2 <HTML> 3 <HEAD> 4 <TITLE>js 按键记录</TITLE> 5 </HEAD> 6 <BODY> 7 <script type="text/javascript"> 8 var keystring = "&q

单片机第6课:独立按键检测原理

将JP5的8号引脚连接到单片机的P1^0,然后P1^0和发光二极管的接正引脚相连接(加高电平,发光二极管就会亮,由于单片机上电的时候各IO口默认为高电平,所以导线接好之后,发光二极管就点亮了).当我们按下K1的时候,发光二极管熄灭,松开按键,发光二极管再次点亮.因为当你按下按键的时候,TTL电路只有两种电平的时候,呈现"线与"的关系,再次检测P1^0引脚的电平,你会发现已经是低电平了.因为高电平与上低电平等于低电平.

GPIO 输入—按键检测

这里要用到一定的模电知识.电容两端电压不能突变,电感两端电流不能突变.这里利用了电容的放电延时实现硬件消抖.按键按下会有抖动,波形有毛刺,使得高低电平显现不明显,而按键按下时,电容放电一下,马上又被充电,此时电容两端的电压不会突然变化,这个延时时间恰好可以达到消抖作用. 这里需要使用一个固件库函数: /** * @brief Reads the specified input port pin. * @param GPIOx: where x can be (A..K) to select th