前言

nRF5X系列芯片引入了TASK和EVENT这2个全新的概念。

 

TASK,可以理解为DMA,但DMA更侧重数据传输,而TAST则是预定功能的触发操作:

可以理解为执行某个特定任务的一段代码的集合,但不需要CPU参与。比如nRF5X中有一个很常用的TASK---TOGGLE。TOGGLE我们暂时翻译为”翻转”,它的功能就是在指定的引脚,把输出的电平翻转一次。比如当前引脚的电平为”高”,执行完TOOGLE这个任务以后,引脚的电平会变为”低”。而假如使用传统的51或者PIC单片机来实现翻转电平的功能,则需要执行以下3个步骤:

  1. 读取当前引脚的电平
  2. 异或取反电平
  3. 输出取反的电平

    比较下来,是不是觉得使用TASK很方便,同时效率也很高?你只需启动这个TASK,硬件自动帮你执行后续的操作。

 

EVENT:

   可以简单地理解为类似中断一样的东西,当指定引脚检测到指定的电平变化或者指定的电平,会产生一个EVENT,通知CPU。

 

  1. GPIOTE

GPIOTE为GPIO TASKS AND EVENTS的缩写,它是NRF5X芯片集成的一个独立的功能模块。GPIOTE有4个通道,GPIO中的任何一个引脚都可以使用这4个通道中的一个。

 

有了这个功能模块GPIO就可以使用GPIOTE里面TASK和EVENT的功能。要提醒一下,当GPIO使用了GPIOTE模块以后,GPIO中用来管理输出输入的OUT、IN寄存器将失效,此时只能通过GPIOTE模块里面的OUT TASK和IN EVENT来输出或者获取引脚的输入电平 。只有当GPIOTE功能禁止掉,我们才可以像使用普通的GPIO一样使用它。我们可以启动TASK,输出想要的电平;也可以使能EVENT,当引脚上有我们想要的电平的时候,通过EVENT获取通知。关于OUT、IN寄存器的介绍请参考上一节的内容。当GPIO引脚使能了TASK,那么该引脚将会被设置为输出模式;当GPIO引脚使能了EVENT,那么该引脚将会被设置为输入模式。假如在使能GPIOTE之前执行过GPIO的配置,这些配置将会被忽略。

 

GPIOTE模块提供的TASKS包括:

 

  1. SET(输出高电平)
  1. CLEAR(输出低电平)
  2. TOGGLE(取反)

 

   GPIOTE可以产生的EVENTS包括:

 

  1. RISING EDGE(上升沿)
  2. FAILLING EDGE(下降沿)
  3. ANY CHANGE(电平的变化)

 

本节我们将用GPIOTE实现按键点灯操作,通过操作按键来实现LED灯的亮灭控制,只需要配置好功能代码即可。

示例详解

基于硬件平台: nrf51822ek_tm开发板。

 

一起学nRF51xx 3 -  gpiote

 

本示例所用的最小系统板原理图:

一起学nRF51xx 3 -  gpiote

 

 

    1. 工程创建:
      1. 打开KEIL,新建一个空工程:Project->New uVision Project

一起学nRF51xx 3 -  gpiote

工程名为nrfxx-gpiote确认后按下图选择芯片为nrf51822_xxAA->ok

一起学nRF51xx 3 -  gpiote

在弹出的对话框中勾选CMSIS中的CORE;Device中的Startup(后面有nrf51 Series字样的);在nrf_device中勾选nrf_gpio, nrf_gpiote,nrf_delay.

 

一起学nRF51xx 3 -  gpiote

一起学nRF51xx 3 -  gpiote

OK之后工程自动生成如下代码:

一起学nRF51xx 3 -  gpiote

新建一个空白文档,保存为main.c,并加入工程中:

一起学nRF51xx 3 -  gpiote

一起学nRF51xx 3 -  gpiote

一起学nRF51xx 3 -  gpiote

一起学nRF51xx 3 -  gpiote

 

 

    1. 工程代码
      1. OK之后在man.c中加入如下代码:

一起学nRF51xx 3 -  gpiote配置工程,选择使用MicroLIB库,可以减小程序体积:

一起学nRF51xx 3 -  gpiote

加入NRF51定义,并选择化等级3,可以减小程序体积,但仿真运行时可能会出现与代码顺序不一致现象:

 

一起学nRF51xx 3 -  gpiote

调试工具选择J-LINK,并将接口设置为SW口勾选下载程序后自动复位及运行:

 

一起学nRF51xx 3 -  gpiote

一起学nRF51xx 3 -  gpiote

一起学nRF51xx 3 -  gpiote

    1. 编译工程,仿真调试-》全速运行并在GPIOTE_IRQHandler中放入一个断点:

 

一起学nRF51xx 3 -  gpiote按下按键,程序成功进入到中断函数中:

一起学nRF51xx 3 -  gpiote

清除所有断点,继续按按键发现可以实现用按键触发LED亮灭操作了,是不是很简单呢!!当然这里只是个示例,实际实验过的朋友会发现上面这种处理方式感觉LED并不受控,有时按一下会翻转,有时测不会,这是因为机械按键抖动引起的,大家可以加入一些防抖操作即可解决。

OK,本期实验完成!下期见!同时如果大家有什么疑问或是有想了解的其它内容,也欢迎大家留言!!最后喜欢这个公众号的同学们记得加关注了,会有不定期技术干货推出!!

文中源码资料下载,在公众号里给十三发消息:

下载|一起学nRF51xx 3

一起学nRF51xx 3 -  gpiote

 

关注十三公众号

一起学nRF51xx 3 -  gpiote

 

相关文章:

  • 2022-02-24
  • 2021-08-31
  • 2022-12-23
  • 2022-12-23
  • 2022-01-15
  • 2021-11-06
  • 2022-01-12
  • 2022-12-23
猜你喜欢
  • 2021-11-18
  • 2021-06-14
  • 2022-12-23
  • 2021-10-28
  • 2022-12-23
  • 2022-12-23
  • 2021-10-30
相关资源
相似解决方案