[bsp层][nrf52832][nrf52840][nrf52810][nrf52820][bsp_gpio] GPIO配置和使用

发布者:温馨如家最新更新时间:2022-08-22 来源: csdn关键字:nrf52832  nrf52840  nrf52810  GPIO 手机看文章 扫描二维码
随时随地手机看文章

GPIO — General purpose input/output

通用输入/输出(GPIO)组织为一个端口多达32个I/ o(依赖于包),允许通过一个端口访问和控制多达32个引脚。 每个GPIO可以单独访问

GPIO具有以下用户可配置的特性:


最大支持32 GPIO

8 GPIO与模拟通道,用于SAADC, COMP或LPCOMP输入

可配置的输出驱动器强度

内部上拉和下拉电阻

从所有引脚的高或低电平触发器唤醒

在任何引脚上的状态改变触发中断

所有引脚都可以被PPI任务/事件系统使用

可以通过PPI和GPIOTE通道控制一个或多个GPIO输出

所有引脚可以单独映射到接口块布局灵活性

在SENSE信号上捕获的GPIO状态变化可以通过LATCH寄存器存储

GPIO端口外设最多实现32个引脚,从PIN0到PIN31。 每个这些引脚可以在PIN_CNF[n]寄存器中单独配置(n=0…31)。


**以下参数可以通过这些寄存器进行配置: **


方向(输入/输出)

驱动器强度

使能上拉和下拉电阻

引脚检测

输入缓冲区断开

模拟输入(用于选定引脚)

PIN_CNF寄存器是保留寄存器。 有关保留寄存器的更多信息,请参阅第78页的POWER - POWER supply章节。


引脚配置

引脚可以单独配置,通过PIN_CNF[n]寄存器的SENSE字段,检测其输入电平的高电平或低电平。


当在任何这样配置的引脚上检测到正确的电平时,传感机制将设置高检测信号。


每个引脚有一个单独的检测信号,默认的行为,如DETECTMODE寄存器定义的,是从GPIO端口的所有引脚的检测信号被组合成一个共同的检测信号,在整个系统中路由,然后可以被其他外围设备利用,

参见图21:第112页的GPIO端口和GPIO引脚详细信息。 这个机制在ON和OFF模式下都有作用。


在这里插入图片描述

官方手册下载:

https://infocenter.nordicsemi.com/pdf/nRF52810_PS_v1.3.pdf

https://infocenter.nordicsemi.com/pdf/nRF52820_PS_v1.2.pdf

https://infocenter.nordicsemi.com/pdf/nRF52832_PS_v1.7.pdf

https://infocenter.nordicsemi.com/pdf/nRF52840_PS_v1.5.pdf


/********************************************************************************

* @file    bsp_gpio.c

* @author  jianqiang.xue

* @version V1.0.0

* @date    2021-04-09

* @brief   gpio初始化

********************************************************************************/


/* Includes ------------------------------------------------------------------*/

#include


#include "RTE_Components.h"

#include CMSIS_device_header

#include "nrf_gpio.h"

#include "nrf_drv_gpiote.h"


#include "sdk_common.h"


#include "bsp_exti.h"

#include "bsp_gpio.h"


/* Private Includes ----------------------------------------------------------*/

#include "business_gpio.h"

#include "business_function.h"


/* Private Variables ---------------------------------------------------------*/

/* Private Function Prototypes -----------------------------------------------*/

static nrf_gpiote_polarity_t get_exti_event(bsp_gpio_exti_int_event_t exti_type)

{

    if (BSP_GPIO_EXTI_INT_LOWFALL == exti_type)

    {

        return NRF_GPIOTE_POLARITY_HITOLO;

    }

    else if (BSP_GPIO_EXTI_INT_HIGHRISE == exti_type)

    {

        return NRF_GPIOTE_POLARITY_LOTOHI;

    }

    else if (BSP_GPIO_EXTI_INT_FALLRISE == exti_type)

    {

        return NRF_GPIOTE_POLARITY_TOGGLE;

    }

    else

    {

        return NRF_GPIOTE_POLARITY_TOGGLE;

    }

}


static nrf_gpio_pin_pull_t get_nrf_pull(bsp_gpio_pin_pull_t pull)

{

    if (pull == BSP_GPIO_PIN_PULLUP)

    {

        return NRF_GPIO_PIN_PULLUP;

    }

    else if(pull == BSP_GPIO_PIN_PULLDOWN)

    {

        return NRF_GPIO_PIN_PULLDOWN;

    }

    else

    {

        return NRF_GPIO_PIN_NOPULL;

    }

}


/* Public Function Prototypes ------------------------------------------------*/

/**

 * @brief  [反初始化] 关闭指定引脚功能(恢复为浮空输入)

 * @note   NULL

 * @param  *gpiox: NULL

 * @param  pin: 引脚号

 * @retval None

 */

