标签:产生 conf 高精度 低功耗 而且 col handle 比较 包含
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模块还有两个非常重要的功能:
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的。
标签:产生 conf 高精度 低功耗 而且 col handle 比较 包含
原文地址:https://www.cnblogs.com/iini/p/9347882.html