BL654_DVK vs nrf52840 与 Zephyr blinky 项目问题

BL654_DVK vs nrf52840 with Zephyr blinky project troubles

提问人:Gambanishu Habbeba 提问时间:10/31/2023 更新时间:11/3/2023 访问量:20

问:

我想和Zephyr交朋友。我有一个BL654_DVK板,我可以编译和编程 blinky 示例。我有点理解 dts/overlay 文件(或者至少我认为我理解)。示例源代码很清楚。如果我构建并闪烁闪烁,LED 会闪烁。我试图创建另一个板,只是一个普通的 nrf52840(这是 dvk 上的内容),设置 gpio,添加一个 led,在代码中获取句柄并尝试闪烁它,但它不闪烁。到目前为止,我尝试过:

  • 为了简单起见,将 blinky 更改为不使用别名,它使用标签,并验证它是否有效
  • 我使用完全相同的源代码,对 nrf52840 目标的项目零更改
  • 我试图将所有内容从bl654_dvk dts 文件移动到我的 dts 文件,但没有运气
  • 我试图从 prj.conf 和 bl654_dvk_devconf 文件中删除所有内容
  • 我尝试在第二个项目中使用build/zephyr/.config文件中的配置。从本质上讲,这是 nRF Kconfig GUI(或使用任何其他配置)的输出

我的理解是,bl654_dvk是 nrf52840,在设备树中添加了总线、按钮和 LED。如果我只想闪烁 led1,我可以设置 nrf52840 并将 LED 添加到设备树中,这应该就足够了。

以下是在这两个项目中都有效的 main.c:

#include <zephyr/kernel.h>
#include <zephyr/drivers/gpio.h>

#define SLEEP_TIME_MS   500

static const struct gpio_dt_spec led = GPIO_DT_SPEC_GET(DT_NODELABEL(led1_label), gpios);

int main(void) {

    if (!gpio_is_ready_dt(&led)) return 0;

    if (gpio_pin_configure_dt(&led, GPIO_OUTPUT_ACTIVE) != 0) return 0;

    while (1) {
        if (gpio_pin_toggle_dt(&led) != 0) return 0;
        k_msleep(SLEEP_TIME_MS);
    }
    return 0;
}

这是我尝试在项目中使用的不起作用的 dts 文件:

/dts-v1/;
#include <nordic/nrf52840_qiaa.dtsi>

/ {
    model = "blah_board";
    compatible = "company,blah_board";

    chosen {
        zephyr,sram = &sram0;
        zephyr,flash = &flash0;
        zephyr,code-partition = &slot0_partition;
    };

    leds {
        compatible = "gpio-leds";
        led1_label: led1 {
            gpios = <&gpio0 13 GPIO_ACTIVE_HIGH>;
            label = "Blue led1";
        };
    };

};

&flash0 {
    partitions {
        compatible = "fixed-partitions";
        #address-cells = <1>;
        #size-cells = <1>;

        boot_partition: partition@0 {
            label = "mcuboot";
            reg = <0x0 0xc000>;
        };
        slot0_partition: partition@c000 {
            label = "image-0";
            reg = <0xc000 0x72000>;
        };
        slot1_partition: partition@7e000 {
            label = "image-1";
            reg = <0x7e000 0x72000>;
        };
        scratch_partition: partition@f0000 {
            label = "image-scratch";
            reg = <0xf0000 0xa000>;
        };
        storage_partition: partition@fa000 {
            label = "storage";
            reg = <0xfa000 0x6000>;
        };
    };
};


&gpio0 {
    status = "okay";
};

&gpio1 {
    status = "okay";
};

prj.config 仅在其中。CONFIG_GPIO=y

CMakeLists.txt 文件是相同的,但项目名称除外:

cmake_minimum_required(VERSION 3.20.0)
find_package(Zephyr REQUIRED HINTS $ENV{ZEPHYR_BASE})

project(test_3)

target_sources(app PRIVATE src/main.c)

我没有其他想法。知道为什么我的 LED 不闪烁吗?

Zephyr-RTOS NRF52840

评论


答:

0赞 Gambanishu Habbeba 11/3/2023 #1

谢谢你这个很好的问题,肯定每个人都在等待它!答案是(一如既往):RTFM!

现在有人可能会问:是的,是的,RTFM,但是哪一个!?

这个!答案在第 19 页。在注释部分。基本上,出于某种奇怪的原因,nRF SDK 有一个默认配置,将 nRF52 SoC 的 XTAL 选项用作 32KHz 时钟源。默认情况下,BL654(作为nRF52840)没有外部32Khz晶振,因此必须通过以下方式将其配置为使用板载RC时钟:

# 32kHz clock source
CONFIG_CLOCK_CONTROL_NRF_K32SRC_RC=y
CONFIG_CLOCK_CONTROL_NRF_K32SRC_500PPM=y

在 prj.conf 文件中。(这些行实际上位于 BL654_DVK 的 .defconfig 文件中 - BL654 的开发板)

也许有人会问:这都没问题,但是32KHz的时钟源我们又在乎什么呢,主时钟源是32MHz的晶振!答案在另一本手册中:32KHz 时钟用于 StandByDoze(和 DeepSleep)模式以节省电量。StandByDoze 模式是待机“开启”模式,它发生在每个应用程序中 - 在眨眼时也是如此。