nRF5芯片外设GPIO和GPIOTE介绍

nRF51/nRF52同时包含GPIO和GPIOTE两种外设,经常有人将两者搞混,今天我们就来介绍一下这2种外设有什么不同,及使用注意事项。

GPIO和GPIOTE都属于芯片外设,但两者功能完全不一样,使用过程中不要将两者混淆。GPIO就大家通常理解的普通IO口,用来对IO口进行读写等操作。因此,如果你需要读某个IO口状态,或者将某个IO口置1,那么请使用nrf_gpio.h里面的API,比如

nrf_gpio_cfg_input用来将IO设为输入模式

nrf_gpio_pin_set用来输出1到IO

除此之外,GPIO模块还有两个非常重要的功能:

  • sense功能。当系统进入sleep模式(也称system OFF模式),只能通过IO口唤醒复位。当某个IO口使能了sense功能,那么它就可以用来唤醒sleep模式了。Sense使能的时候,可以配置高电平唤醒或者低电平唤醒。一般使用nrf_gpio_cfg_sense_input这个函数来使能IO口的sense功能。
  • port event功能。通俗来说,port event其实就是IO口中断,而且32个IO口共用同一个中断标志位:port event,检测port event只需要内部低频时钟在工作,因此功耗非常低:0.2微安左右,但内部低频时钟只能用来检测低精度的中断事件,也就是说IO口的中断脉冲要比较宽,比如像按键这种事件,就可以用port event来检测,功能达到了功耗又低,两全其美。这里特别说明一下,port event状态(一个中断flag)是跟随IO口电平的,比如检测高电平有效,那么只要IO口电平一直为高,那么port event一直有效,该中断标志位无法通过软件清除。这会产生两个副作用:一是不断进入port event中断例程,二是前面也提到,port event是被32个IO口共用的,因此只要其中一个IO口一直有效,别的IO产生的port event就会被忽略。为此,在处理port event中断的时候,nRF5 SDK app_button模块将每个port event的极性设为toggle,也就是每进入一次port event handler,nRF5 SDK都会把port event的极性翻转一次,比如将检测为高有效变成检测为低有效,这就相当于清除了port event中断flag,从而避开上述描述的两个副作用场景。由于GPIO模块不能处理中断,所以port event中断实际是交给GPIOTE模块来一起处理的。

