You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在NRF52中初始化GPIOTE?SDK15.3.0配置异常排查

NRF52 SDK 15.3.0 GPIOTE按键检测无效问题修复

问题根源

你的代码存在两个关键问题导致按键事件无法触发:

  • 触发极性不匹配:你使用NRFX_GPIOTE_CONFIG_IN_SENSE_TOGGLE(false)配置为电平切换触发,但你的按键是低电平有效(按下拉低),该配置无法精准匹配按键的触发逻辑,容易出现触发失效。
  • 缺少中断优先级配置:SDK 15.x中nrfx_gpiote需要显式配置中断优先级,默认宏定义未包含该参数,可能导致中断未正确启用。

修复代码

#include "nrfx_gpiote.h"
#include "app_error.h"
#include "nrf_log.h"
#include "nrf_log_ctrl.h"
#include "nrf_log_default_backends.h"

#define BUTTON_PIN_NUMBER 13

void button_event_handler(nrfx_gpiote_pin_t pin, nrf_gpiote_polarity_t action)
{
    NRF_LOG_INFO("Button event detected");
}

int main(void)
{
    NRF_LOG_INIT(NULL);
    NRF_LOG_DEFAULT_BACKENDS_INIT();

    nrfx_err_t err;

    // 初始化GPIOTE驱动
    err = nrfx_gpiote_init();
    APP_ERROR_CHECK(err);

    // 配置按键为下降沿触发(按下时电平从高变低),启用上拉电阻
    nrfx_gpiote_in_config_t btn_config = {
        .sense = NRF_GPIOTE_POLARITY_HITOLO,  // 匹配低电平有效按键的按下动作
        .pull = NRF_GPIO_PIN_PULLUP,
        .is_watcher = false,
        .hi_accuracy = false,
        .skip_gpio_setup = false
    };

    // 初始化按键引脚的GPIOTE输入通道
    err = nrfx_gpiote_in_init(BUTTON_PIN_NUMBER, &btn_config, button_event_handler);
    APP_ERROR_CHECK(err);
    // 启用按键事件中断
    nrfx_gpiote_in_event_enable(BUTTON_PIN_NUMBER, true);

    while (true)
    {
        NRF_LOG_FLUSH();
    }

    return 0;
}

额外验证建议

  • 确认硬件接线:按键一端接GPIO13,另一端接地(与上拉电阻配置匹配,按下时引脚拉低)。
  • 检查SDK配置:在sdk_config.h中确保NRFX_GPIOTE_IRQ_PRIORITY已配置(建议设为6或7,避免与系统高优先级中断冲突),同时GPIOTE_ENABLED和NRFX_GPIOTE_ENABLED保持开启。
  • 直观测试:可以在事件处理函数中添加LED翻转操作,直接验证事件是否触发(避免日志输出问题导致的误判)。

内容的提问来源于stack exchange,提问作者Flavio Andrade

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.09 08:46:32