打造一个通用性MCU架构,支持CX32/AT32/NRF51/NRF52等。 OS支持RTX4/RTX5/FreeRtos。 采用VsCode+GCC组合,VsCode+KEIL5,超强开发方式。 QQ群:524408033

LiSun

打造一个通用性MCU架构,支持CX32/AT32/NRF51/NRF52等。 OS支持RTX4/RTX5/FreeRtos。 采用VsCode+GCC组合,VsCode+KEIL5,超强开发方式。 QQ群:524408033

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

GPIOTE—GPIO任务和事件

GPIO任务和事件(GPIOTE)模块提供了使用任务和事件访问GPIO管脚的功能。 每个GPIOTE通道可以分配到一个引脚。
GPIOTE块使GPIOs能够在引脚状态变化上生成事件,可以用于通过PPI系统执行任务。 还可以使用ppissystem驱动GPIO更改系统事件的状态。 在系统开启或关闭时,可以对引脚状态变化进行低功耗检测
Table 31: GPIOTE properties

InstanceNumber of GPIOTE channels
GPIOTE8

在每个GPIOTE通道中,最多可以使用三个任务来执行对一个引脚的写操作。 两个任务是固定的(SET和CLR),一个(OUT)是可配置的,可以执行以下操作:

  • 设置
  • 清除
  • 翻转

通过以下输入条件之一,可以在每个GPIOTE通道中生成事件:

  • 上升沿
  • 下降沿
  • 任意变化

引脚事件和任务

GPIOTE模块有许多任务和事件,可以配置为单独操作GPIO管脚。
任务(SET[n], CLR[n]和OUT[n])可用于写入单个引脚,事件(IN[n])可由单个引脚输入发生的变化产生。
SET任务将设置CONFIG[n]中选择的引脚。 PSEL到高。
CLR任务将把引脚设置为低。
OUT任务对引脚的影响在CONFIG[n]中可配置。 极性,可以设置高,低,或切换它。

任务和事件是使用CONFIG[n]寄存器配置的。 每一组set、CLR和OUT[n]任务和IN[n]事件都有一个与之相关联的CONFIG[n]寄存器。

只要设置一个SET[n], CLR[n]和OUT[n]任务或一个IN[n]事件来控制引脚n,引脚的输出值只会由GPIOTE模块更新。 因此,只要引脚是由GPIOTE控制的,GPIO中指定的引脚输出值就会被忽略。 试图写一个pin作为一个普通的GPIOpin是没有效果的。 当GPIOTE从一个引脚断开连接时,参见CONFIG[n]寄存器中的MODE字段,
相关的引脚将获得在GPIO模块中指定的输出和配置值。

当在CONFIG中选择禁用时。 MODE,由CONFIG指定的引脚。 PSEL将从PIN[n]使用它的配置。 CNF在GPIO中注册。

一个物理引脚只能分配一个GPIOTE通道。 不这样做可能会导致不可预知的行为。

当在一个通道中同时触发冲突任务时(即在同一时钟周期内),任务的优先级将如表32:157页的任务优先级所示。
表32:任务优先级

PriorityTask
1输出
2清除
3设置

当设置CONFIG[n]寄存器时,MODE=Disabled不具有与MODE=Task和极性=None相同的效果。 在后一种情况下,根据上表中描述的优先级,与OUT同时发生的CLR或SET任务最终不会对引脚进行更改。

当GPIOTE通道被配置为作为任务对一个引脚进行操作时,该引脚的初始值在CONFIG[n]的OUTINIT字段中配置。

Port event

PORT是一个可以使用GPIO DETECT信号从多个输入引脚生成的事件。
该事件将在DETECT信号的上升沿产生。 有关DETECT信号的更多信息,请参阅第111页的GPIO -通用输入/输出。
当DETECT处于高电平时,将系统置于system ON IDLE状态不会导致DETECT再次唤醒系统。 确保在进入睡眠前清除所有侦测源。 如果使用LATCH寄存器作为源,如果在清除寄存器的全部或部分后,LATCH中的任何位仍然是高的(例如由于PINx中的一个。 检测信号仍然高),一个新的上升沿将产生在检测,见引脚配置第111页。
当检测值高时,试图将系统置为“系统关闭”将导致系统关闭复位唤醒。
尽管外围设备本身看起来是IDLE的,也就是说,不需要请求时钟或其他功耗高的基础设施来保持该功能的启用,但该功能总是启用的。 因此,可以使用该特性在所有外设和CPU空闲的情况下从WFI或WFE类型的休眠中唤醒CPU,即在System ON模式下最低的功耗。
在配置源时,为了防止来自PORT事件的虚假中断,用户首先在PORT事件上禁用中断(通过INTENCLR.PORT),然后配置源 (PIN_CNF[n].SENSE),清除配置期间可能发生的任何潜在事件(将’1’写入EVENTS_PORT),最后启用中断(通过INTENSET.PORT) 。

