硬件——nrf51822第三篇,按鍵控制小燈


 

 

現象是按鍵按下,小燈亮,按鍵抬起,小燈滅。

從這一節我們細致剖析gpio口的設置:

nrf51822片上一共有32個數字引腳,分為4個port,如下:

port 0    pin 0-7

port 1    pin 8-15

port 2    pin 16-23

port 3    pin 24-31

每個gpio都有8個寄存器對其參數進行配置,這些寄存器均為32位,每個位對應每個gpio。

三個設置引腳輸入輸出寄存器:DIR   DIRSET    DIRCLR

三個設置引腳高低電平寄存器:OUT   OUTSET   OUTCLR 

一個讀引腳電平寄存器:IN

一個引腳配置寄存器:PIN_CNF[n]

接下來重點介紹PIN_CNF[n],在gpio的配置中,用的比較多,該寄存器有32個,分別對應32個gpio。

第0位:設置gpio接口方向

第1位:設置input buffer 是否啟用 ,作用為再輸入禁用時可以節省電流降低功耗,這對於某些對功耗要求較高的場合尤為試用。

            當有輸入時或者讀取gpio電平時都要使能input buffer,輸出時為了節省電流也要關閉該模塊。

第2-3位:設置上、下拉電阻的使能

第8-10位:設置gpio的驅動能力

第16-17位:設置監測電平的極性  對外部電平的檢測(sense功能),通俗來說可以理解為外部中斷,其原理為gpio檢測到高,低電平時會產生PORT event,

                                                     進而喚醒CPU或者響應相應的中斷機制。

 

這里應該插入一張圖片:

 

 

下面我們重新來看nrf_gpio.h文件下的函數:

nrf_gpio_range_cfg_output(uint32_t pin_range_start, uint32_t pin_range_end)  可以設置好幾個引腳

:沒有電平檢測;驅動能力是最低等級;沒有上下拉;沒有啟動input buffer;輸出;

 nrf_gpio_range_cfg_input(uint32_t pin_range_start, uint32_t pin_range_end, nrf_gpio_pin_pull_t pull_config)  可以設置好幾個引腳

:沒有電平檢測;驅動能力是最低等級;上下拉是根據傳入的參數設定的;啟動input buffer;輸入;

nrf_gpio_cfg_output(uint32_t pin_number)  設置一個引腳

:沒有電平檢測;驅動能力是最低等級;沒有上下拉;沒有啟動input buffer;輸出;

nrf_gpio_cfg_input(uint32_t pin_number, nrf_gpio_pin_pull_t pull_config)  設置一個引腳

:沒有電平檢測;驅動能力是最低等級;上下拉根據傳入參數而定;啟動input buffer;輸入;

nrf_gpio_cfg_sense_input(uint32_t pin_number, nrf_gpio_pin_pull_t pull_config, nrf_gpio_pin_sense_t sense_config)

:電平檢測高或低由傳入參數而定;驅動能力是最低等級;上下拉根據傳入參數而定;啟動input buffer;輸入;

nrf_gpio_pin_dir_set(uint32_t pin_number, nrf_gpio_pin_dir_t direction)

:沒有電平檢測;驅動能力是最低等級;沒有上下拉;啟動input buffer;輸入輸出由傳入參數決定;

nrf_gpio_pin_set(uint32_t pin_number)  //設置某個引腳為高電平

nrf_gpio_pin_clear(uint32_t pin_number)//設置某個引腳為低電平

nrf_gpio_pin_toggle(uint32_t pin_number)//翻轉某個引腳的電平

nrf_gpio_pin_write(uint32_t pin_number, uint32_t value) //寫某個引腳的電平,可以寫高,也可以寫低

nrf_gpio_pin_read(uint32_t pin_number) //讀取某個引腳的電平

nrf_gpio_word_byte_write(volatile uint32_t * word_address, uint8_t byte_no, uint8_t value) //寫多個port的值

nrf_gpio_word_byte_read(const volatile uint32_t* word_address, uint8_t byte_no) //讀多個port的值

nrf_gpio_port_dir_set(nrf_gpio_port_select_t port, nrf_gpio_port_dir_t dir) //Function for setting the direction of a port.

nrf_gpio_port_read(nrf_gpio_port_select_t port) //Function for reading a GPIO port.

nrf_gpio_port_write(nrf_gpio_port_select_t port, uint8_t value) //Function for writing to a GPIO port.

nrf_gpio_port_set(nrf_gpio_port_select_t port, uint8_t set_mask) //Function for setting individual pins on GPIO port.

nrf_gpio_port_clear(nrf_gpio_port_select_t port, uint8_t clr_mask) //Function for clearing individual pins on GPIO port.

 


免責聲明!

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



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