nRF5芯片外设GPIO和GPIOTE介绍
nRF51/nRF52同时包含GPIO和GPIOTE两种外设,经常有人将两者搞混,今天我们就来介绍一下这2种外设有什么不同,及使用注意事项。
GPIO
GPIO和GPIOTE都属于芯片外设,但两者功能完全不一样,使用过程中不要将两者混淆。GPIO就是大家通常理解的普通IO口,用来对IO口进行读写等操作。因此,如果你需要读某个IO口状态,或者将某个IO口置1,那么请使用nrf_gpio.h里面的API,比如
nrf_gpio_cfg_input用来将IO口设为输入模式 nrf_gpio_pin_set用来输出1到IO口
Nordic GPIO口输入模式可以配置为没有pull,有上拉电阻,有下拉电阻,悬浮等4种状态。GPIO输出模式下驱动力灵活可配,可以配置为普通驱动力(2mA),高驱动力(10mA),甚至断开状态(跟开漏输出很像)。
除此之外,Nordic GPIO模块还有两个非常重要的功能:
- sense功能。当系统进入sleep模式(也称system OFF模式),只能通过IO口等特殊唤醒源来唤醒并产生复位。当某个IO口使能了sense功能,那么它就可以用来唤醒sleep模式了。Sense使能的时候,可以配置成高电平唤醒或者低电平唤醒。一般使用nrf_gpio_cfg_sense_input这个函数来使能IO口的sense功能。
- detect功能。Detect功能是sense功能的进一步扩展,sense除了可以唤醒sleep模式,还可以用来产生中断,即detect功能。你可以把DETECT看成一个中断标志位,这个中断标志位是由每一个端口所有IO口进行或操作的结果,所以DETECT信号状态直接跟随外部IO口状态,只要有一个外部IO口有效,那么DETECT信号就一直为高,只有所有外部IO口状态都无效时,DETECT信号才会重新变成低。
GPIOTE
GPIOTE,全称GPIO Tasks and Events,GPIOTE首先是一个外设模块,因此它遵守芯片外设最基本规则:每一个时刻每一个GPIO口只能被一个外设使用,因此当某一个IO口被用做GPIOTE了,那么它就不能再作为普通GPIO来使用了,也就是上面提到的GPIO API将变得无效,此时必须使用nrf_drv_gpiote.h里面的API。Nordic将状态机引入到每一个外设,也就是说,每一个外设都有自己的输入(task),输出(event)和状态。GPIOTE的作用就是让GPIO也具有task和event的功能,也就是说,对GPIOTE来说,将某一个IO口置1,其实是触发TASKS_SET;检测某一个IO口上升沿,其实是等待EVENTS_IN。让IO口支持task和event机制,将为后面的PPI自动化操作打下基础,关于PPI详细说明,请参考“如何理解nRF5芯片外设PPI”。
GPIO模块只能用来操作IO口输入和输出,如果需要处理IO口中断,则必须通过GPIOTE模块来做,GPIOTE支持两种类型中断:高精度的EVENTS_IN中断以及低精度的EVENTS_PORT中断。
- IN event中断。EVENTS_IN用来检测沿,即上升沿,下降沿或者双沿。IN Event工作时要求打开高频时钟,所以功耗高,但是它的精度也高,可以检测非常快的脉冲信号。
- Port event 中断。EVENTS_PORT用来检测IO口低电平或者高电平。Port event中断虽然属于GPIOTE模块,但Port event的产生却完全取决于GPIO模块的DETECT信号,DETECT每产生一次上升沿生成一次Port event中断。如前所述,DETECT信号是所有IO口相或的结果(832是32个IO口,840是48个IO口),只要其中某一个IO有效,DETECT信号就一直为高,这里容易产生一个副作用:但一个IO口产生Port event中断后,它还保持有效,那么这个时候DETECT信号就一直为高,此时如果另一个IO口从无效变成有效(产生中断),由于DETECT信号已经为高电平,所以这个IO口的中断将被忽略。为此,在处理port event中断的时候,nRF5 SDK app_button模块将每个port event的极性设为toggle,也就是每进入一次port event handler,nRF5 SDK都会把DETECT的极性翻转一次,比如将检测为高有效变成检测为低有效,这就相当于将DETECT信号清0了,这样一旦外部有第2个IO口产生中断,DETECT将再次由低变高,从而再次生成一次Port event中断。Port event特性不需要任何时钟维持,所以它的功耗非常的低,几乎可以忽略不计。如果应用逻辑允许,强烈推荐使用port event处理IO口中断。
EVENTS_IN和EVENTS_PORT两种IO口中断初始化区别如下所示:
nrf_drv_gpiote_in_config_t config = GPIOTE_CONFIG_IN_SENSE_TOGGLE(false); //false表示低精度低功耗的Port event中断,每个IO口都可以作为port event中断输入口
err_code = nrf_drv_gpiote_in_init(pin_no, &config, gpiote_event_handler); nrf_drv_gpiote_in_config_t config = GPIOTE_CONFIG_IN_SENSE_TOGGLE(true); //true表示高精度高功耗的IN event中断,52832/840总共有8个IN event中断。注:这里检测的是双沿
err_code = nrf_drv_gpiote_in_init(pin_no, &config, gpiote_event_handler);
IN event中断需要高频时钟,所以功耗比较高,在精度可以接受的情况下,优先推荐使用port event中断。
SDK自带GPIOTE应用例程,感兴趣的读者请参考Keil5工程:SDK安装目录\examples\peripheral\gpiote\pca10040\blank\arm5_no_packs
SDK也自带Sense例子,有兴趣的读者请参考Keil5工程:SDK安装目录\examples\peripheral\ram_retention\pca10040\blank\arm5_no_packs
关于Port event中断使用例子,可以参考Nordic的app_button模块,比如ble_app_hrs就会用到这个模块,大家可以去看一下app_button是如何使用port event中断的。
nRF5芯片外设GPIO和GPIOTE介绍的更多相关文章
- 如何理解nRF5芯片外设PPI
PPI,英文全称Programmable Peripheral Interconnect,是Nordic独有的外设,其设计目的是让CPU处于idle模式下外设与外设之间也能完成相应通信,从而降低系统功 ...
- NRF51822之GPIOTE介绍
Note This library is obsolete and should not be used in new designs. Instead, you should use GPIOTE ...
- Nordic nRF5 SDK和softdevice介绍
SDK和Softdevice的区别是什么?怎么选择SDK和softdevice版本?芯片,SDK和softdevice有没有版本兼容问题?怎么理解SDK目录结构?SDK帮助文档在哪里?Softdevi ...
- 三星DRAM+NAND FLASH 合成MCP芯片介绍及应用攻略
转自:http://blog.csdn.net/gao5528/article/details/6256119 三星DRAM+NAND FLASH 合成MCP芯片介绍及应用攻略(K5系列产品篇) 一年 ...
- uboot的GPIO驱动分析--基于全志的A10芯片【转】
本文转载自:http://blog.csdn.net/lw2011cg/article/details/68954707 uboot的GPIO驱动分析--基于全志的A10芯片 转载至:http://b ...
- STM32入门系列-GPIO概念介绍
GPIO(general purpose intput output)是通用输入输出端口的简称,可以通过软件来控制其输入和输出.STM32 芯片的 GPIO 引脚与外部设备连接起来,从而实现与外部通讯 ...
- STM32F3 GPIO的八种模式及工作原理
一.GPIO简介 GPIO(英语:General-purpose input/output),通用型之输入输出的简称,简单来说就是STM32可控制的引脚,STM32芯片的GPIO引脚与外部设备连接起来 ...
- 痞子衡嵌入式:聊聊i.MXRT1170双核下不同GPIO组的访问以及中断设计
大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是i.MXRT1170双核下不同GPIO组的访问以及中断设计. 在双核 i.MXRT1170 下设计应用程序,有一个比较重要的考虑点就是外 ...
- GPIO裸机编程
作者:李老师,华清远见嵌入式学院讲师. GPIO控制技术是接口技术中最简单的一种.本章通过介绍S5PV210芯片的GPIO控制方法,让读者初步掌握控制硬件接口的方法.本章的主要内容: GPIO功能介绍 ...
随机推荐
- ALV tree标准DEMO
BCALV_TREE_01 ALV 树控制:构建层次树 BCALV_TREE_02 ALV 树控制:事件处理 BCALV_TREE_03 ALV 树控制:使用自己的上下文菜单 BCALV_TREE_0 ...
- shiro的/favicon.ico问题
登录成功之后跳转/favicon.ico问题. 1.spring-shrio.xml里面配置加上 /favicon.ico = anon 2.web.xml中配置中加上: <mime-mappi ...
- beego——发行部署
开发模式 通过bee创建的项目,beego默认情况下是开发模式. 我们可以通过如下的方式改变我们的模式: beego.RunMode = "prod" 或者我们在conf/app. ...
- Word 中将正文中的参考文件标号链接到参考文献具体条目
一.概论 在论文撰写过程中,不可避免地引用到参考文献.通常,论文格式要求我们在引用的正文后,使用中括号将参考文献章节中对应的出处条目序号引起来,例如: 有时,我们要建立起这两者之间的链接关系. 二.设 ...
- hust1010 The Minimum Length
地址:http://acm.hust.edu.cn/problem/show/1010 题目: 1010 - The Minimum Length Time Limit: 1s Memory Limi ...
- UVA - 12298 Super Poker II (FFT+母函数)
题意:有四种花色的牌,每种花色的牌中只能使用数值的约数个数大于2的牌.现在遗失了c张牌.每种花色选一张,求值在区间[a,b]的每个数值的选择方法有多少. 分析:约数个数大于2,即合数.所以先预处理出5 ...
- iOS开发之AFNetworking网络编程
众所周知,苹果搞的一套框架NSContention发送请求与接收请求的方式十分繁琐.操作起来很不方便.不仅要做区分各种请求设置各种不同的参数,而且还要经常在多线程里操作,同时还要对请求与返回的数据做各 ...
- CentOS 6.3编译安装LAMP环境笔记
转载地址:http://www.jb51.net/article/54969.htm 最近抽空在虚拟机上测试成功了LAMP各个最新版本的整合编译安装,算是把之前的博文整合精简,以下内容均在CENTOS ...
- python---自动群发邮件
生活中我们经常发送邮件,那么我们能不能用Python写一个自动发送邮件的功能呢?答案是肯定的!!! 开始实现功能之前我们需要开启我们邮箱的 IMAP/SMTP功能,我们先了解一下什么是IMAP/SMT ...
- Swift开发之泛型实例
一.Swift泛型 泛型能够让开发者编写自定义需求已经任意类型的灵活可用的的函数和类型.能够让我们避免重复的代码.用一种清晰和抽象的方式来表达代码的意图. func swapTwoStrings(_ ...