nrf52832之GPIOTE組件

今日份流水賬來咯!
參考資料:艾克姆科技 《nRF52832開發教程》

GPIOTE部分學習思維導圖

在這裏插入圖片描述

GPIOTE原理

nRF52832寄存器類型

Task:任務寄存器,可以由程序或事件觸發
Event:事件寄存器,事件可以產生中斷和觸發任務
Register:普通寄存器,和一般單片機的寄存器一樣

GPIOTE功能

GPIOTE每個通道可以使用的Task有三個
置位,清除,翻轉
GPIOTE每個同奧的事件可以由以下的輸入狀態產生
上升沿,下降沿,任意電平跳變

GPIOTE驅動庫的使用

任務/事件通道的分配

用於驅動引腳輸出的GPIOTE任務或者用於在輸入引腳電平變換時產生事件的任務/事件通道數量時受限制的,驅動程序會管理這些通道,用戶是決定不了哪個通道的,即通道分配由驅動程序完成,用戶不能指定使用哪一個具體的通道

重要的API函數

//函數功能:初始化GPIOTE通道
ret_code_t nrf_drv_gpiote_init  (void)
//函數功能:初始化GPIOTE輸出引腳
ret_code_t nrf_drv_gpiote_out_init  (
    nrf_drv_gpiote_pin_t    pin,  //初始化引腳
    nrf_drv_gpiote_out_config_t const *     p_config   //初始化結構體
)
//nrf_drv_gpiote_out_config_t要包含以下三項內容
//1)引腳的初始狀態:高電平還是低電平
//2)引腳動作:任務觸發後引腳執行的動作,包括置位,清除和翻轉
//3)是否爲GPIOTE引腳
//函數功能:使能任務觸發
void nrf_drv_gpiote_out_task_enable (nrf_drv_gpiote_pin_t   pin)   

應用步驟

GPIOTE輸出應用步驟

注意:GPIOTE一般和PPI一起用,否則體現不了GPIOTE的優勢

(1)初始化GPIOTE模塊(在一個程序中GPIOTE只能初始化一次)
(2)初始化GPIOTE輸出引腳
(3)是否使能任務觸發,雖然使用的GPIOTE模塊,但是仍可設置是任務觸發還是寫GPIO寄存器,若使能了任務觸發,則觸發任務驅動引腳,否則寫GPIO寄存器驅動引腳
(4)使能任務觸發

GPIOTE輸入應用步驟

(1)初始化GPIOTE模塊

(2)配置引腳爲GPIO輸入

ret_code_t nrf_drv_gpiote_in_init   (
    nrf_drv_gpiote_pin_t    pin,  //初始化的引腳
    nrf_drv_gpiote_in_config_t const *  p_config,  //GPIOTE輸入初始化結構體
    nrf_drv_gpiote_evt_handler_t    evt_handler   //User function to be called when the configured transition occurs.翻譯:用戶函數被稱爲配置轉變發生時
)
GPIOTE初始化結構體包括4項內容
1)Sense 配置引腳的Sense功能
	高電平到低電平的變化產生事件
	低電平到高電平的變化產生事件
	任意電平變化產生事件
2)is_watcher 是否連接輸入緩衝器
3)pull 是否開啓上拉電阻
4)hi_accuracy 是否爲高精度模式

(3)使能該引腳所在GPIOTE通道的事件模式

void nrf_drv_gpiote_in_event_enable (
    nrf_drv_gpiote_pin_t    pin,
    bool    int_enable   //True to enable the interrupt. Always valid for a high-accuracy pin,翻譯:真正的啓用中斷,高精度引腳總是有效的
)

DEMO

包括PPIGPIOTE兩部分的應用

#include <stdint.h>
#include "nrf_drv_gpiote.h"
#include "app_error.h"
#include "nrf_drv_ppi.h"
//定義引腳
#define LED_2       18
#define BUTTON_0    16
//定義nrf_ppi_channel_t變量,用來保存PPI的信息
nrf_ppi_channel_t my_ppi_channel;
//初始化PPI
void PPI_Config()
{
    uint32_t err_code = NRF_SUCCESS;
    //1 初始化PPI
    err_code=nrf_drv_ppi_init();
    APP_ERROR_CHECK(err_code);
    //2 分配PPI通道
    err_code=nrf_drv_ppi_channel_alloc(&my_ppi_channel);
    APP_ERROR_CHECK(err_code);
    //3 配置PPI通道的EEP和TEP
    err_code=nrf_drv_ppi_channel_assign(my_ppi_channel,
                               nrf_drv_gpiote_in_event_addr_get(BUTTON_0),
                               nrf_drv_gpiote_out_task_addr_get(LED_2));
    APP_ERROR_CHECK(err_code);
    //4 使能PPI通道
    err_code=nrf_drv_ppi_channel_enable(my_ppi_channel);
    APP_ERROR_CHECK(err_code);
}
//初始化GPIOTE
void GPIOTE_Config()
{
    ret_code_t err_code;
    //LED初始化爲輸出引腳
    err_code=nrf_drv_gpiote_init();
    APP_ERROR_CHECK(err_code);
    //配置結構體
    nrf_drv_gpiote_out_config_t led_config=GPIOTE_CONFIG_OUT_TASK_TOGGLE(true);
    err_code=nrf_drv_gpiote_out_init(LED_2,&led_config);
    APP_ERROR_CHECK(err_code);
    //使能任務觸發
    nrf_drv_gpiote_out_task_enable(LED_2);
    //BUTTON初始化爲輸入引腳
    nrf_drv_gpiote_in_config_t button_config=GPIOTE_CONFIG_IN_SENSE_HITOLO(true);
    button_config.pull=NRF_GPIO_PIN_PULLUP;  //開啓上拉電阻
    err_code=nrf_drv_gpiote_in_init(BUTTON_0,&button_config,NULL);
    APP_ERROR_CHECK(err_code);
    nrf_drv_gpiote_in_event_enable(BUTTON_0,true);
}
/****************************************************************
 * 描  述 : main函數
 * 入  參 : 無
 * 返回值 : 無
*****************************************************************/
int main(void)
{
    //初始化GPIOTE
    GPIOTE_Config();
    //初始化PPI
    PPI_Config();  //一定要先初始化GPIOTE,然後進行PPI的初始化
    while (true)
    {
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章