如何在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
相关产品推荐
相关产品推荐

