nRF52832-GPIOTE部分


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開發教程》


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM