Hi,
I have created my own hardware with nRF54L15 – 2xLED, 2xPWM, and Radio (BLE). I am trying to create a custom board using the graphical wizard.
LED and PWM seems to work – the project compiles, but I could not test it on hardware yet.
Now, I want to add BLE support - advertising and connection. How can I prepare my board in DeviceTree (DTS), or in the graphical wizard? Is there any step-by-step guide or tutorial for this?
Thank you very much for your help!

I found this gpio-radio-coex:

in prj.conf I added:
# BLE CONFIG_BT=y CONFIG_BT_DEVICE_NAME="ZGuard" CONFIG_BT_PERIPHERAL=y CONFIG_BT_EXT_ADV=y CONFIG_CLOCK_CONTROL_NRF=y # LFCLK: (32.768 kHz) CONFIG_CLOCK_CONTROL_NRF_K32SRC_RC=y CONFIG_CLOCK_CONTROL_NRF_K32SRC_XTAL=n CONFIG_CLOCK_CONTROL_NRF_K32SRC_500PPM=y
CONFIG_ARM_MPU=y CONFIG_HW_STACK_PROTECTION=y CONFIG_NULL_POINTER_EXCEPTION_DETECTION_NONE=y CONFIG_CACHE_MANAGEMENT=y CONFIG_EXTERNAL_CACHE=y # Start SYSCOUNTER on driver init CONFIG_NRF_GRTC_START_SYSCOUNTER=y #Pro tickless režim - netikame každou 1 ms CONFIG_TICKLESS_KERNEL=y CONFIG_SYS_CLOCK_TICKS_PER_SEC=1000 CONFIG_NRFX_POWER=y # Enable RTT CONFIG_USE_SEGGER_RTT=y # enable GPIO CONFIG_GPIO=y # enable uart driver CONFIG_SERIAL=y # enable console CONFIG_CONSOLE=y CONFIG_UART_CONSOLE=y # Použít externí 32 MHz krystal pro HFCLK – Zephyr nastavuje automaticky, pokud je dostupný CONFIG_CLOCK_CONTROL_NRF=y # LFCLK: použít interní RC oscilátor (32.768 kHz) CONFIG_CLOCK_CONTROL_NRF_K32SRC_RC=y CONFIG_CLOCK_CONTROL_NRF_K32SRC_XTAL=n # Přesnost RC oscilátoru CONFIG_CLOCK_CONTROL_NRF_K32SRC_500PPM=y
This is in my .dts:
/dts-v1/;
#include <nordic/nrf54l15_cpuapp.dtsi>
#include "ZoneGuard_HW_v2_0-pinctrl.dtsi"
#include <zephyr/dt-bindings/input/input-event-codes.h>
/ {
model = "Main control board for ZoneGuard system with nRF54L15";
compatible = "Ropixon,ZoneGuard-HW-v2-0-cpuapp";
chosen {
zephyr,code-partition = &slot0_partition;
zephyr,sram = &cpuapp_sram;
zephyr,flash = &cpuapp_rram;
zephyr,console = &uart00;
zephyr,uart-console = &uart00;
};
leds {
compatible = "gpio-leds";
led_red: led_red {
label = "LED_RED";
gpios = <&gpio1 6 GPIO_ACTIVE_LOW>;
};
led_green: led_green {
label = "LED_GREEN";
gpios = <&gpio1 7 GPIO_ACTIVE_LOW>;
};
};
buttons {
compatible = "gpio-keys";
zg_button: zg_button {
label = "BTN";
gpios = <&gpio2 1 0>;
};
};
pwm_ctrl {
compatible = "pwm-leds";
pwm_beep: pwm_beep {
label = "BEEP";
pwms = <&pwm20 0 PWM_MSEC(20) PWM_POLARITY_NORMAL>;
};
pwm_shock: pwm_shock {
label = "SHOCK";
pwms = <&pwm20 1 PWM_MSEC(1) PWM_POLARITY_NORMAL>;
};
};
aliases {
led0 = &led_red;
led1 = &led_green;
button0 = &zg_button;
buzzer = &pwm_beep; // teď už &pwm_beep je validní
};
};
&cpuapp_sram {
status = "okay";
};
&grtc {
owned-channels = <0 1 2 3 4 5 6 7 8 9 10 11>;
/* Channels 7-11 reserved for Zero Latency IRQs, 3-4 for FLPR */
child-owned-channels = <3 4 7 8 9 10 11>;
status = "okay";
};
&cpuapp_rram {
partitions {
compatible = "fixed-partitions";
#address-cells = <1>;
#size-cells = <1>;
boot_partition: partition@0 {
label = "mcuboot";
reg = <0x0 DT_SIZE_K(64)>;
};
slot0_partition: partition@10000 {
label = "image-0";
reg = <0x10000 DT_SIZE_K(324)>;
};
slot0_ns_partition: partition@61000 {
label = "image-0-nonsecure";
reg = <0x61000 DT_SIZE_K(324)>;
};
slot1_partition: partition@b2000 {
label = "image-1";
reg = <0xb2000 DT_SIZE_K(324)>;
};
slot1_ns_partition: partition@103000 {
label = "image-1-nonsecure";
reg = <0x103000 DT_SIZE_K(324)>;
};
/* 32k from 0x154000 to 0x15bfff reserved for TF-M partitions */
storage_partition: partition@15c000 {
label = "storage";
reg = <0x15c000 DT_SIZE_K(36)>;
};
};
};
&gpio0 {
status = "okay";
};
&gpio2 {
status = "okay";
};
&gpio1 {
status = "okay";
};
&uart00 {
status = "okay";
current-speed = <115200>;
pinctrl-0 = <&uart00_default>;
pinctrl-names = "default";
};
&pinctrl {
uart00_default: uart00_default {
group1 {
psels = <NRF_PSEL(UART_TX, 1, 1)>, <NRF_PSEL(UART_RX, 1, 2)>;
};
};
pwm20_default: pwm20_default {
group1 {
psels = <NRF_PSEL(PWM_OUT0, 0, 0)>, <NRF_PSEL(PWM_OUT1, 0, 1)>;
};
};
};
&pwm20 {
status = "okay";
pinctrl-0 = <&pwm20_default>;
pinctrl-names = "default";
};
&gpiote20 {
status = "okay";
};
&gpiote30 {
status = "okay";
};
this is my .overlay:
&radio {
status = "okay";
};
&bt_hci_controller {
status = "okay";
};
[140/234] Building C object zephyr/subsys/bluetooth/host/CMakeFiles/subsys__bluetooth__host.dir/gatt.c.obj In file included from c:\ncs\v3.0.0\zephyr\modules\hal_nordic\nrfx\nrfx_config.h:23, from C:/ncs/v3.0.0/modules/hal/nordic/nrfx/nrfx.h:37, from c:\ncs\v3.0.0\zephyr\soc\nordic\common\soc_nrf_common.h:14, from c:\ncs\v3.0.0\zephyr\soc\nordic\nrf54l\soc.h:14, from c:\ncs\v3.0.0\zephyr\modules\cmsis\cmsis_core_m.h:24, from c:\ncs\v3.0.0\zephyr\modules\cmsis\cmsis_core.h:10, from C:/ncs/v3.0.0/zephyr/include/zephyr/arch/arm/asm_inline_gcc.h:24, from C:/ncs/v3.0.0/zephyr/include/zephyr/arch/arm/asm_inline.h:18, from C:/ncs/v3.0.0/zephyr/include/zephyr/arch/arm/arch.h:30, from C:/ncs/v3.0.0/zephyr/include/zephyr/arch/cpu.h:19, from C:/ncs/v3.0.0/zephyr/include/zephyr/kernel_includes.h:36, from C:/ncs/v3.0.0/zephyr/include/zephyr/kernel.h:17, from C:/ncs/v3.0.0/zephyr/include/zephyr/net_buf.h:16, from C:/ncs/v3.0.0/zephyr/include/zephyr/bluetooth/bluetooth.h:32, from C:/ncs/v3.0.0/zephyr/include/zephyr/bluetooth/conn.h:23, from C:/ncs/v3.0.0/zephyr/include/zephyr/bluetooth/att.h:21, from C:/ncs/v3.0.0/zephyr/subsys/bluetooth/host/gatt.c:12: c:\ncs\v3.0.0\zephyr\modules\hal_nordic\nrfx\nrfx_config_reserved_resources_ncs.h:85: warning: "NRFX_DPPI10_CHANNELS_USED_BY_BT_CTLR" redefined 85 | #define NRFX_DPPI10_CHANNELS_USED_BY_BT_CTLR SDC_DPPIC10_CHANNELS_USED_MASK | c:\ncs\v3.0.0\zephyr\modules\hal_nordic\nrfx\nrfx_config_reserved_resources_ncs.h:63: note: this is the location of the previous definition 63 | #define NRFX_DPPI10_CHANNELS_USED_BY_BT_CTLR BT_CTLR_USED_PPI_CHANNELS | ninja: build stopped: subcommand failed. FATAL ERROR: command exited with status 1: