提问人:Gambanishu Habbeba 提问时间:10/31/2023 更新时间:11/3/2023 访问量:20
BL654_DVK vs nrf52840 与 Zephyr blinky 项目问题
BL654_DVK vs nrf52840 with Zephyr blinky project troubles
问:
我想和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 不闪烁吗?
答:
谢谢你这个很好的问题,肯定每个人都在等待它!答案是(一如既往):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 模式是待机“开启”模式,它发生在每个应用程序中 - 在眨眼时也是如此。
上一个:使用 west 的相对路径
下一个:西风出树司机,西边看不见
评论