首页 > 代码库 > 硬件——nrf51822第一篇GPIO的使用

硬件——nrf51822第一篇GPIO的使用

本实现是基于一个开发箱,包括:综合应用开发系统主板XT-EDU-AK   1套; 手持终端系统 XT-EDU-HK 1套;

GPIO操作

工程:

这是一个关于流水灯的程序:

技术分享

 

 

我们先看主函数:

/** @file
*
* @defgroup blinky_example_main main.c
* @{
* @ingroup blinky_example
* @brief Blinky Example Application main file.
*
*/

#include <stdbool.h>
#include <stdint.h>
#include "nrf_delay.h"
#include "nrf_gpio.h"      //这里面有关于gpio的操作,似乎只有.h文件,没有.c文件
#include "boards.h"       //关于板子是如何设计的,例如小灯接在哪个管脚上,都可以从这里找到。

#define LEDS_NUMBER 8

const uint8_t leds_list[LEDS_NUMBER] = { LED_1, LED_2, LED_3, LED_4, LED_5, LED_6, LED_7, LED_8 };

/**
* @brief Function for application main entry.
*/
int main(void)
{
uint8_t i;

nrf_gpio_range_cfg_output(LED_STOP,LED_START); // Configure LED-pins as outputs.

while (true)
{
for (i = 0; i < LEDS_NUMBER; i++) //light in order in 50ms interval
{
nrf_gpio_pin_clear(leds_list[i]);//设置gpio为低电平,点亮小灯。
nrf_delay_ms(50);
nrf_gpio_pin_set(leds_list[i]); //设置gpio为高电平,熄灭小灯。
}
for (i = LEDS_NUMBER; i > 0; i--) //light in order in 50ms interval
{
nrf_gpio_pin_clear(leds_list[i-1]);
nrf_delay_ms(50);
nrf_gpio_pin_set(leds_list[i-1]);
}
}
}


/** @} */

在main.c中,“nrf_gpio_range_cfg_output(LED_STOP,LED_START);” 是主要部分

作用为初始化gpio为输出。

可以打开它的代码:

static __INLINE void nrf_gpio_range_cfg_output(uint32_t pin_range_start, uint32_t pin_range_end)
{
/*lint -e{845} // A zero has been given as right argument to operator ‘|‘" */
for (; pin_range_start <= pin_range_end; pin_range_start++)//这一部分没有深究
{
NRF_GPIO->PIN_CNF[pin_range_start] = (GPIO_PIN_CNF_SENSE_Disabled << GPIO_PIN_CNF_SENSE_Pos)
| (GPIO_PIN_CNF_DRIVE_S0S1 << GPIO_PIN_CNF_DRIVE_Pos)
| (GPIO_PIN_CNF_PULL_Disabled << GPIO_PIN_CNF_PULL_Pos)
| (GPIO_PIN_CNF_INPUT_Disconnect << GPIO_PIN_CNF_INPUT_Pos)
| (GPIO_PIN_CNF_DIR_Output << GPIO_PIN_CNF_DIR_Pos);
} //其实上面这些都是关于寄存器的操作。对于初学没必要掌握,只要知道如何调用函数,调用哪个函数就行。
}

 

 

在nrf_gpio.h文件中有详细的gpio操作:(可以认为是库函数都在这里面)

 下面对该文件夹下的函数进行注释:

void nrf_gpio_range_cfg_output(uint32_t pin_range_start, uint32_t pin_range_end);

void nrf_gpio_range_cfg_input(uint32_t pin_range_start, uint32_t pin_range_end, nrf_gpio_pin_pull_t pull_config);

void nrf_gpio_cfg_output(uint32_t pin_number);

void nrf_gpio_cfg_input(uint32_t pin_number, nrf_gpio_pin_pull_t pull_config);

void nrf_gpio_cfg_sense_input(uint32_t pin_number, nrf_gpio_pin_pull_t pull_config, nrf_gpio_pin_sense_t sense_config);

void nrf_gpio_pin_dir_set(uint32_t pin_number, nrf_gpio_pin_dir_t direction);

void nrf_gpio_pin_set(uint32_t pin_number);

void nrf_gpio_pin_clear(uint32_t pin_number);

void nrf_gpio_pin_toggle(uint32_t pin_number);

void nrf_gpio_pin_write(uint32_t pin_number, uint32_t value);

uint32_t nrf_gpio_pin_read(uint32_t pin_number);

nrf_gpio_port_read(nrf_gpio_port_select_t port);

void nrf_gpio_port_write(nrf_gpio_port_select_t port, uint8_t value);

void nrf_gpio_port_set(nrf_gpio_port_select_t port, uint8_t set_mask);

void nrf_gpio_port_clear(nrf_gpio_port_select_t port, uint8_t clr_mask);

void nrf_gpio_word_byte_write(volatile uint32_t * word_address, uint8_t byte_no, uint8_t value);

uint8_t nrf_gpio_word_byte_read(const volatile uint32_t* word_address, uint8_t byte_no);

void nrf_gpio_port_dir_set(nrf_gpio_port_select_t port, nrf_gpio_port_dir_t dir);

 

 

 

 

 

 

 

 

下面看一个现象:

void nrf_gpio_range_cfg_input(uint32_t pin_range_start, uint32_t pin_range_end, nrf_gpio_pin_pull_t pull_config);

//上面的函数中绿色部分是个结构体,结构体的作用是保存量类似和有联系的变量,这里是输入的方式,打开该结构体

//会看到:

typedef enum
{
NRF_GPIO_PIN_NOPULL = GPIO_PIN_CNF_PULL_Disabled, ///< Pin pullup resistor disabled
NRF_GPIO_PIN_PULLDOWN = GPIO_PIN_CNF_PULL_Pulldown, ///< Pin pulldown resistor enabled
NRF_GPIO_PIN_PULLUP = GPIO_PIN_CNF_PULL_Pullup, ///< Pin pullup resistor enabled
} nrf_gpio_pin_pull_t;

//这也许是一种编程手法

 

硬件——nrf51822第一篇GPIO的使用