任务和事件引脚配置
每个GPIO通道通过CONFIG与一个物理GPIO管脚相关联。 PSEL字段。
当在CONFIG中选择事件模式时。 MODE,由CONFIG指定的引脚。 PSEL将被配置为输入,覆盖GPIO中的DIR设置。 类似地,当CONFIG中选择Task模式时。 MODE,由CONFIG指定的引脚。 PSEL将被配置为覆盖GPIO中的DIR设置和OUT值的输出。

/********************************************************************************
* @file    bsp_exti.c
* @author  jianqiang.xue
* @version V1.0.0
* @date    2021-04-09
* @brief   NULL
********************************************************************************/
/* Includes ------------------------------------------------------------------*/
#include <stdint.h>
#include <stdbool.h>

#include "RTE_Components.h"
#include CMSIS_device_header
#include "nrf_drv_gpiote.h"
/* Private Includes ----------------------------------------------------------*/
/* Private Define ------------------------------------------------------------*/
/* Private Variables ---------------------------------------------------------*/
bool bsp_exti_init = false;

typedef void(*bsp_gpio_exti_callback)(void *gpiox, uint16_t gpio_pin);
static bsp_gpio_exti_callback g_irq_callback;
/* Public Function Prototypes ------------------------------------------------*/
/**
 * @brief  设置外部中断NVIC
 * @note   NULL
 * @param  irqn: 中断号(在typedef enum IRQn中,例如:USART1_IRQn)
 * @param  priority: 中断优先级
 * @retval None
 */
void bsp_exit_set(uint8_t irqn, uint32_t priority)
{
    bsp_exti_init = true;
    nrf_drv_gpiote_in_event_enable(irqn, true);
}

/**
 * @brief  清除外部中断设置
 * @note   NULL
 * @param  irqn: 中断号(在typedef enum IRQn中,例如:USART1_IRQn)
 * @retval None
 */
void bsp_exit_clear_set(uint8_t irqn)
{
    nrf_drv_gpiote_in_event_enable(irqn, false);
}

/**
 * @brief  清除外部中断标志位
 * @note   NULL
 * @param  *gpiox: 预留
 * @param  pin: 引脚号
 * @retval None
 */
void bsp_exit_clear_flag(void *gpiox, uint8_t pin)
{
}

/**
 * @brief  注册外部中事件回调函数
 * @note   NULL
 * @param  *event: 事件函数
 * @retval None
 */
bool bsp_gpio_exit_irq_register_callback(void *event)
{
    if (g_irq_callback != NULL)
    {
        return false;
    }
    else
    {
        g_irq_callback = (bsp_gpio_exti_callback)event;
    }
    return true;
}

void gpiote_event_handler(nrf_drv_gpiote_pin_t pin, nrf_gpiote_polarity_t action)
{
    if (g_irq_callback)
    {
        g_irq_callback(NULL, pin);
    }
}

/********************************************************************************
* @file    bsp_exti.h
* @author  jianqiang.xue
* @version V1.0.0
* @date    2021-04-09
* @brief   NULL
********************************************************************************/

#ifndef __BSP_EXTI_H
#define __BSP_EXTI_H

/* Includes ------------------------------------------------------------------*/
#include <stdint.h>

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

void bsp_exit_set(uint8_t irqn, uint32_t priority);
void bsp_exit_clear_set(uint8_t irqn);
void bsp_exit_clear_flag(void *gpiox, uint8_t pin);

// 引脚外部中断回调

bool bsp_gpio_exit_irq_register_callback(void *event);

#endif

官方手册下载:
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

posted on 2022-08-13 11:00  xuejianqiang  阅读(58)  评论(0编辑  收藏  举报
打造一个通用性MCU架构,支持CX32/AT32/NRF51/NRF52等。 OS支持RTX4/RTX5/FreeRtos。 采用VsCode+GCC组合,VsCode+KEIL5,超强开发方式。 QQ群:524408033