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