zoukankan      html  css  js  c++  java
  • 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-masterpca10028 arm5\_build”目录下的 GPIOTE_BUTTON.hex)。点击“Program”下载程序。

    3.3.2 实验现象

      分别按下S1~S4按键,每按一次,对应的指示灯(D1~D4)状态会翻转一次。

    版权声明:本文为博主原创文章,转载请注明作者和出处。 作者:强光手电[艾克姆科技-无线事业部]
  • 相关阅读:
    HashMap按键排序和按值排序
    LeetCode 91. Decode Ways
    LeetCode 459. Repeated Substring Pattern
    JVM
    LeetCode 385. Mini Parse
    LeetCode 319. Bulb Switcher
    LeetCode 343. Integer Break
    LeetCode 397. Integer Replacement
    LeetCode 3. Longest Substring Without Repeating Characters
    linux-网络数据包抓取-tcpdump
  • 原文地址:https://www.cnblogs.com/aikm/p/5063039.html
Copyright © 2011-2022 走看看