BL654_DVK与nRF52840的Zephyr闪烁项目故障排查求助
问题排查与解决方案
针对你基于nRF52840创建自定义板卡项目后LED无法闪烁的问题,以下是具体排查方向和解决方法:
1. 补充时钟与GPIO驱动配置
nRF52系列芯片的GPIO外设依赖时钟控制模块,仅启用CONFIG_GPIO=y不足以让GPIO正常工作。在prj.conf中添加以下配置:
CONFIG_CLOCK_CONTROL=y CONFIG_CLOCK_CONTROL_NRF5=y CONFIG_GPIO_NRF5=y CONFIG_LOG=y # 用于输出调试日志
2. 检查引脚复用冲突
nRF52840的GPIO0_13默认可能被其他外设(如UART0)占用,导致GPIO功能无法启用。查看BL654_DVK的原始dts文件,确认是否禁用了占用该引脚的外设,然后在自定义dts中添加对应禁用配置:
&uart0 { status = "disabled"; };
(注:具体外设需参考nRF52840参考手册中GPIO0_13的复用功能,若默认复用为其他外设,需禁用对应节点)
3. 验证设备树解析正确性
执行以下命令生成设备树头文件,确认LED节点是否被正确解析:
west build -t devicetree
打开build/zephyr/include/generated/devicetree_unfixed.h,搜索DT_NODELABEL(led1_label),检查以下宏是否正确:
DT_N_NODELABEL_led1_label_GPIOS_PIN应为13DT_N_NODELABEL_led1_label_GPIOS_PORT应为GPIO0对应的节点标识
4. 增强代码调试能力
修改main.c添加日志输出,明确哪一步出现异常:
#include <zephyr/kernel.h> #include <zephyr/drivers/gpio.h> #include <zephyr/logging/log.h> LOG_MODULE_REGISTER(main, LOG_LEVEL_INF); #define SLEEP_TIME_MS 500 static const struct gpio_dt_spec led = GPIO_DT_SPEC_GET(DT_NODELABEL(led1_label), gpios); int main(void) { int ret; if (!gpio_is_ready_dt(&led)) { LOG_ERR("LED GPIO device not ready"); return -1; } LOG_INF("LED GPIO device is ready"); ret = gpio_pin_configure_dt(&led, GPIO_OUTPUT_ACTIVE); if (ret != 0) { LOG_ERR("Failed to configure LED GPIO: error code %d", ret); return ret; } LOG_INF("LED GPIO configured successfully"); while (1) { ret = gpio_pin_toggle_dt(&led); if (ret != 0) { LOG_ERR("Failed to toggle LED: error code %d", ret); return ret; } k_msleep(SLEEP_TIME_MS); } return 0; }
通过串口查看日志,定位具体失败环节。
5. 确认硬件匹配性
- 验证BL654_DVK上LED1确实连接到GPIO0_13,且硬件逻辑为高电平点亮(与dts中
GPIO_ACTIVE_HIGH一致) - 若硬件为低电平点亮,需将dts中的
GPIO_ACTIVE_HIGH改为GPIO_ACTIVE_LOW
6. 检查烧录与分区一致性
- 确认自定义项目的分区表与BL654_DVK一致,烧录时选择正确的分区(如slot0)
- 烧录前可执行
west flash --erase擦除芯片Flash,避免旧固件干扰
内容的提问来源于stack exchange,提问作者Gambanishu Habbeba
相关产品推荐
相关产品推荐

