7、nRF52xx藍牙學習(nrf_gpiote.c庫函數學習)

續前一篇文章。

3、nrfx_gpiote_in_event_enable

void nrfx_gpiote_in_event_enable(nrfx_gpiote_pin_t pin, bool int_enable)
{NRFX_ASSERT(nrf_gpio_pin_present_check(pin));NRFX_ASSERT(pin_in_use_by_gpiote(pin));if (pin_in_use_by_port(pin)){nrf_gpiote_polarity_t polarity =port_handler_polarity_get(channel_port_get(pin) - GPIOTE_CH_NUM);nrf_gpio_pin_sense_t sense;if (polarity == NRF_GPIOTE_POLARITY_TOGGLE){/* read current pin state and set for next sense to oposit */sense = (nrf_gpio_pin_read(pin)) ?NRF_GPIO_PIN_SENSE_LOW : NRF_GPIO_PIN_SENSE_HIGH;}else{sense = (polarity == NRF_GPIOTE_POLARITY_LOTOHI) ?NRF_GPIO_PIN_SENSE_HIGH : NRF_GPIO_PIN_SENSE_LOW;}nrf_gpio_cfg_sense_set(pin, sense);}else if (pin_in_use_by_te(pin)){int32_t             channel = (int32_t)channel_port_get(pin);nrf_gpiote_events_t event   = TE_IDX_TO_EVENT_ADDR((uint32_t)channel);nrf_gpiote_event_enable((uint32_t)channel);nrf_gpiote_event_clear(event);if (int_enable){nrfx_gpiote_evt_handler_t handler = channel_handler_get((uint32_t)channel_port_get(pin));// Enable the interrupt only if event handler was provided.if (handler){nrf_gpiote_int_enable(1 << channel);}}}
}

一、函數概述
nrfx_gpiote_in_event_enable 函數的主要功能是為指定的 GPIO 引腳啟用 GPIOTE(通用外設中斷和事件)輸入事件。
該函數會根據引腳的使用情況(是由端口處理還是由定時器事件處理)來配置相應的引腳感應和事件中斷。?
函數參數
pin:類型為 nrfx_gpiote_pin_t,表示要啟用事件的 GPIO 引腳編號。?
int_enable:布爾類型,用于決定是否啟用該引腳的中斷功能。 ?
二、函數實現步驟
1. 斷言檢查


NRFX_ASSERT(nrf_gpio_pin_present_check(pin));
NRFX_ASSERT(pin_in_use_by_gpiote(pin));


?NRFX_ASSERT(nrf_gpio_pin_present_check(pin)):使用斷言確保傳入的引腳 pin 是有效的,nrf_gpio_pin_present_check 函數用于檢查該引腳是否存在于硬件中。如果檢查失敗,程序會觸發斷言錯誤。
NRFX_ASSERT(pin_in_use_by_gpiote(pin)):確保該引腳已經被 GPIOTE 使用,如果未被使用,程序會觸發斷言錯誤。 ?
2. 處理引腳由端口使用的情況


?if (pin_in_use_by_port(pin))
{
? ? nrf_gpiote_polarity_t polarity =
? ? ? ? port_handler_polarity_get(channel_port_get(pin) - GPIOTE_CH_NUM);
? ? nrf_gpio_pin_sense_t sense;
? ? if (polarity == NRF_GPIOTE_POLARITY_TOGGLE)
? ? {
? ? ? ? sense = (nrf_gpio_pin_read(pin)) ?
? ? ? ? ? ? ? ? NRF_GPIO_PIN_SENSE_LOW : NRF_GPIO_PIN_SENSE_HIGH;
? ? }
? ? else
? ? {
? ? ? ? sense = (polarity == NRF_GPIOTE_POLARITY_LOTOHI) ?
? ? ? ? ? ? ? ? NRF_GPIO_PIN_SENSE_HIGH : NRF_GPIO_PIN_SENSE_LOW;
? ? }
? ? nrf_gpio_cfg_sense_set(pin, sense);
}

(1)nrf_gpiote_polarity_t是一個枚舉類型,定義如下:

typedef enum
{NRF_GPIOTE_POLARITY_LOTOHI = GPIOTE_CONFIG_POLARITY_LoToHi,       ///<  Low to high.NRF_GPIOTE_POLARITY_HITOLO = GPIOTE_CONFIG_POLARITY_HiToLo,       ///<  High to low.NRF_GPIOTE_POLARITY_TOGGLE = GPIOTE_CONFIG_POLARITY_Toggle        ///<  Toggle.
} nrf_gpiote_polarity_t;

(2)port_handler_polarity_get函數定義如下 :

static nrf_gpiote_polarity_t port_handler_polarity_get(uint32_t handler_idx)
{uint8_t pin_and_polarity = (uint8_t)m_cb.port_handlers_pins[handler_idx];return (nrf_gpiote_polarity_t)((pin_and_polarity & POLARITY_FIELD_MASK) >> POLARITY_FIELD_POS);
}

(3)m_cb是一個靜態變量,定義如下 :

static gpiote_control_block_t m_cb;

其類型為結構體類型gpiote_control_block_t,該類型是在nrfx_gpiote.c中定義的:

typedef struct
{nrfx_gpiote_evt_handler_t handlers[GPIOTE_CH_NUM + NRFX_GPIOTE_CONFIG_NUM_OF_LOW_POWER_EVENTS];int8_t                    pin_assignments[MAX_PIN_NUMBER];int8_t                    port_handlers_pins[NRFX_GPIOTE_CONFIG_NUM_OF_LOW_POWER_EVENTS];uint8_t                   configured_pins[((MAX_PIN_NUMBER)+7) / 8];nrfx_drv_state_t          state;
} gpiote_control_block_t;

此結構體的解釋如下:

,它用于管理和控制通用外設中斷和事件(GPIOTE)模塊。

下面詳細解釋結構體中的每個成員:

整體用途 gpiote_control_block_t 結構體作為 GPIOTE 模塊的控制塊,負責存儲和管理與 GPIOTE 操作相關的各種信息,包括事件處理函數、引腳分配、端口處理狀態、引腳配置狀態以及驅動程序的整體狀態。

結構體成員解釋

1. nrfx_gpiote_evt_handler_t handlers[GPIOTE_CH_NUM + NRFX_GPIOTE_CONFIG_NUM_OF_LOW_POWER_EVENTS];

? 類型:nrfx_gpiote_evt_handler_t 是一個函數指針類型,它指向處理 GPIOTE 事件的函數。該數組存儲了所有 GPIOTE 通道(包括普通通道和低功耗事件通道)對應的事件處理函數。

? 用途:當特定的 GPIOTE 通道發生事件時,系統會調用該通道對應的事件處理函數來處理事件。GPIOTE_CH_NUM 代表普通 GPIOTE 通道的數量,NRFX_GPIOTE_CONFIG_NUM_OF_LOW_POWER_EVENTS 表示低功耗事件通道的數量。 ?

2. int8_t pin_assignments[MAX_PIN_NUMBER];

? 類型:int8_t 類型的數組,每個元素存儲一個 8 位有符號整數。

? 用途:該數組用于記錄每個 GPIO 引腳所分配的 GPIOTE 通道編號。MAX_PIN_NUMBER 是系統中可用的最大 GPIO 引腳數量。數組的索引對應引腳編號,數組元素的值為該引腳分配的 GPIOTE 通道編號。如果某個引腳未分配通道,通常用一個特殊值(如 -1)表示。 ?

3. int8_t port_handlers_pins[NRFX_GPIOTE_CONFIG_NUM_OF_LOW_POWER_EVENTS];

? 類型:int8_t 類型的數組。

? 用途:此數組用于存儲與低功耗事件通道相關的引腳信息。每個元素對應一個低功耗事件通道,可能存儲該通道所關聯的引腳編號或其他相關信息。 ?

4. uint8_t configured_pins[((MAX_PIN_NUMBER)+7) / 8];

? 類型:uint8_t 類型的數組,即無符號 8 位整數數組。

? 用途:這是一個位圖數組,用于記錄哪些 GPIO 引腳已經被配置為 GPIOTE 功能。通過使用位圖,每個字節可以表示 8 個引腳的配置狀態。((MAX_PIN_NUMBER)+7) / 8 確保數組大小足夠存儲所有引腳的狀態。例如,如果某個引腳已配置,則對應位圖中的相應位被設置為 1;否則為 0。 ?5. nrfx_drv_state_t state;

? 類型:nrfx_drv_state_t 是一個自定義的枚舉類型,用于表示 GPIOTE 驅動程序的狀態。

? 用途:該成員變量記錄了 GPIOTE 驅動程序的當前狀態,如初始化、運行、停止等。通過檢查這個狀態變量,系統可以了解 GPIOTE 模塊的工作狀態,并根據需要進行相應的操作。 ?總結 gpiote_control_block_t 結構體整合了管理 GPIOTE 模塊所需的關鍵信息,通過這些成員變量,系統可以有效地分配通道、處理事件、跟蹤引腳配置狀態以及管理驅動程序的整體狀態。

(4) pin_in_use_by_port(pin):

檢查該引腳是否由端口處理。
?port_handler_polarity_get(channel_port_get(pin) - GPIOTE_CH_NUM):獲取該引腳對應的端口處理極性。?
?極性判斷:?
?如果極性為 NRF_GPIOTE_POLARITY_TOGGLE,則讀取當前引腳的狀態,根據狀態設置感應為相反的電平(如果當前引腳為高電平,則感應設置為低電平;反之亦然)。?
?如果極性為 NRF_GPIOTE_POLARITY_LOTOHI,則感應設置為高電平;如果極性為其他值(可理解為 NRF_GPIOTE_POLARITY_HITOLO),則感應設置為低電平。 ??
?nrf_gpio_cfg_sense_set(pin, sense):將計算得到的感應設置應用到該引腳上。

?
(5). 處理引腳由定時器事件使用的情況
? else if (pin_in_use_by_te(pin))
{
? ? int32_t ? ? ? ? ? ? channel = (int32_t)channel_port_get(pin);
? ? nrf_gpiote_events_t event ? = TE_IDX_TO_EVENT_ADDR((uint32_t)channel);

? ? nrf_gpiote_event_enable((uint32_t)channel);

? ? nrf_gpiote_event_clear(event);
? ? if (int_enable)
? ? {
? ? ? ? nrfx_gpiote_evt_handler_t handler = channel_handler_get((uint32_t)channel_port_get(pin));
? ? ? ? // Enable the interrupt only if event handler was provided.
? ? ? ? if (handler)
? ? ? ? {
? ? ? ? ? ? nrf_gpiote_int_enable(1 << channel);
? ? ? ? }
? ? }
}


?pin_in_use_by_te(pin):檢查該引腳是否由定時器事件處理。?
?channel_port_get(pin):獲取該引腳對應的通道編號。
?TE_IDX_TO_EVENT_ADDR((uint32_t)channel):將通道編號轉換為對應的 GPIOTE 事件地址。?
?nrf_gpiote_event_enable((uint32_t)channel):啟用該通道的 GPIOTE 事件。?
?nrf_gpiote_event_clear(event):清除該事件的狀態標志。?
?中斷啟用判斷:?
?如果 int_enable 為 true,則獲取該通道對應的事件處理函數 handler。?
?只有當事件處理函數存在時,才調用 nrf_gpiote_int_enable(1 << channel) 啟用該通道的中斷。 ? ?
?總結 該函數的核心是根據引腳的使用情況(端口處理或定時器事件處理)來配置引腳的感應和事件中斷。
?對于端口處理的引腳,根據極性設置感應;對于定時器事件處理的引腳,啟用事件、清除事件標志,并根據需要啟用中斷。通過這些步驟,確保指定引腳的 GPIOTE 輸入事件能夠正常工作。

void nrfx_gpiote_in_event_enablevoid nrfx_gpiote_in_event_enable

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/77251.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/77251.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/77251.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Java 實現插入排序:[通俗易懂的排序算法系列之三]

引言 大家好!歡迎繼續關注我的排序算法系列。今天,我們要學習的是另一種非常基礎且重要的排序算法——插入排序 (Insertion Sort)。 插入排序的思路非常貼近我們日常整理撲克牌的方式,理解起來相對自然。雖然它在最壞情況下的效率不高,但在某些特定場景下,它的表現甚至優…

Java的spring boot項目編譯成功啟動報錯

問題現象&#xff1a;spring boot項目&#xff0c;候刪除一些無用代碼后&#xff0c;build成功&#xff0c;啟動時報錯&#xff1a;找不到java.util.Map或者其他對象&#xff08;用Lombok注解Data&#xff09;中的字段屬性找不到等錯誤。解答&#xff1a; 常見是Lombok版本問題…

PyTorch參數管理詳解:從訪問到初始化與共享

本文通過實例代碼講解如何在PyTorch中管理神經網絡參數&#xff0c;包括參數訪問、多種初始化方法、自定義初始化以及參數綁定技術。所有代碼可直接運行&#xff0c;適合深度學習初學者進階學習。 1. 定義網絡與參數訪問 1.1 定義單隱藏層多層感知機 import torch from torch…

基于springboot+vue的課程管理系統

一、系統架構 前端&#xff1a;vue | element-ui 后端&#xff1a;springboot | mybatis-plus 環境&#xff1a;jdk1.8 | mysql8 | maven | node v16.20.2 | idea 二、代碼及數據 三、功能介紹 01. 登錄 02. 管理員-首頁 03. 管理員-系管理 04. 管理員-專業管理 05. 管…

ssh密鑰連接遠程服務器并用scp傳輸文件

ssh密鑰連接遠程服務器 私鑰的權限必須是600chmod 600 id_rsa連接時在命令中加上私鑰的地址ssh -i PATH_to_id_rsa usernameip -p port scp -P port -i PATH_to_id_rsa file usernameip:PATH

ElasticSearch遷移數據

一、查詢索引 1、查詢所有索引 curl --user elastic:123456 -XGET "http://localhost:19200/_cat/indices?v&sindex" 2、查詢索引配置 以索引名稱hello為例 curl --user elastic:123456 -XGET "http://localhost:19200/hello/_settings?pretty" 3…

【Unity】animator檢測某state動畫播放完畢方法

博主對動畫系統很不熟&#xff0c;可能使用的方法比較曲折&#xff0c;但是我確實沒找到更有效的方法了。 unity的這個animator在我看來簡直有毛病啊&#xff0c;為什么那么難以獲取某狀態動畫的信息呢&#xff1f;&#xff1f;&#xff1f; 想要知道動畫播完沒有只有用norma…

Jmeter 插件【性能測試監控搭建】

1. 安裝Plugins Manager 1.1 下載路徑&#xff1a; Install :: JMeter-Plugins.org 1.2 放在lib/ext目錄下 1.3 重啟Jmeter&#xff0c;會在菜單-選項下多一個 Plugins Manager菜單&#xff0c;打開即可對插件進行安裝、升級。 2. 客戶端(Jmeter端) 2.1 安裝plugins manager…

ollama+open-webui本地部署自己的模型到d盤+兩種open-webui部署方式(詳細步驟+大量貼圖)

一、ollama準備 1.官網下載ollama&#xff1a;https://ollama.com/download 2.在 d 盤創建 ollama 文件夾&#xff0c;把軟件包放進去 3.管理員身份運行黑窗口 win r 彈出運行窗口 輸入 cmd 后&#xff0c; ctrl shift 回車&#xff0c;以管理員身份打開 3.切換到 d 盤&a…

(學習總結33)Linux Ext2 文件系統與軟硬鏈接

Linux Ext2 文件系統與軟硬鏈接 理解硬件磁盤、服務器、機柜、機房磁盤物理結構磁盤的邏輯結構實際過程 CHS 與 LBA 地址轉換 引入文件系統引入 " 塊 " 概念引入 " 分區 " 概念引入 " inode " 概念 ext2 文件系統宏觀認識Block Group 塊組與其內…

Go語言sync.Mutex包源碼解讀

互斥鎖sync.Mutex是在并發程序中對共享資源進行訪問控制的主要手段&#xff0c;對此Go語言提供了非常簡單易用的機制。sync.Mutex為結構體類型&#xff0c;對外暴露Lock()、Unlock()、TryLock()三種方法&#xff0c;分別用于阻塞加鎖、解鎖、非阻塞加鎖操作&#xff08;加鎖失敗…

SQL注入流量分析

免責聲明&#xff1a;本文僅作分享 ~ 目錄 SQL注入流量分析 特征&#xff1a; sqlmap注入類型 漏洞環境搭建 error_sql: bool_sql: time_sql: union_sql: Stacked Queries: Inline Queries: SQL注入流量分析 https://www.freebuf.com/column/161797.html SQLMAP攻擊…

Linux 時間同步工具 Chrony 簡介與使用

一、Chrony 是什么&#xff1f; chrony 是一個開源的網絡時間同步工具&#xff0c;主要由兩個組件組成&#xff1a; chronyd&#xff1a;后臺服務進程&#xff0c;負責與時間服務器交互&#xff0c;同步系統時鐘。chronyc&#xff1a;命令行工具&#xff0c;用于手動查看或修…

Flutter:Flutter SDK版本控制,fvm安裝使用

1、首先已經安裝了Dart&#xff0c;cmd中執行 dart pub global activate fvm2、windows配置系統環境變量 fvm --version3、查看本地已安裝的 Flutter 版本 fvm releases4、驗證當前使用的 Flutter 版本&#xff1a; fvm flutter --version5、切換到特定版本的 Flutter fvm use …

Vue 項目中的package.json各部分的作用和用法的詳細說明

1. 基本信息 {"name": "my-vue-app","version": "1.0.0","description": "A Vue.js project","author": "Your Name <your.emailexample.com>","license": "MIT"…

Linux網絡編程——TCP通信的四次揮手

一、前言 上篇文章講到了TCP通信建立連接的“三次握手”的一些細節&#xff0c;本文再對TCP通信斷開連接的“四次揮手”的過程做一些分析了解。 二、TCP斷開連接的“四次揮手” 我們知道TCP在建立連接的時需要“三次握手”&#xff0c;三次握手完后就可以進行通信了。而在通…

某碰瓷國賽美賽,號稱第三賽事的數模競賽

首先我非常不能理解的就是怎么好意思自稱第三賽事的呢&#xff1f;下面我們進行一個簡單討論&#xff0c;當然這里不對國賽和美賽進行討論。首先我們來明確一點&#xff0c;比賽的含金量由什么來定&#xff1f;這個可能大家的評價指標可能不唯一&#xff0c;我通過DeepSeek選取…

Redis 緩存問題:緩存雪崩、緩存擊穿、緩存穿透

文章目錄 緩存雪崩緩存擊穿緩存穿透在實際的業務場景中,Redis 通常作為緩存和其他數據庫(例如 MySQL)搭配使用,用來減輕數據庫的壓力。但是在使用 Redis 作為緩存數據庫的過程中,可能會遇到一些常見問題,例如緩存穿透、緩存擊穿和緩存雪崩等。 緩存雪崩 緩存雪崩是指緩存…

Qt 入門 4 之標準對話框

Qt 入門 4 之標準對話框 Qt提供了一些常用的對話框類型,它們全部繼承自QDialog類,并增加了自己的特色功能,比如獲取顏色、顯示特定信息等。下面簡單講解這些對話框,可以在幫助索引中查看Standard Dialogs關鍵字,也可以直接索引相關類的類名。 本文將以一個新的項目為主介紹不…

買不起了,iPhone 或漲價 40% ?

周知的原因&#xff0c;新關稅對 iPhone 的打擊&#xff0c;可以說非常嚴重。 根據 Rosenblatt Securities分析師的預測&#xff0c;若蘋果完全把成本轉移給消費者。 iPhone 16 標配版的價格&#xff0c;可能上漲43%。 iPhone 16 標配的價格是799美元&#xff0c;上漲43%&am…