国产亚洲精品福利在线无卡一,国产精久久一区二区三区,亚洲精品无码国模,精品久久久久久无码专区不卡

當(dāng)前位置: 首頁(yè) > news >正文

php網(wǎng)站怎么做測(cè)試工具上海網(wǎng)站建設(shè)開(kāi)發(fā)

php網(wǎng)站怎么做測(cè)試工具,上海網(wǎng)站建設(shè)開(kāi)發(fā),國(guó)外網(wǎng)站怎么做,寧波自助建站系統(tǒng)這里寫(xiě)目錄標(biāo)題 GPIOTE 原理分析GPIOTE 輸入事件應(yīng)用GPIOTE 事件寄存器應(yīng)用GPIOTE 事件組件的應(yīng)用(庫(kù)函數(shù))GPIOTE PORT 事件應(yīng)用 GPIOTE 任務(wù)應(yīng)用GPIOTE 任務(wù)觸發(fā) LED 寄存器操作組件方式進(jìn)行任務(wù)配置 GPIOTE 原理分析 GPIO 任務(wù)和時(shí)間(GPIO…

這里寫(xiě)目錄標(biāo)題

  • GPIOTE 原理分析
  • GPIOTE 輸入事件應(yīng)用
    • GPIOTE 事件寄存器應(yīng)用
    • GPIOTE 事件組件的應(yīng)用(庫(kù)函數(shù))
    • GPIOTE PORT 事件應(yīng)用
  • GPIOTE 任務(wù)應(yīng)用
    • GPIOTE 任務(wù)觸發(fā) LED 寄存器操作
    • 組件方式進(jìn)行任務(wù)配置


GPIOTE 原理分析

GPIO 任務(wù)和時(shí)間(GPIOTE)模塊提供了使用任務(wù)和事件訪問(wèn) GPIO 引腳的功能。每個(gè) GPIOTE 通道被分配到一個(gè)引腳,GPIOTE 其實(shí)就是對(duì) GPIO 口進(jìn)行操作,同時(shí)引入了外部中斷的概念。

比如按鍵控制分為兩種情況:

  • 按鍵掃描:CPU 需要不停工作來(lái)判斷 GPIO 引腳是否有拉低或者置高,效率很低;
  • 外部中斷控制:中斷控制的效率很高,一旦系統(tǒng) IO 口出現(xiàn)上升或下降沿電平就會(huì)觸發(fā)中斷內(nèi)的程序。

在 nRF52832 內(nèi)部普通的 IO 管腳設(shè)置成 GPIO,中斷和任務(wù)管腳設(shè)置成 GPIOTE。
nRF5x 系列處理器將 GPIO 的中斷的快速觸發(fā)做成了一個(gè)單獨(dú)的模塊 GPIOTE,這個(gè)模塊不僅提供了 GPIO 的中斷功能,同時(shí)提供了通過(guò) task 和 event 方式來(lái)訪問(wèn) GPIO 的功能。GPIOTE 的后綴 T 即為 task,E 為 event。

Event 稱為事件,來(lái)源與 GPIO 的輸入、定時(shí)器的匹配中斷等可以產(chǎn)生中斷的外設(shè)來(lái)觸發(fā)。Task 稱為任務(wù),就是執(zhí)行某一特定功能,比如翻轉(zhuǎn) IO 端口等。那么事件 event 觸發(fā)任務(wù) task。task 和 event 的組合是為了和 52832 中的 PPI(可編程外圍設(shè)備互聯(lián)系統(tǒng))模塊的配合使用。這種機(jī)制不需要 CPU 參與,極大的減少了內(nèi)核消耗,降低功率,特別適合于 BLE 低功耗藍(lán)牙進(jìn)行應(yīng)用。

GPIOTE 實(shí)際上分為兩種模式:

  • 任務(wù)模式:作為輸出使用
  • 事件模式:作為中斷觸發(fā)使用

GPIOTE task 任務(wù)模式,每個(gè) GPIOTE 通道最多可以使用三個(gè)任務(wù)來(lái)執(zhí)行引腳的寫(xiě)操作。

  • 固定的輸出高電平(SET)
  • 固定的輸出低電平(CLR)
  • 輸出任務(wù)(OUT)可以配置為執(zhí)行 置位清零、切換。

GPIOTE event 事件模式,可以從以下輸入條件之一在每個(gè) GPIOTE 通道中生成事件:

  • 上升邊緣
  • 下降邊緣
  • 任何改變

任務(wù)模式有三種狀態(tài):置位、清零、翻轉(zhuǎn);事件模式有三種觸發(fā)狀態(tài):上升沿觸發(fā)、下降沿觸發(fā)、任意變化觸發(fā)。TASJK 任務(wù)通過(guò)通道 OUT[0]-OUT[7] 設(shè)置輸出觸發(fā)狀態(tài),Event 則可以通過(guò)檢測(cè)信號(hào)產(chǎn)生 PORT event 事件,產(chǎn)生 IN[n] event 事件。

整個(gè) GPIOTE 寄存器的個(gè)數(shù)非常少。GPIOTE 模塊提供了 8 個(gè)通道,這 8 個(gè)通道都是通過(guò) CONFIG[0]~CONFIG[7] 寄存器來(lái)配置。八個(gè)通道可以通過(guò)單獨(dú)設(shè)置來(lái)分別和普通的 GPIO 綁定。當(dāng)需要使用 GPIOTE 的中斷功能時(shí)可以設(shè)置相應(yīng)寄存器的相關(guān)位,讓某個(gè)通道作為 event 事件模式,同時(shí)配置觸發(fā) event 動(dòng)作。比如綁定的引腳有上升沿跳變或者下降沿跳變觸發(fā) event,然后配置中斷使能寄存器,配置讓其 event 產(chǎn)生時(shí)觸發(fā)輸入中斷。這樣實(shí)現(xiàn)了 GPIO 的中斷方式。
在這里插入圖片描述

  1. GPIO 綁定 GPIOTE 通道
    那么如何實(shí)現(xiàn)和普通 GPIO 端口的綁定了?關(guān)鍵是設(shè)置 GPIOTE 的 CONFIG[n]n = 0~7 寄存器,如下。
    在這里插入圖片描述
    在這里插入圖片描述
    如上描述,每個(gè) GPIOTE 通道通過(guò) CONFIG.PSEL 字段與一個(gè)物理 GPIO 引腳相綁定。
  • 在 CONFIG.MODE 中選擇時(shí)間模式時(shí):CONFIG.PSEL 綁定的引腳將被配置為輸入,從而覆蓋 GPIO 中的 DIR 設(shè)置。
  • 當(dāng)在 CONFIG.MODE 中選擇任務(wù)模式時(shí):CONFIG.PSEL 綁定的引腳將被配置為輸出,也會(huì)覆蓋 GPIO 中的 DIR 寄存器設(shè)置和 OUT 值的輸出。
  • 當(dāng)在 CONFIG.MODE 中選擇 disabled 時(shí),CONFIG.PSEL 綁定的引腳將使用普通 GPIO 中 PIN[n].CNF 寄存器的配置,也就是不綁定。因此只能將一個(gè) GPIOTE 通道分配給一個(gè) GPIO 物理引腳。
  1. 設(shè)置為事件模式
    當(dāng)設(shè)置為事件模式時(shí),因?yàn)槭录J骄褪禽斎?#xff0c;通過(guò)輸入信號(hào)可以出發(fā)事件中斷?;静襟E如下:
  • 首先在寄存器 CONFIG.PSEL 綁定引腳,設(shè)置一個(gè) GPIO 管腳綁定 GPIOTE 通道;
  • 在 CONFIG.MODE 設(shè)置為事件模式
  • 在 CONFIG.POLARITY 中設(shè)置觸發(fā)事件模式的輸入電平
  • 當(dāng)對(duì)應(yīng)電平輸入 GPIOTE 通道后就會(huì)產(chǎn)生中斷,EVENTS_IN 寄存器就來(lái)判斷對(duì)應(yīng)端口中斷事件是否發(fā)生。

