NRF52832开发:GPIO驱动

来源:互联网 发布:艾德思奇调价软件 编辑:程序博客网 时间:2024/05/17 03:33

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