本实现是基于一个开发箱,包括:综合应用开发系统主板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;
//这也许是一种编程手法