在這里插入圖片描述

  1. 設(shè)置為任務(wù)模式
    因?yàn)槿蝿?wù)模式為輸出模式。配置過(guò)程:
  • 首先需要設(shè)置 CONFIG.PSEL 綁定 GPIO 管腳;
  • 然后設(shè)置 CONFIG.MODE 為 GPIOTE 任務(wù)模式
  • 設(shè)置 CONFIG.POLARITY OUT[n[ 任務(wù)輸出:置位、清零、切換
  • 設(shè)置完成后觸發(fā)任務(wù)。TASKS_OUT[n] 觸發(fā) OUT[n] 值、TASKS_SET[n] 觸發(fā)高電平、TASKS_CLR[n] 觸發(fā)低電平
    三種狀態(tài)觸發(fā)同時(shí)申請(qǐng),則優(yōu)先級(jí)如下執(zhí)行:
任務(wù)狀態(tài)優(yōu)先級(jí)
TASKS_OUT1
TASKS_CLR2
TASKS_SET3

在這里插入圖片描述

  1. 中斷配置
    中斷是在事件模式下觸發(fā)的,如果在配置寄存器 CONFIG[n] 中,綁定了對(duì)應(yīng)的 GPIO 端口,同時(shí)配置為事件輸入模式,那么可以通過(guò) INTENSET 寄存器是能對(duì)應(yīng)的中斷通道。通過(guò) INTENCLR 寄存器關(guān)閉對(duì)應(yīng)的中斷通道。INTENSET 寄存器和 INTENCLR 寄存器如下表所示:

INTENSET 寄存器
在這里插入圖片描述
在這里插入圖片描述

INTENCLR 寄存器
在這里插入圖片描述

GPIOTE 輸入事件應(yīng)用

GPIOTE 事件寄存器應(yīng)用

修改前面 GPIO 應(yīng)用按鍵應(yīng)用改為中斷控制方式。中斷控制的效率很高,一旦系統(tǒng) IO 口出現(xiàn)上升沿或者下降沿電平就會(huì)觸發(fā)執(zhí)行中斷內(nèi)的處理程序。這樣可以大大節(jié)省 CPU 的占用。中斷在計(jì)算機(jī)多任務(wù)處理,尤其是實(shí)時(shí)系統(tǒng)重尤為有用,這樣的系統(tǒng)包括運(yùn)行在騎上的操作系統(tǒng),也成為“中斷驅(qū)動(dòng)”。

硬件方面,和前面講述 GPIO 輸入掃描哪里的按鍵輸入應(yīng)用一樣。四個(gè)按鍵分別連接 P0.13、 P0.14、 P0.15、 P0.16。

在這里插入圖片描述
在使用 nRF52832 完成中斷時(shí),當(dāng) IO 管腳為低的時(shí)候可以判斷管腳已經(jīng)按下。通過(guò) key 的中斷來(lái)控制 led 的亮滅。硬件上設(shè)計(jì)是比較簡(jiǎn)單的,這和普通的 MCU 的中斷用法一致。如下創(chuàng)建工程。
在這里插入圖片描述
這樣我們需要編寫(xiě) exit.c 文件,主要有兩部分:初始化開(kāi)發(fā)板上的按鍵中斷;編寫(xiě)中斷執(zhí)行代碼。
按鍵中斷這里實(shí)際上使用了事件模式。在 CONFIG 寄存器里進(jìn)行了事件模式的配置。代碼如下:

NRF_GPIOTE->CONFIG[0] = (GPIOTE_CONFIG)_POLARITY_HiToLo << GPIOTE_CONFIG_POLARITY_Pos) //輸入事件極性| (13 << GPIOTE_CONFIG_PSEL_Pos)//綁定的引腳| (GPIOTE_COFNIG_MODE_Event << GPIOTE_CONFIG_MODE_Pos);//模式配置

上面的代碼嚴(yán)格按照寄存器要求進(jìn)行,首先是 MODE 模式設(shè)置,配置 GPIOTE 通道作為 event 還是 task 使用,這里設(shè)置成 event 事件。PSEL 設(shè)置對(duì)應(yīng)綁定的 IO 管腳,選擇 P0.13 作為觸發(fā)管腳,POLARIY 極性設(shè)置為下降沿觸發(fā)。
設(shè)置好了工作方式后,我們就需要進(jìn)行中斷的使能了,因?yàn)榍懊娼壎ǖ氖?GPIOTE 的 0 通道,因此中斷使能代碼如下:

