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

    版权声明:本文为博主原创文章,转载请注明作者和出处。 作者:强光手电[艾克姆科技-无线事业部]
  • 相关阅读:
    PHP函数CURL分别以GET、POST方式请求HTTPS协议接口api
    【开发必备】2018最新中国国内可用API合集
    天天动听API
    网易音乐API
    测开之数据类型第3篇《列表推导式、字典推导式、2种方式创建生成器》
    数据类型第2篇「字典和集合的原理和应用」
    测开入门篇《环境管理、编码规范、项目结构》
    App自动化《元素定位方式、元素操作、混合应用、分层设计、代码方式执行Pytest 命令》
    我膨胀了,测试必要商城小程序,用了3种方式!:)
    Appium之测试微信小程序
  • 原文地址:https://www.cnblogs.com/aikm/p/5063039.html
Copyright © 2020-2023  润新知