现象是按键按下,小灯亮,按键抬起,小灯灭。

从这一节我们细致剖析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.

05-27 08:23