NVIC_EnableIRQ(GPIOTE_IRQn);//中斷嵌套是能
NRF_GPIOTE->INTENSET = GPIOTE_INTENSET_IN0_Set <<GPIOTE_INTENSET_IN0_Pos;//是能中斷通道 IN0

上面任務(wù)基本上就可以把 GPIOTE 管腳中斷配置好了,如果搞清楚這些寄存器配置很簡(jiǎn)單。中斷函數(shù)的設(shè)計(jì)這里主要講 LED 燈狀態(tài)翻轉(zhuǎn),當(dāng)然也可以加入對(duì)應(yīng)的其他處理操作。

void GPIOTE_IRQHander()
{if((NRF_GPIOTE->EVENTS_IN[0] == 1) &&(NRF_GPIOTE->INTENSET & GPIOTE_INTENSET_IN0_Msk)){Delay(10000);//延遲消抖NRF_GPIOTE->EVENTS_IN[0] = 0;//中斷事件清零}LED_Toggle();//led 燈狀態(tài)翻轉(zhuǎn)
}

完成 exit.c 的編寫(xiě)后,main 主函數(shù)的操作就很簡(jiǎn)單,直接調(diào)用寫(xiě)好的驅(qū)動(dòng)函數(shù),然后嘗試按鍵是否有對(duì)應(yīng)的響應(yīng)即可。

#include "nrf52.h"
#include "nrf_gpio.h"
#include "exit.h"
#include "led.h"int mian()
{LED_Init();LED_Open();EXIT_KEY_Init();while(1){//這里暫時(shí)控制,主操作死循環(huán)}return 0;
}

GPIOTE 事件組件的應(yīng)用(庫(kù)函數(shù))

通過(guò)使用 nrf 官方庫(kù)函數(shù)可以更加方便完成整個(gè)過(guò)程的操作,對(duì)于寄存器操作我們僅僅只需要了解原理即可,如果非要使用寄存器去完成開(kāi)發(fā)對(duì)日后維護(hù)和使用有很大弊端,所以官方已經(jīng)將這部分進(jìn)行了完美的封裝。我們根據(jù)官方 SDK 的封裝接口進(jìn)行調(diào)用完成對(duì)應(yīng)操作即可。

添加了 SDK 庫(kù)函數(shù)的工程和之前也有所不同,這里添加了 nRF_Libraries 庫(kù)函數(shù)路徑。
在這里插入圖片描述
官方也提供了一個(gè)驅(qū)動(dòng) nrfx_gpiote 的 GPIOTE 驅(qū)動(dòng)庫(kù),但是這個(gè)驅(qū)動(dòng)庫(kù)帶有錯(cuò)誤跟蹤函數(shù),所以工程中必須添加錯(cuò)誤跟蹤庫(kù)。同時(shí)區(qū)別于寄存器編程,組件庫(kù)還需要配置 sdk_config.h 配置文件。

打開(kāi) sdk_config.h 配置文件,打開(kāi)配置向?qū)?Configuration Wizard,勾選以下兩個(gè)使能項(xiàng)目,

  • GPIOTE_ENABLE 使能 GPIOTE 驅(qū)動(dòng)庫(kù)
  • NRFX_GPIOTE__ENABLE 使能 GPIOTE 兼容庫(kù)
    在這里插入圖片描述
    同時(shí)需要再 C/C++ 中添加硬件 GPIOTE 的庫(kù)文件和頭文件路徑,如下:
    在這里插入圖片描述
    庫(kù)函數(shù)介紹:
  1. 函數(shù) nrf_drv_gpiote_init 等同于函數(shù) nrfx_gpiote_init
    在這里插入圖片描述

  2. 函數(shù) nrf_drv_gpiote_in_init 等同于函數(shù) nrfx_gpiote_in_init
    在這里插入圖片描述
    在這里插入圖片描述

  3. nrf_drv_gpiote_in_event_enable 等同于函數(shù) nrfx_gpiote_in_event_enable
    在這里插入圖片描述

介紹完了前面的庫(kù)函數(shù)接口。由于驅(qū)動(dòng)組件庫(kù) SDK 已經(jīng)編寫(xiě)好了,我們只需要編寫(xiě) main.c 的主函數(shù)調(diào)用即可。

#include <stdbool.h>
#include "nrf.h"
#include "nrf_drv_gpiote.h"
#include "app_error.h"
#include "boards.h"#ifdef BSP_BUTTON_0#define PIN_IN BSP_BUTTON_0
#endif
#ifndef PIN_IN#error "Please indicate input pin"
#endif#ifdef BSP_LED_0#define PIN_OUT BSP_LED_0
#endif
#ifndef PIN_OUT#error "Please indicate output pin"
#endif/**GPIOTE中斷處理*/
void in_pin_handler(nrf_drv_gpiote_pin_t pin, nrf_gpiote_polarity_t action)
{if(nrf_gpio_pin_read(PIN_IN)== 0)//按鍵防抖{nrf_gpio_pin_toggle(PIN_OUT);}
}
/**
配置GPIOTE初始化*/
static void gpio_init(void)
{nrf_gpio_cfg_output(PIN_OUT);//led燈的輸出ret_code_t err_code;err_code = nrf_drv_gpiote_init();//初始化GPIOTEAPP_ERROR_CHECK(err_code);nrf_drv_gpiote_in_config_t in_config = GPIOTE_CONFIG_IN_SENSE_TOGGLE(true);in_config.pull = NRF_GPIO_PIN_PULLUP;//設(shè)置GPIOTE輸入,極性,模式err_code = nrf_drv_gpiote_in_init(PIN_IN, &in_config, in_pin_handler);APP_ERROR_CHECK(err_code);//使能GPIOTEnrf_drv_gpiote_in_event_enable(PIN_IN, true);
}/**
主函數(shù),循環(huán)等待中斷*/
int main(void)
{gpio_init();while (true){// Do nothing.}
}

GPIOTE PORT 事件應(yīng)用

把普通的 GPIO 端口配置為 GPIOTE 中斷輸入事件,能夠綁定的只有 8 個(gè)通道,如果我們中斷的數(shù)據(jù)量超過(guò)了 8 個(gè),多的中斷無(wú)法處理,如何出現(xiàn)這種情況,怎么處理?顯然芯片設(shè)計(jì)廠家為了針對(duì)這種情況,特別在 GPIOTE 模塊中提出了 GPIOTE PORT 功能。

GPIOTE PORT 是從使用 GPIO DETECT 信號(hào)的多個(gè) IO 輸入引腳來(lái)生成的事件。該事件將在 DETECT 信號(hào)的上升沿而產(chǎn)生。也就是說(shuō)這個(gè)功能可以通過(guò) 32 個(gè) IO 端口來(lái)產(chǎn)生,相當(dāng)于一個(gè)總通道,32 個(gè) IO 端口共用這個(gè)通道來(lái)申請(qǐng)中斷。

同時(shí) GPIO DETECT 信號(hào)就是通過(guò) GPIO 的 SENSE 寄存器打開(kāi),此功能始終處于啟用狀態(tài)。即便外圍設(shè)備本身是休眠狀態(tài),也不需要請(qǐng)求時(shí)鐘或其他功率密集型基礎(chǔ)架構(gòu)來(lái)啟用此功能。因此此功能可用于在系統(tǒng)啟動(dòng)時(shí)從 WFI 或 WFE 類型的睡眠時(shí),來(lái)喚醒 CPU、所有外設(shè)和 CPU 空閑。達(dá)到喚醒系統(tǒng)啟動(dòng)模式下的最低功耗模式。
為了在配置源時(shí)防止來(lái)自 PORT 事件的虛假中斷,用戶應(yīng)首先禁用 PORT 事件中的中斷(通過(guò) INTENCLR.PORT),然后配置源(PIN_CNF[n].SENSE),清除配置期間可能發(fā)生的任何潛在事件(向EVENTS_PORT寫(xiě)入“1”),最后啟用中斷(通過(guò)INTENSET.PORT)。

采用組件庫(kù)編寫(xiě) GPIOTE 輸入事件與 GPIOTE PORT 事件的主要區(qū)別:

  • 配置事件的時(shí)候選擇 IN 事件還是 PORT 事件,這個(gè)通過(guò)配置函數(shù)實(shí)現(xiàn),GPIOTE_CONFIG_IN_SENSE_HITOLO(false),當(dāng)函數(shù)參數(shù)是 false 的時(shí)候選擇 PORT 事件;當(dāng)函數(shù)參數(shù)是 true 的時(shí)候,選擇 IN 事件
  • 所有 32 個(gè) IO 端口觸發(fā)的中斷都是 INTENSET.PORT,因此配置都指向一個(gè)中斷配置就可以了。
#include <stdbool.h>
#include "nrf.h"
#include "nrf_drv_gpiote.h"
#include "app_error.h"
#include "boards.h"/**GPIOTE中斷處理*/
void in_pin_handler(nrf_drv_gpiote_pin_t pin, nrf_gpiote_polarity_t action)
{//事件由按鍵S1產(chǎn)生,即按鍵S1按下if(pin == BUTTON_1){//翻轉(zhuǎn)指示燈D1的狀態(tài)nrf_gpio_pin_toggle(LED_1);}//事件由按鍵S2產(chǎn)生,即按鍵S2按下else if(pin == BUTTON_2){//翻轉(zhuǎn)指示燈D2的狀態(tài)nrf_gpio_pin_toggle(LED_2);}//事件由按鍵S3產(chǎn)生,即按鍵S3按下else if(pin == BUTTON_3){//翻轉(zhuǎn)指示燈D3的狀態(tài)nrf_gpio_pin_toggle(LED_3);}//事件由按鍵S4產(chǎn)生,即按鍵S4按下else if(pin == BUTTON_4){//翻轉(zhuǎn)指示燈D4的狀態(tài)nrf_gpio_pin_toggle(LED_4);}}
/**
配置GPIOTE初始化*/
static void gpio_init(void)
{   //配置LED燈輸出nrf_gpio_cfg_output(LED_1);nrf_gpio_cfg_output(LED_2);nrf_gpio_cfg_output(LED_3);nrf_gpio_cfg_output(LED_4);ret_code_t err_code;//初始化GPIOTEerr_code = nrf_drv_gpiote_init();APP_ERROR_CHECK(err_code);//配置SENSE模式,選擇fales為sense配置nrf_drv_gpiote_in_config_t in_config = GPIOTE_CONFIG_IN_SENSE_HITOLO(false);in_config.pull = NRF_GPIO_PIN_PULLUP;//配置按鍵0綁定POTRerr_code = nrf_drv_gpiote_in_init(BSP_BUTTON_0, &in_config, in_pin_handler);APP_ERROR_CHECK(err_code);nrf_drv_gpiote_in_event_enable(BSP_BUTTON_0, true);//配置按鍵1綁定POTRerr_code = nrf_drv_gpiote_in_init(BSP_BUTTON_1, &in_config, in_pin_handler);APP_ERROR_CHECK(err_code);nrf_drv_gpiote_in_event_enable(BSP_BUTTON_1, true);//配置按鍵2綁定POTRerr_code = nrf_drv_gpiote_in_init(BSP_BUTTON_2, &in_config, in_pin_handler);APP_ERROR_CHECK(err_code);nrf_drv_gpiote_in_event_enable(BSP_BUTTON_2, true);//配置按鍵3綁定POTRerr_code = nrf_drv_gpiote_in_init(BSP_BUTTON_3, &in_config, in_pin_handler);APP_ERROR_CHECK(err_code);nrf_drv_gpiote_in_event_enable(BSP_BUTTON_3, true);}/**
主函數(shù),循環(huán)等待中斷*/
int main(void)
{gpio_init();while (true){// Do nothing.}
}

修改 sdk_config.h 配置文件,將其中中斷配置的事件數(shù)目修改為 4。
在這里插入圖片描述

GPIOTE 任務(wù)應(yīng)用

GPIOTE 任務(wù)觸發(fā) LED 寄存器操作

GPIOTE 具有任務(wù)模式,任務(wù)模式就是輸出模式。如果把 GPIO 管腳綁定了 GPIOTE 通道后,把它配置為任務(wù)模式,則可以實(shí)現(xiàn)輸出功能。任務(wù)模式的使用不是孤立的,一般都是由事件來(lái)觸發(fā)任務(wù),如果在事件和任務(wù)中間假設(shè)一個(gè)通道,也就是后面的 PPI,那么整個(gè)過(guò)程不需要 CPU 參與了,大大節(jié)省了 MCU 資源。

構(gòu)建工程:

在這里插入圖片描述

新建 GPIOTE.c,首先是 GPIOTE 任務(wù)初始化,初始化兩個(gè) GPIOTE 通道。初始化首先設(shè)置通道 CONFIG[0].PSEL 域設(shè)置綁定 GPIO 的 19 管腳,CONFIG[1].PSEL 綁定 20 管腳;再設(shè)置兩個(gè)通道的 CONFIG.MODE 為 TASK 任務(wù)模式;最后設(shè)置 CONFIG.POLARITY 為 OUT[0] 任務(wù)輸出位翻轉(zhuǎn)電平,OUT[1] 輸出低電平。具體如下:

#include "nrf52.h"
#include "nrf_gpio.h"
#include "GPIOTE.h"void Delay(uint32_t temp)
{for(; temp!= 0; temp--);
} void GPIOTE_TASK_Init(void)
{NVIC_EnableIRQ(GPIOTE_IRQn);//中斷嵌套設(shè)置//綁定兩個(gè)GPIOTENRF_GPIOTE->CONFIG[0] =  (GPIOTE_CONFIG_POLARITY_Toggle << GPIOTE_CONFIG_POLARITY_Pos)//設(shè)置極性,翻轉(zhuǎn)| (GPIOTE0 << GPIOTE_CONFIG_PSEL_Pos)  //綁定管腳| (GPIOTE_CONFIG_MODE_Task << GPIOTE_CONFIG_MODE_Pos);//設(shè)置模式//配置任務(wù)輸出狀態(tài)、綁定通道、任務(wù)模式(詳細(xì)說(shuō)明請(qǐng)參看青風(fēng)教程)NRF_GPIOTE->CONFIG[1] =  (GPIOTE_CONFIG_POLARITY_HiToLo << GPIOTE_CONFIG_POLARITY_Pos)//輸出低電平| (GPIOTE1<< GPIOTE_CONFIG_PSEL_Pos)  | (GPIOTE_CONFIG_MODE_Task << GPIOTE_CONFIG_MODE_Pos);配置任務(wù)輸出狀態(tài)、綁定通道、任務(wù)模式(詳細(xì)說(shuō)明請(qǐng)參看青風(fēng)教程)}

主函數(shù) main 中只需要初始化即可。

#include "nrf52.h"
#include "nrf_gpio.h"
#include "GPIOTE.h"
#include "led.h"
#include "nrf_delay.h"int main(void)
{/*初始化輸出任務(wù)*/GPIOTE_TASK_Init();while(1){//觸發(fā)輸出任務(wù)模式NRF_GPIOTE->TASKS_OUT[0]=1;//由config寄存器里的極性配置覺(jué)得輸出的信號(hào)NRF_GPIOTE->TASKS_OUT[1]=1;nrf_delay_ms(500);}
}

組件方式進(jìn)行任務(wù)配置

和前面操作類似,這里使用 SDK 庫(kù)函數(shù)的 API 進(jìn)行組件方式的任務(wù)配置。

  1. nrf_drv_gpiote_out_init,類似 nrfx_gpiote_out_init。
    在這里插入圖片描述
  2. nrf_drv_gpiote_out_task_enabel , 類似 nrfx_gpiote_out_task_enabel
    在這里插入圖片描述
    具體操作代碼如下:

#include <stdbool.h>
#include "nrf.h"
#include "nrf_drv_gpiote.h"
#include "app_error.h"
#include "nrf_delay.h"#define GPIOTE0       19
#define GPIOTE1       20void GPIOTE_TASK_Init(void){ret_code_t err_code;	//初始化GPIOTE程序模塊err_code = nrf_drv_gpiote_init();APP_ERROR_CHECK(err_code);//定義GPIOTE輸出初始化結(jié)構(gòu)體,主要是配置為翻轉(zhuǎn)模式nrf_drv_gpiote_out_config_t config1 = GPIOTE_CONFIG_OUT_TASK_TOGGLE(true);////綁定GPIOTE輸出引腳err_code = nrf_drv_gpiote_out_init(GPIOTE0, &config1);APP_ERROR_CHECK(err_code);//配置為引腳LED_3所在GPIOTE通道的任務(wù)模式nrf_drv_gpiote_out_task_enable(GPIOTE0);  //定義GPIOTE輸出初始化結(jié)構(gòu)體,主要是配置為低電平模式nrf_drv_gpiote_out_config_t config2 = GPIOTE_CONFIG_OUT_TASK_LOW;//綁定GPIOTE輸出引腳err_code = nrf_drv_gpiote_out_init(GPIOTE1, &config2);APP_ERROR_CHECK(err_code);//配置為引腳LED_4所在GPIOTE通道的任務(wù)模式nrf_drv_gpiote_out_task_enable(GPIOTE1); 	}int main(void)
{GPIOTE_TASK_Init();   while(true){ //觸發(fā)輸出,即指示燈D3,D4翻轉(zhuǎn)狀態(tài)nrf_drv_gpiote_out_task_trigger(GPIOTE0);     nrf_drv_gpiote_out_task_trigger(GPIOTE1);nrf_delay_ms(500);}
} 
http://aloenet.com.cn/news/35078.html

相關(guān)文章:

  • 網(wǎng)站頂部展出的大幅廣告推廣網(wǎng)站源碼
  • 廣州專業(yè)的網(wǎng)站建設(shè)青島建站seo公司
  • 想象力做網(wǎng)站十大免費(fèi)最虧的免費(fèi)app
  • 佛山網(wǎng)站建設(shè)百度一下首頁(yè)
  • cpa個(gè)人網(wǎng)站怎么做快速seo排名優(yōu)化
  • 網(wǎng)站建設(shè)公司做網(wǎng)站要多少費(fèi)用農(nóng)產(chǎn)品品牌推廣方案
  • 微信開(kāi)放平臺(tái)登錄好口碑的關(guān)鍵詞優(yōu)化
  • 網(wǎng)站建設(shè) 中企動(dòng)力南昌產(chǎn)品如何推廣
  • 西安免費(fèi)做網(wǎng)站哪家好大連seo外包平臺(tái)
  • 分類信息網(wǎng)站平臺(tái)的推廣新聞20字摘抄大全
  • 張家港保稅區(qū)建設(shè)規(guī)劃局網(wǎng)站湖南優(yōu)化公司
  • 做精神科網(wǎng)站專業(yè)代寫(xiě)軟文
  • 電商網(wǎng)站seoseo管理系統(tǒng)培訓(xùn)
  • 南京做網(wǎng)站公司seo排名優(yōu)化推薦
  • wordpress好看分頁(yè)北京做網(wǎng)絡(luò)優(yōu)化的公司
  • 新聞網(wǎng)站開(kāi)發(fā)書(shū)籍北京seo公司
  • 做網(wǎng)站上傳服務(wù)器嗎優(yōu)化網(wǎng)站教程
  • 海南高端網(wǎng)站建設(shè)直接打開(kāi)百度
  • 淮南 搭建一個(gè)企業(yè)展示網(wǎng)站cba最新排名
  • 電腦裝機(jī)網(wǎng)站網(wǎng)站優(yōu)化的方法有哪些
  • 營(yíng)銷型網(wǎng)站=企業(yè)登記代理網(wǎng)站關(guān)鍵詞優(yōu)化方法
  • 做網(wǎng)站那個(gè)平臺(tái)個(gè)人怎么做免費(fèi)百度推廣
  • wordpress 導(dǎo)入幻燈片優(yōu)化網(wǎng)站建設(shè)
  • 杭州設(shè)計(jì)網(wǎng)站最好的公司東莞seo建站排名
  • 網(wǎng)絡(luò)服務(wù)合同糾紛定義簡(jiǎn)述影響關(guān)鍵詞優(yōu)化的因素
  • 海南做房地產(chǎn)網(wǎng)站的網(wǎng)絡(luò)公司seo公司官網(wǎng)
  • 制作官網(wǎng)需要什么條件茶葉seo網(wǎng)站推廣與優(yōu)化方案
  • 網(wǎng)站制作手機(jī)網(wǎng)站成人培訓(xùn)班有哪些課程
  • 網(wǎng)站制作價(jià)格和流程云浮新增確診病例30例
  • 建網(wǎng)站的外包公司百度推廣怎么做步驟