GPIOTE,全称GPIO Tasks and Events,GPIOTE首先是一个外设模块,因此它遵守芯片外设最基本规则:每一个时刻每一个GPIO口只能被一个外设使用,因此当某一个IO口被用做GPIOTE了,那么它就不能再作为普通GPIO来使用了,也就是上面提到的GPIO API将变得无效,此时必须使用nrfx_gpiote.h(老版本为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”。

前面也提到过,处理IO口中断,必须通过GPIOTE模块来做,GPIOTE支持两种类型中断:高精度的EVENTS_IN中断以及低精度的EVENTS_PORT中断(就是前面GPIO章节提到的Port event)。EVENTS_PORT主要用来检测IO口高电平或者低电平,而EVENTS_IN用来检测沿,即上升沿,下降沿或者双沿。EVENTS_IN可以清0,EVENTS_PORT无法清0,两者都是在GPIOTE_irq_handler里面处理。EVENTS_IN和EVENTS_PORT两者初始化区别如下所示:

nrf_drv_gpiote_in_config_t config = GPIOTE_CONFIG_IN_SENSE_TOGGLE(false);  //false表示低精度低功耗的Port event,每个IO口都可以作为port event,52832总共有32个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总共有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的。

原文地址:https://www.cnblogs.com/iini/p/9347882.html

时间: 2024-11-05 21:53:31

nRF5芯片外设GPIO和GPIOTE介绍的相关文章

三星DRAM+NAND FLASH 合成MCP芯片介绍及应用攻略

转自:http://blog.csdn.net/gao5528/article/details/6256119 三星DRAM+NAND FLASH 合成MCP芯片介绍及应用攻略(K5系列产品篇) 一年前本人编写了一篇关于三星MCP芯片全攻略的文章,介绍了三星所有类型的MCP芯片的基本构架与市场应用,让很多从事手机研发以及通讯电子类产品的工程师增进了对这种合成芯片的了解.今天要介绍的产品是在上一篇文章的基础上,突出重点介绍一下ND产品,也就是DRAM+NAND这种制成的MCP的架构,选型注意点,三

Android bluetooth介绍(一):基本概念及硬件接口

关键词:蓝牙硬件接口 UART  PCM  blueZ 版本:基于android4.2之前版本 bluez内核:linux/linux3.08系统:android/android4.1.3.4作者:xubin341719(欢迎转载,请注明作者,请尊重版权谢谢)欢迎指正错误,共同学习.共同进步!! 一.基本概念补充 1.AP:ApplicationProcessor应用处理器 采用ARM架构的CPU,通常负责运行OS和一些特定设置和载入开机预设.比如一个没有电话功能的平板电脑,只跑android或

TMS320F28335项目开发记录8_28335之GPIO引脚

GPIO(General-Purpose Input/Output)--通用输入/输出口: DSP28335 GPIO模块分为三类IO口:PORTA(0-31),PORTB(32-63),PORTC(64-87) 对GPIO模块的设置主要通过三类寄存器来完成,分别是:控制寄存器.数据寄存器.中断寄存器. 1.控制寄存器 GPxCTRL;    // GPIO x Control Register (GPIO0 to 31) //设置采样窗周期T=2*GPXCTRL*Tsysclk: GPxQSE

使用寄存器点亮LED(第1节)—GPIO功能框图讲解

GPIO简介 GPIO 是通用输入输出端口的简称,简单来说就是 STM32 可控制的引脚, STM32 芯片的 GPIO 引脚与外部设备连接起来,从而实现与外部通讯.控制以及数据采集的功能.STM32 芯片的 GPIO 被分成很多组,每组有 16 个引脚,如型号为 STM32F103VET6 型号的.芯片有 GPIOA. GPIOB. GPIOC 至 GPIOE 共 5 组 GPIO,芯片一共 100 个引脚,其中GPIO 就占了一大部分,所有的 GPIO 引脚都有基本的输入输出功能. 最基本的

织女星开发板使用RISC-V RI5CY核驱动GPIO

前言 织女星开发板是OPEN-ISA社区为中国大陆地区定制的一款体积小.功耗超低和功能丰富的 RISC-V评估开发板,基于NXP半导体四核异构RV32M1主控芯片. 两个RISC-V核:RI5CY + ZERO_RISCY. 两个ARM核: Cortex-M4F + Cortex-M0+ . 4个核被分为两个子系统,大核CM4F/RI5CY和小核CM0+/ZERO-RISCY,片上集成1.25 MB Flash .384 KB SRAM,其中1 MB的Flash被大核所使用,起始地址0x0000

织女星开发板使用RISC-V核驱动GPIO

前言 织女星开发板是OPEN-ISA社区为中国大陆地区定制的一款体积小.功耗超低和功能丰富的 RISC-V评估开发板,基于NXP半导体四核异构RV32M1主控芯片. 两个RISC-V核:RI5CY + ZERO_RISCY. 两个ARM核: Cortex-M4F + Cortex-M0+ . 4个核被分为两个子系统,大核CM4F/RI5CY和小核CM0+/ZERO-RISCY,片上集成1.25 MB Flash .384 KB SRAM,其中1 MB的Flash被大核所使用,起始地址0x0000

用手机消灭一切令人蛋疼的物理外设

橙子引擎的TV游戏解决方案中重要的一部分就是手机端APP--橙子遥控器OGRemote.游戏的控制程序在手机端运行,来操控电视上的游戏主题程序."传统电视游戏需要用到各种繁多复杂的物理外设,给智能电视游戏的流行带来了极大的阻力.我们要做的就是用手机APP--橙子遥控器替代一切物理外设."尚韬介绍到.手机本身带有各类传感器和触屏操控,在wifi环境下可以顺畅地与TV进行交互.这样的操控方案不仅能给玩家带来全新体验,也给家庭多人同屏娱乐带来了更多想象空间. 橙子遥控器支持通用手柄模式和自定

OpenWRT GPIO口控制 WLED

Linux系统下GPIO系统架构介绍 关于这个GPIO很久以前一直以为很简单,但是,当你需要给一个特定的系统,搞这些GPIO的时候,你会发现,事实并不是如此,比如,mt7620n. GPIO#72是控制WLED -> WLAN LED. GPIO#40~44是控制WAN, LANLED. GPIO#1是控制Reset 这些东西以为自己写一个GPIO driver就完成了,其实没有那么简单,光是这个小驱动你怎么编译都比较麻烦,所以还是乖乖的学习OpenWRT的系统架构吧. 这里要说道重点dts.这

学习嵌入式-迅为4412开发板的GPIO是怎么操作的?

Exynos4412所有的GPIO都有固定的地址,为了方便操作这些GPIO,Linux内核在gpio-exynos4.h里面定义了一些GPIO的宏 详情了解:http://topeetboard.com 更多了解:https://arm-board.taobao.com 例如: #define EXYNOS4_GPA0(_nr) (EXYNOS4_GPIO_A0_START + (_nr)) #define EXYNOS4_GPA1(_nr) (EXYNOS4_GPIO_A1_START + (