1、GPIOTE 简单介绍
Nordic 的GPIO中断是通过 GPIOTE这个外设模块来实现的。
GPIOTE 使用task 和event的方式来控制GPIO,GPIO做为输出可以通过 GPIOTE task 来控制IO输出高电平、低电平、或者翻转电平,GPIO做为输入在IO发生变化(Rising edge、 Falling edge、Any change)产生GPIOTE event事件,可以触发GPIOTE中断,或着将event连接到PPI上触发task。PPI这个外设功能非常好,可以减少CPU工作。
2、GPIOTE 通道
nRF52832 GPIOTE 有8 个通道,最多可以配置8个GPIO(Pin events and tasks)
3、如果超过8个怎么办?
可以使用Port event
Port event是所有GPIO DETECT信号的组合事件,每个GPIO都可以触发GPIOTE Port event。
4、程序代码如何配置使用pin event还是port event ?
nrf_drv_gpiote_in_init 初始化函数中参数p_config->hi_accuracy = true 为 pin event,否则为port event
5、下面说说使用GPIOTE遇到的问题
无论是pin event还是port event的方式都有些问题,要根据自己的使用场景和要求来选择配置
5.1 GPIOTE pin event 功耗高
GPIOTE pin event 需要使用16MHz HFCLK,所以功耗比较高
5.2 GPIOTE port event 不能多个GPIO同时触发
因为GPIOTE port event是检测DETECT 上升沿信号,GPIO的SENSE条件为真就将DETECT设置为1,DETECT是所有GPIO的组合信号,如果一个GPIO 已经触发DETECT信号,并且IO状态未改变,SENSE条件还是为真,DETECT将还是1,这里另一个GPIO再次Sense条件满足,也不会触发port event中断,因为DETECT没有改变(没有检测到上升沿)
5.3 解决方法
5.3.1 如果不在乎功耗,那么很简单,配置p_config->hi_accuracy = true使用pin event
5.3.2 如果功耗非常重要,并且没有多个GPIO同时中断的场景,那么配置p_config->hi_accuracy = false使用port event
5.3.3 如果功耗非常重要 , 并且需要多个GPIO同时中断,那么配置p_config->hi_accuracy = false使用port event,并且p_config->sense配置为NRF_GPIOTE_POLARITY_TOGGLE, 这样配置如果按键按下触发port event 中断后改变按键GPIO sense设置就不会持续触发DETECT信号,这时有其他GPIO中断就可以触发Port Event中断
6、参考
https://devzone.nordicsemi.com/f/nordic-q-a/18052/gpiote-handler-module-or-gpiote-driver-for-port-interrupt
https://devzone.nordicsemi.com/f/nordic-q-a/14825/gpiote-interrupt-issue/56595#56595
https://devzone.nordicsemi.com/f/nordic-q-a/40386/question-about-current-in-low-power-mode/157035#157035
https://devzone.nordicsemi.com/f/nordic-q-a/5016/how-to-use-the-port-event/17685#17685
https://devzone.nordicsemi.com/f/nordic-q-a/37063/what-s-difference-between-hi_accuracy-and-port-event-interruption/142491#142491
https://devzone.nordicsemi.com/f/nordic-q-a/25428/gpio-in_event-to-gpio-port-event/100221#100221