NRF52832开发:GPIO驱动

NRF52832开发:GPIO驱动


本文博客链接:http://blog.csdn.net/jdh99,作者:jdh,转载请注明.

 

环境:

开发环境:MDK5.23


说明:
参考Nordic公司经提供了芯片NRF52832的开发包,重新编写GPIO驱动


源代码:

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 
#include 

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

/**
* @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);
}


你可能感兴趣的:(电子)