void bsp_gpio_deinit(void *gpiox, uint8_t pin)

{

    nrf_gpio_cfg_default(pin);

}


/**

 * @brief  [初始化] 引脚设置为输出模式

 * @note   NULL

 * @param  *gpiox: NULL

 * @param  pin: 引脚号

 * @param  out_mode:  BSP_GPIO_PIN_OUT_OD 开漏输出, BSP_GPIO_PIN_OUT_PP 推免输出, BSP_GPIO_PIN_AF_OD 复用开漏, BSP_GPIO_PIN_AF_PP 复用推免

 * @retval None

 */

void bsp_gpio_init_output(void *gpiox, uint8_t pin, bsp_gpio_pin_out_t out_mode)

{

    nrf_gpio_cfg_output(pin);

}


/**

 * @brief  [初始化] 引脚设置为输入模式

 * @note   NULL

 * @param  *gpiox: NULL

 * @param  pin: 引脚号

 * @param  pull: BSP_GPIO_PIN_NOPULL 无上下拉, BSP_GPIO_PIN_PULLUP 上拉输入, BSP_GPIO_PIN_PULLDOWN 下拉输入

 * @retval None

 */

void bsp_gpio_init_input(void *gpiox, uint8_t pin, bsp_gpio_pin_pull_t pull)

{

    nrf_gpio_cfg_input(pin, get_nrf_pull(pull));

}


extern void gpiote_event_handler(nrf_drv_gpiote_pin_t pin, nrf_gpiote_polarity_t action);

/**

  * @brief  [初始化] 引脚设置为[输入+中断]模式

  * @param  gpiox           -- NULL

  * @param  pin             -- 引脚号

  * @param  irqn            -- NULL

  * @param  exti_type       -- BSP_GPIO_EXTI_INT_LEVEL 电平触发, BSP_GPIO_EXTI_INT_EDGE 边沿触发

  * @param  exti_event      -- BSP_GPIO_EXTI_INT_LOWFALL 低电平触发(下降沿), BSP_GPIO_EXTI_INT_HIGHRISE 高电平触发(上降沿), BSP_GPIO_EXTI_INT_FALLRISE 高低电平触发或任意电平变化

  * @param  pull            -- BSP_GPIO_PIN_NOPULL 无上下拉, BSP_GPIO_PIN_PULLUP 上拉输入, BSP_GPIO_PIN_PULLDOWN 下拉输入

  */

void bsp_gpio_init_input_exit(void *gpiox, uint8_t pin, uint8_t irqn,

                              bsp_gpio_exti_int_type_t exti_type,

                              bsp_gpio_exti_int_event_t exti_event,

                              bsp_gpio_pin_pull_t pull)

{

    static bool flag = 0;

    ret_code_t err_code;


    if (flag == 0)

    {

        err_code = nrf_drv_gpiote_init();

        APP_ERROR_CHECK(err_code);

        flag = 1;

    }


    nrf_drv_gpiote_in_config_t config = GPIOTE_CONFIG_IN_SENSE_TOGGLE(exti_type);

    config.pull = get_nrf_pull(pull);

    config.sense = get_exti_event(exti_event);

    err_code = nrf_drv_gpiote_in_init(pin, &config, gpiote_event_handler);

    APP_ERROR_CHECK(err_code);

    nrf_drv_gpiote_in_event_enable(pin, true);

}


/**

 * @brief  设置引脚电平状态

 * @note   NULL

 * @param  *gpiox: NULL

 * @param  pin: 引脚号

 * @param  state: BSP_GPIO_PIN_RESET 低电平, BSP_GPIO_PIN_SET 高电平

 * @retval None

 */

void bsp_gpio_set_pin(void *gpiox, uint8_t pin, bsp_gpio_pin_state_t state)

{

    if (state)

    {

        nrf_gpio_pin_set(pin);

    }

    else

    {

        nrf_gpio_pin_clear(pin);

    }

}


/**

 * @brief  翻转引脚电平状态

 * @note   NULL

 * @param  *gpiox: NULL

 * @param  pin: 引脚号

 * @retval None

 */

void bsp_gpio_set_toggle(void *gpiox, uint8_t pin)

{

    nrf_gpio_pin_toggle(pin);

}


/**

 * @brief  得到指定gpio状态

 * @note   NULL

 * @param  *gpiox: NULL

 * @param  pin: 引脚号

 * @retval 0 -- 低电平, 1 -- 高电平

 */

bool bsp_gpio_get_state(void *gpiox, uint8_t pin)

{

    return (bool)nrf_gpio_pin_read(pin);

}


/**

 * @brief  将指定引脚复用为ADC引脚(复用模拟输入)

 * @note   NULL

 * @param  *gpiox: NULL

 * @param  pin: 引脚号

 * @retval None

 */

