GPIO操作是單片機(jī)最基本和最常用的操作,在配置GPIO控制LED燈、檢測(cè)按鍵輸入等功能時(shí)都需要用到。NRF52832的GPIO可設(shè)置為:輸入、輸出、復(fù)用和模擬通道 4 種模式,一部分與I2C,SPI,UART復(fù)用。管腳內(nèi)部結(jié)構(gòu)如下圖所示:
一、GPIO寄存器
1、OUT寄存器:實(shí)現(xiàn)寫GPIO端口,bit0-31對(duì)應(yīng)引腳P0.00-P0.31,為0表示引腳輸出低電平,為1表示引腳輸出高電平;
2、OUTSET寄存器:實(shí)現(xiàn)引腳置位,bit0-31對(duì)應(yīng)引腳P0.00-P0.31;
3、OUTCLR寄存器:實(shí)現(xiàn)引腳清零;
4、IN寄存器:實(shí)現(xiàn)讀GPIO端口;
5、DIR寄存器:實(shí)現(xiàn)引腳的方向配置,為0引腳是輸入方向,為1引腳是輸出方向;
6、DIRSET寄存器:實(shí)現(xiàn)引腳輸出方向配置;
7、DIRCLR寄存器:實(shí)現(xiàn)引腳輸入方向配置;
8、LATCH寄存器:實(shí)現(xiàn)鎖存電平信號(hào);
9、DETECTMODE寄存器:實(shí)現(xiàn)檢測(cè)模式配置;
10、PIN_CNF[n](n=0-31)寄存器:實(shí)現(xiàn)輸入緩沖器、上下拉電阻、驅(qū)動(dòng)能力等的配置。
二、相關(guān)庫(kù)函數(shù)介紹
1、void nrf_gpio_cfg_output(uint32_t pin_number)功能:設(shè)置指定引腳為輸出方向
2、void nrf_gpio_range_cfg_output(uint32_t pin_range_start,uint32_t pin_range_end)功能:設(shè)置指定范圍內(nèi)的連續(xù)引腳為輸出方向
3、void nrf_gpio_cfg_input(uint32_t pin_number,nrf_gpio_pin_pull_t pull_config)功能:設(shè)置指定引腳為輸入方向
4、void nrf_gpio_range_cfg_input(uint32_t pin_range_start,uint32_t pin_range_end,nrf_gpio_pin_pull_t pull_config)功能:設(shè)置指定范圍內(nèi)的連續(xù)引腳為輸入方向
5、void nrf_gpio_pin_set(uint32_t pin_number)功能:驅(qū)動(dòng)指定的GPIO輸出高電平
6、void nrf_gpio_pin_clear(uint32_t pin_number)功能:驅(qū)動(dòng)指定的GPIO輸出低電平
7、void nrf_gpio_pin_toggle(uint32_t pin_number)功能:翻轉(zhuǎn)指定的GPIO輸出狀態(tài)
8、uint32_t nrf_gpio_pin_read(uint32_t pin_number)功能:讀取指定引腳的電平狀態(tài),0代表低電平,1代表高電平
9、uint32_t nrf_gpio_port_in_read(NRF_GPIO_Type const * p_reg)功能:讀取端口所有的GPIO的狀態(tài)
三、程序示例
1、 點(diǎn)亮LED:
void LED_Init(void)
{ // 輸出
nrf_gpio_cfg_output(LED_0);
nrf_gpio_cfg_output(LED_1);
nrf_gpio_cfg_output(LED_2);
nrf_gpio_cfg_output(LED_3);
}
void LED1_Open(void)
{
nrf_gpio_pin_set(LED_0);
}
void LED1_Close(void)
{
nrf_gpio_pin_clear(LED_0);
}
void LED1_Toggle(void)
{
nrf_gpio_pin_toggle(LED_0);
}
2、按鍵檢測(cè):
void KEY_Init(void)
{
nrf_gpio_cfg_input(KEY1,NRF_GPIO_PIN_PULLUP);
nrf_gpio_cfg_input(KEY2,NRF_GPIO_PIN_PULLUP);
}
uint8_t KEY_Scan(void)
{
if(nrf_gpio_pin_read(KEY1) == 0)
{
nrf_delay_ms(10);
if(nrf_gpio_pin_read(KEY1) == 0)
{
while(nrf_gpio_pin_read(KEY1) == 0); //檢測(cè)按鍵是否釋放
return KEY1_OK;
}
else
return 0;
}
else
return 0;
return 0;
}