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 <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);
}