void bsp_gpio_init_adc(void *gpiox, uint8_t pin)

{

}


/**

 * @brief  初始化i2c引脚

 * @note   NULL

 * @param  *gpiox: NULL

 * @param  pin: 引脚号

 * @param  arf: 复用值

 * @retval None

 */

void bsp_gpio_init_i2c(void *gpiox, uint8_t pin, uint8_t arf)

{

}


/**

 * @brief  初始化uart引脚

 * @note   NULL

 * @param  *gpiox: NULL

 * @param  pin: 引脚号

 * @param  arf: 复用值

 * @retval None

 */

void bsp_gpio_init_uart(void *gpiox, uint8_t pin, uint8_t arf)

{

}


/**

 * @brief  初始化tim_ch引脚

 * @note   NULL

 * @param  *gpiox: NULL

 * @param  pin: 引脚号

 * @param  arf: 复用值

 * @retval None

 */

void bsp_gpio_init_tim(void *gpiox, uint8_t pin, uint8_t arf)

{

}


/********************************************************************************

* @file    bsp_gpio.h

* @author  jianqiang.xue

* @version V1.0.0

* @date    2021-04-09

* @brief   GPIO控制

********************************************************************************/


#ifndef __BSP_GPIO_H

#define __BSP_GPIO_H


/* Includes ------------------------------------------------------------------*/

#include

#include


/* Public enum ---------------------------------------------------------------*/

/**

 * @brief  GPIO Bit SET and Bit RESET enumeration

 */

typedef enum

{

    BSP_GPIO_PIN_RESET = 0U,

    BSP_GPIO_PIN_SET

} bsp_gpio_pin_state_t;


typedef enum

{

    BSP_GPIO_PIN_NOPULL = 0U,

    BSP_GPIO_PIN_PULLUP,

    BSP_GPIO_PIN_PULLDOWN

} bsp_gpio_pin_pull_t;


typedef enum

{

    BSP_GPIO_PIN_OUT_OD = 0U,

    BSP_GPIO_PIN_OUT_PP,

    BSP_GPIO_PIN_AF_OD,

    BSP_GPIO_PIN_AF_PP

} bsp_gpio_pin_out_t;


typedef enum

{

    BSP_GPIO_EXTI_INT_LEVEL = 0U,     // 电平触发

    BSP_GPIO_EXTI_INT_EDGE,           // 边沿触发

} bsp_gpio_exti_int_type_t;


typedef enum

{

    BSP_GPIO_EXTI_INT_LOWFALL = 0U,   // 低电平触发(下降沿)

    BSP_GPIO_EXTI_INT_HIGHRISE,       // 高电平触发(上降沿)

    BSP_GPIO_EXTI_INT_FALLRISE        // 高低电平触发或任意电平变化

} bsp_gpio_exti_int_event_t;


/* Public Function Prototypes ------------------------------------------------*/


// 常规引脚初始化


void bsp_gpio_deinit(void *gpiox, uint8_t pin);

void bsp_gpio_init_output(void *gpiox, uint8_t pin, bsp_gpio_pin_out_t out_mode);

void bsp_gpio_init_input(void *gpiox, uint8_t pin, bsp_gpio_pin_pull_t pull);

void bsp_gpio_init_input_exit(void *gpiox, uint8_t pin, uint8_t irqn, bsp_gpio_exti_int_type_t exti_type, bsp_gpio_exti_int_event_t exti_event, bsp_gpio_pin_pull_t pull);

[1] [2]
关键字:nrf52832  nrf52840  nrf52810  GPIO 引用地址:[bsp层][nrf52832][nrf52840][nrf52810][nrf52820][bsp_gpio] GPIO配置和使用

上一篇:[bsp层][nrf52832][nrf52840][nrf52810][nrf52820][bsp_exti] exti/gpioe配置和使用
下一篇:[nrf51][nrf52] 开发ibeacon指南

推荐阅读最新更新时间:2024-11-03 00:24

