GPIOTE部分學習思維導圖
GPIOTE原理
1.1nRF52832寄存器類型
Task:任務寄存器,可以由程序或事件觸發
Event:事件寄存器,事件可以產生中斷和觸發任務
Register:普通寄存器,和一般單片機的寄存器一樣
1.2GPIOTE功能
GPIOTE每個通道可以使用的Task有三個
置位,清除,翻轉
GPIOTE每個同奧的事件可以由以下的輸入狀態產生
上升沿,下降沿,任意電平跳變
1.3引腳Tasks和Events
1.4PORT事件
1.5相關寄存器
GPIOTE驅動庫的使用
2.1任務/事件通道的分配
用於驅動引腳輸出的GPIOTE任務或者用於在輸入引腳電平變換時產生事件的
任務/事件通道數量時受限制的,驅動程序會管理這些通道,用戶是決定不了哪個通道的,
也就是說通道分配由驅動程序完成,用戶不能指定使用哪一個具體的通道。
2.2重要的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 )
2.3應用步驟
2.3.1GPIOTE輸出應用步驟
注意:GPIOTE一般和PPI一起用,否則體現不了GPIOTE的優勢
(1)初始化GPIOTE模塊(在一個程序中GPIOTE只能初始化一次)
(2)初始化GPIOTE輸出引腳
(3)是否使能任務觸發,雖然使用的GPIOTE模塊,但是仍可設置是任務
觸發還是寫GPIO寄存器,若使能了任務觸發,則觸發任務驅動引腳,否則寫GPIO寄存器驅動引腳
(4)使能任務觸發
2.3.2GPIOTE輸入應用步驟
(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
包括PPI和GPIOTE兩部分的應用
#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)
{
}
}
參考資料
1 艾克姆科技 《nRF52832開發教程》