前言
nRF5X系列芯片引入了TASK和EVENT这2个全新的概念。
TASK,可以理解为DMA,但DMA更侧重数据传输,而TAST则是预定功能的触发操作:
可以理解为执行某个特定任务的一段代码的集合,但不需要CPU参与。比如nRF5X中有一个很常用的TASK---TOGGLE。TOGGLE我们暂时翻译为”翻转”,它的功能就是在指定的引脚,把输出的电平翻转一次。比如当前引脚的电平为”高”,执行完TOOGLE这个任务以后,引脚的电平会变为”低”。而假如使用传统的51或者PIC单片机来实现翻转电平的功能,则需要执行以下3个步骤:
- 读取当前引脚的电平
- 异或取反电平
- 输出取反的电平
比较下来,是不是觉得使用TASK很方便,同时效率也很高?你只需启动这个TASK,硬件自动帮你执行后续的操作。
EVENT:
可以简单地理解为类似中断一样的东西,当指定引脚检测到指定的电平变化或者指定的电平,会产生一个EVENT,通知CPU。
- 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包括:
- SET(输出高电平)
- CLEAR(输出低电平)
- TOGGLE(取反)
GPIOTE可以产生的EVENTS包括:
- RISING EDGE(上升沿)
- FAILLING EDGE(下降沿)
- ANY CHANGE(电平的变化)
本节我们将用GPIOTE实现按键点灯操作,通过操作按键来实现LED灯的亮灭控制,只需要配置好功能代码即可。
示例详解
基于硬件平台: nrf51822ek_tm开发板。
本示例所用的最小系统板原理图:
-
-
工程创建:
- 打开KEIL,新建一个空工程:Project->New uVision Project
-
工程创建:
工程名为nrfxx-gpiote确认后按下图选择芯片为nrf51822_xxAA->ok
在弹出的对话框中勾选CMSIS中的CORE;Device中的Startup(后面有nrf51 Series字样的);在nrf_device中勾选nrf_gpio, nrf_gpiote,nrf_delay.
OK之后工程自动生成如下代码:
新建一个空白文档,保存为main.c,并加入工程中:
-
-
工程代码
- OK之后在man.c中加入如下代码:
-
工程代码
配置工程,选择使用MicroLIB库,可以减小程序体积:
加入NRF51定义,并选择化等级3,可以减小程序体积,但仿真运行时可能会出现与代码顺序不一致现象:
调试工具选择J-LINK,并将接口设置为SW口勾选下载程序后自动复位及运行:
-
- 编译工程,仿真调试-》全速运行并在GPIOTE_IRQHandler中放入一个断点:
按下按键,程序成功进入到中断函数中:
清除所有断点,继续按按键发现可以实现用按键触发LED亮灭操作了,是不是很简单呢!!当然这里只是个示例,实际实验过的朋友会发现上面这种处理方式感觉LED并不受控,有时按一下会翻转,有时测不会,这是因为机械按键抖动引起的,大家可以加入一些防抖操作即可解决。
OK,本期实验完成!下期见!同时如果大家有什么疑问或是有想了解的其它内容,也欢迎大家留言!!最后喜欢这个公众号的同学们记得加关注了,会有不定期技术干货推出!!
文中源码资料下载,在公众号里给十三发消息:
下载|一起学nRF51xx 3
关注十三公众号