STM8学习笔记(二):GPIO的输入
这两天有点忙,焊了四个按键,在LED灯的基础上,实现GPIO的输入 这次用的是ST公司的官方库 组要的还是要理解GPIO的几个寄存器的功能 同时,要好好的理解它官方库里面的函数定义和用法 /**************************************************************/ void GPIO_Configuration(void) { GPIO_Init(LEDS_PORT, (LED1_PIN | LED2_PIN | LED3_PIN | LED4_PIN | LED5_PIN | LED6_PIN | LED7_PIN | LED8_PIN), GPIO_MODE_OUT_
[单片机]
ARM-Linux GPIO操作事宜
1.在嵌入式Linux GPIO表示为 S3C2410_GPx(n) ,其中x的取值为 A,B,C,D,E,F,G,H..... ,表示那个GPIO口,n的取值为 1,2,3,..... 表示第几个管脚。 例如 B口的第六管教:S3C2410_GPB(6) D口的第12管教:S3C2410_GPD(12) ..... 注 这些宏定义在arch/arm/mach-s3c2410/include/mach/gpio-nrs.h,使用#include mach/gpio-nrs.h 以下包含#include mach/hardware.h linux/gpio.h mach/regs-gpio.h 2.设置gpio的工作模
[单片机]
GPIO寄存器描述
一、端口配置低寄存器(GPIOx_CRL) (x=A..E) 控制低8位引脚 二、端口配置高寄存器(GPIOx_CRH) (x=A..E) 控制高8位引脚 三、端口输入数据寄存器(GPIOx_IDR) (x=A..E) 四、端口输出数据寄存器(GPIOx_ODR) (x=A..E) 五、端口位设置/清除寄存器(GPIOx_BSRR) (x=A..E) 六、端口位清除寄存器(GPIOx_BRR) (x=A..E) 七、端口配置锁定寄存器(GPIOx_LCKR) (x=A..E)
[单片机]
<font color='red'>GPIO</font>寄存器描述
MSP430单片机GPIO编程入门教程
在本教程中,我们将一起学习MSP430单片机GPIO的编程方法。本文也适用于Launchpad开发板上使用的MSP430x2xx器件,如MSP430G2553、MSP430G2231等。MSP430单片机上的大多数引脚被分组为最多8个端口, P1到P8。每个端口都是8位宽,并有8个相关的I / O引脚。这些引脚直接映射到相应的端口寄存器,因此可以独立操作I / O引脚。只有端口P1和P2中的引脚支持中断。 此外,每个I / O引脚还具有可配置的上拉和下拉电阻。 每个端口都有一组相关的寄存器,用来操作各个引脚。 位映射和端口分组如下所示: 注意:在编程指南/数据手册中使用的引脚的命令约定是’Px.y’,其中’x’对应的是端口号(1到
[单片机]
STM8s(3) GPIO引脚功能设置
// PXn引脚的初始化 // 输出配置 void GPIO_Init(void) { PX_DDR |= 1 n; // 1 -- 输出;0 -- 输入 PX_CR1 |= 1 n; // 1 -- 推完;0 -- 开漏 PX_CR2 |= 1 n; // 1 -- 高速;0 -- 低速 PX_ODR // 输出寄存器 } // 输入配置 void GPIO_Init(void) { PX_DDR &= 0 n; // 1 -- 输出;0 -- 输入 PX_CR1 |= 1 n; // 1 -- 上拉;0 -- 浮空 PX_CR2 |= 1 n; // 1 -- 外部中断开;0 --
[单片机]
嵌入式学习笔记之GPIO详解
GPIO,英文全称为General-Purpose IO ports,也就是通用IO口。在嵌入式系统中常常有数量众多,但是结构却比较简单的外部设备/电路,对这些设备/电路有的需要CPU为之提供控制手段,有的则需要被CPU用作输入信号。而且,许多这样的设备/电路只要求一位,即只要有开/关两种状态就够了,比如灯亮与灭。对这些设备/电路的控制,使用传统的串行口或并行口都不合适。所以在微控制器芯片上一般都会提供一个“通用可编程IO接口”,即GPIO。接口至少有两个寄存器,即“通用IO控制寄存器”与“通用IO数据寄存器”。数据寄存器的各位都直接引到芯片外部,而对这种寄存器中每一位的作用,即每一位的信号流通方向,则可以通过控制寄存器中对应位独
[网络通信]
STM8L51X gpio中断
本文采用官方的库函数接口实现STM8L51X gpio中断 STM8L51X的中断向量入口函数都放在stm8l51x_it.c里面。 不同的中断对应的中断号如下(在stm8l51x_itc.h里面): typedef enum { FLASH_IRQn = (uint8_t)1, /*! Flashinterrupt */ DMA1_CHANNEL0_1_IRQn = (uint8_t)2, /*! DMAChannels 0/1 */ DMA1_CHANNEL2_3_IRQn = (uint8_t)3, /*! DMACha
[单片机]
STM32F103--(二) GPIO实践
硬件检测的工作很快完成了。接下来是开始调试一些程序了,对于调试一个新的MCU来说,最简单的也是最重要的自然是能够控制GPIO了。 为了对MCU有个直观的了解,这里给出模块框图 1、GPIO模式的相关介绍: STM32的所有GPIO都可以设置成8中模式,主要的设置可以参考固件库的typedefine /* Configuration Mode enumeration --------------------------------------------*/ typedef enum { GPIO_Mode_AIN = 0x0,//AD输入模式 GPIO_Mode_IN_FLOATING = 0x04,//普通输
[单片机]
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved