現象是按鍵按下,小燈亮,按鍵抬起,小燈滅。
從這一節我們細致剖析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.