NRF52832 development: GPIO driver

NRF52832 development: GPIO driver


This article blog link:http://blog.csdn.net/jdh99 , author: jdh, reprint please specify.

 

surroundings:

Development environment: MDK5.23


Description:
Refer to the development kit of the chip NRF52832 provided by Nordic, and rewrite the GPIO driver


Source code:

drv_gpio.h

/**
* Copyright (c), 2015-2025
* @file drv_gpio.h
* @brief gpio驱动层头文件
* @author jdh
* @date 2017/6/27
*/

#ifndef _DRV_GPIO_H_
#define _DRV_GPIO_H_

/*********************************************************************
*							头文件
**********************************************************************/

#include <stdint.h>
#include <stdbool.h>

/*********************************************************************
*							数据结构
**********************************************************************/

/**
* @brief 上拉模式
*/

typedef enum
{
	GPIO_NOPULL = 0,
	GPIO_PULLDOWN = 1,
	GPIO_PULLUP = 3
} GPIO_Pull_Mode;


/*********************************************************************
*							函数
**********************************************************************/

/**
* @brief 配置输出模式
* @param pin: 引脚号	
*/

void drv_gpio_config_output(uint8_t pin);

/**
* @brief 配置输入模式
* @param pin: 引脚号	
* @param pull_mode: 上拉模式
*/

void drv_gpio_config_input(uint8_t pin, GPIO_Pull_Mode pull_mode);

/**
* @brief 输出高电平
* @param pin: 引脚号	
*/

void drv_gpio_set_high(uint8_t pin);

/**
* @brief 输出低电平
* @param pin: 引脚号	
*/

void drv_gpio_set_low(uint8_t pin);

/**
* @brief GPIO输出翻转
* @param pin: 引脚号	
*/

void drv_gpio_toggle(uint8_t pin);

/**
* @brief 读取引脚电平
* @param pin: 引脚号	
# @retval true: 高电平.false: 低电平
*/

bool drv_gpio_read(uint8_t pin);

#endif




drv_gpio.c

/**
* Copyright (c), 2015-2025
* @file drv_gpio.c
* @brief gpio驱动层主文件
* @author jdh
* @date 2017/6/27
* @update 2017/8/21
*/

/*********************************************************************
*							头文件
**********************************************************************/

#include "drv_gpio.h"
#include "nrf52.h"
#include "nrf52_bitfields.h"

/*********************************************************************
*							函数
**********************************************************************/

/**
* @brief 配置输出模式
* @param pin: 引脚号	
*/

void drv_gpio_config_output(uint8_t pin)
{
	NRF_P0->PIN_CNF[pin] = (GPIO_PIN_CNF_DIR_Output << GPIO_PIN_CNF_DIR_Pos) | 
							 (GPIO_PIN_CNF_INPUT_Disconnect << GPIO_PIN_CNF_INPUT_Pos) | 
							 (GPIO_PIN_CNF_PULL_Disabled << GPIO_PIN_CNF_PULL_Pos) | 
							 (GPIO_PIN_CNF_DRIVE_S0S1 << GPIO_PIN_CNF_DRIVE_Pos) | 
							 (GPIO_PIN_CNF_SENSE_Disabled << GPIO_PIN_CNF_SENSE_Pos);
}

/**
* @brief 配置输入模式
* @param pin: 引脚号	
* @param pull_mode: 上拉模式
*/

void drv_gpio_config_input(uint8_t pin, GPIO_Pull_Mode pull_mode)
{
	NRF_P0->PIN_CNF[pin] = (GPIO_PIN_CNF_DIR_Input << GPIO_PIN_CNF_DIR_Pos)
                           | (GPIO_PIN_CNF_INPUT_Connect << GPIO_PIN_CNF_INPUT_Pos)
                           | (pull_mode << GPIO_PIN_CNF_PULL_Pos)
                           | (GPIO_PIN_CNF_DRIVE_S0S1 << GPIO_PIN_CNF_DRIVE_Pos)
                           | (GPIO_PIN_CNF_SENSE_Disabled << GPIO_PIN_CNF_SENSE_Pos);
}

/**
* @brief 输出高电平
* @param pin: 引脚号	
*/

void drv_gpio_set_high(uint8_t pin)
{
	NRF_P0->OUTSET = 1 << pin;
}

/**
* @brief 输出低电平
* @param pin: 引脚号	
*/

void drv_gpio_set_low(uint8_t pin)
{
	NRF_P0->OUTCLR = 1 << pin;
}

/**
* @brief GPIO输出翻转
* @param pin: 引脚号	
*/

void drv_gpio_toggle(uint8_t pin)
{
    uint32_t pins_state = NRF_P0->OUT;

    NRF_P0->OUTSET = (~pins_state & (1UL << pin));
    NRF_P0->OUTCLR = (pins_state & (1UL << pin));
}

/**
* @brief 读取引脚电平
* @param pin: 引脚号	
# @retval true: 高电平.false: 低电平
*/

bool drv_gpio_read(uint8_t pin)
{
	return ((NRF_P0->IN >> pin) & 0x1);
}


Guess you like

Origin blog.csdn.net/jdh99/article/details/78532538