nRF Connect SDK (NCS) es el kit de desarrollo de software oficial de Nordic Semiconductor, basado en el sistema operativo en tiempo real Zephyr RTOS. Proporciona un marco de desarrollo completo, nativo y altamente optimizado para los chips de la serie nRF. En comparación con PlatformIO, NCS ofrece a los desarrolladores un acceso más completo a todas las capacidades de hardware de la serie nRF54, incluyendo soporte nativo para Bluetooth Low Energy (BLE), Thread, Matter y otras pilas de protocolos inalámbricos, así como una gestión de energía y un control de periféricos más precisos. Nordic mantiene y actualiza este SDK de forma continua, garantizando una compatibilidad óptima con el firmware del chip y acceso anticipado a las últimas funciones.
Este tutorial te guiará paso a paso a través de todo el proceso, desde la configuración del entorno de desarrollo nRF Connect SDK y la instalación del conjunto de herramientas, hasta la creación y configuración de tu primer proyecto, y finalmente la carga de tu primer programa de ejemplo en la XIAO nRF54LM20A Sense 🔗.
Instalar Software
- Descargar Visual Studio Code –Descargar 🔗
Descargar e instalar VS Code según el sistema que estés utilizando.

- Instalar – nRF Connect for VS Code Extension Pack
En las extensiones de VS Code, busca e instala el paquete de extensiones «nRF Connect for VS Code Extension Pack» de Nordic.

- Instalar – nRF Connect SDK
- En la barra lateral, selecciona el icono de nRF Connect.
- Selecciona Instalar SDK (Install SDK).
- Después de unos segundos, aparecerá una ventana. Selecciona «nRF Connect SDK«.
- Finalmente, selecciona la versión v3.3.0.
Nota: El proceso de instalación puede tardar algún tiempo, dependiendo de tu conexión a internet.


- Comprobar instalación
Para verificar la correcta instalación de las herramientas, abre la terminal, escribe el comando y presiona Enter. Si se instaló correctamente, deberá mostrar la versión instalada.
Escribe el comando de cada herramienta. Si responde correctamente, deberá mostrar la versión instalada de la herramienta.
west --version
// West version: v1.5.0
cmake --version
// cmake version 4.2.1
ninja --version
// 1.13.2
python --version
// Python 3.11.7
arm-zephyr-eabi-gcc --version
// arm-zephyr-eabi-gcc (Zephyr SDK 0.17.0) 12.2.0
// Copyright (C) 2022 Free Software Foundation, Inc.
// This is free software; see the source for copying conditions. There is NO
// warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
openocd --version
// Open On-Chip Debugger 0.12.0+dev-01514-g21fa2de70 (2024-02-07-19:03)
// Licensed under GNU GPL v2
// For bug reports, read
// http://openocd.org/doc/doxygen/bugs.html
Descarga los archivos de la placa
Las definiciones de placa para la serie XIAO nRF54LM20A aún no se han integrado en el repositorio oficial de NCS, por lo que deberá agregar la ruta de la placa manualmente.
- Crea una carpeta para tus proyectos en una ubicación deseada.
- Copia la dirección en la barra del explorador de archivos (ejemplo: C:\Users\Dell\Desktop\Proyectos)
- En la terminal de Vs Code escribe «cd» seguido de la dirección de tu carpeta
//Ejemplo de dirección de carpeta
cd C:\Users\Dell\Desktop\Proyectos
- Descarga los archivos «platform-seeedboards».
- Opción 1 (recomendada)
- Descarga manualmente la carpeta «platform-seeedboards» y descomprime en la carpeta creada – Descargar
- Descarga manualmente la carpeta «platform-seeedboards» y descomprime en la carpeta creada – Descargar
- Opción 2
- Clona el repositorio «platform-seedboards» en la carpeta creada desde la terminal con el siguiente comando:
git clone https://github.com/Seeed-Studio/platform-seeedboards.git
- Agrega la dirección de la carpeta «Zephir» en los ajustes de Nrf-Connect
- Abre la ubicación de la carpeta «platform-seeedboards«, dentro busca la carpeta «Zephyr» y copia la dirección de la carpeta en la barra del explorador de archivos.
- Abre los ajustes (Settings) en la esquina inferior izquierda de VS Code.
- Busque «nRF Connect«, y agregue la ruta de la carpeta Zephir en «Board Roots«.
- Agrega la dirección de la carpeta «Zephir» en los ajustes de Nrf-Connect
Crea una nueva aplicación
- Crea una nueva aplicación (Create a new application).
- Busca y selecciona la carpeta donde se guardará la nueva aplicación.
- Asigna un nombre a la aplicación al final de la dirección (por ejemplo: \blinky). Se creará un archivo con ese nombre en la carpeta seleccionada.
- Selecciona Abrir (Open).
Nota: Si VS Code cambia al modo restringido, deberás cambiarlo al modo de confianza (Trust).
Ejemplo Blinky: Encender LED RGB
Dado que la serie XIAO nRF54LM20A cuenta con un árbol de dispositivos y asignaciones de pines de hardware personalizados, es necesario modificar varios archivos.
- main.c: Programa principal que contiene la lógica de la aplicación.
- app.overlay: Archivo de superposición Devicetree para la configuración de periféricos de hardware.
- prj.conf: Archivo de configuración del proyecto para habilitar los módulos Zephyr necesarios.
- Agregar xiao_nrf54lm20a_nrf54lm20a_cpuapp.overlay
Crea una carpeta llamada board en el directorio raíz del proyecto blinky, al mismo nivel que carpetas como src.- Haz clic en la zona verde y después en el icono de carpeta (flecha verde derecha).
- Escribe el nombre «board» y presiona la tecla Enter.
- Selecciona la carpeta board y haz clic en el icono de folder (flecha verde izquierda).
- Escribe el nombre «xiao_nrf54lm20a_nrf54lm20a_cpuapp.overlay» y presiona la tecla Enter. (Este archivo no contendrá código para este ejemplo.)
//Para este ejemplo no hace falta código.
- Agrega el código main.c
- En el folder «scr» selecciona el archivo «main.c» .
- Modifica el código agregando uno de los ejemplos (ejemplo #1 o #2).
- Guarda los cambios con las teclas «CTRL + S«.
/*
* Copyright (c) 2016 Intel Corporation
*
* SPDX-License-Identifier: Apache-2.0
*/
#include "zephyr/kernel.h"
#include "zephyr/device.h"
#include "zephyr/drivers/pwm.h"
#include "nrfx_power.h"
#define PWM_PERIOD_NS 1000000U
#define STEP_TIME_MS 500
#define LED_R_NODE DT_ALIAS(pwm_led0)
#define LED_G_NODE DT_ALIAS(pwm_led2)
#define LED_B_NODE DT_ALIAS(pwm_led1)
#if !DT_NODE_EXISTS(LED_R_NODE) || !DT_NODE_EXISTS(LED_G_NODE) || !DT_NODE_EXISTS(LED_B_NODE)
#error "This RGB blink demo expects pwm-led0/pwm-led1/pwm-led2 devicetree aliases"
#endif
static const struct pwm_dt_spec led_r = PWM_DT_SPEC_GET(LED_R_NODE);
static const struct pwm_dt_spec led_g = PWM_DT_SPEC_GET(LED_G_NODE);
static const struct pwm_dt_spec led_b = PWM_DT_SPEC_GET(LED_B_NODE);
struct rgb_step {
uint8_t r;
uint8_t g;
uint8_t b;
uint32_t delay_ms;
};
static int pwm_set_u8(const struct pwm_dt_spec *led, uint8_t level)
{
uint32_t duty_ns = (PWM_PERIOD_NS * (uint32_t)level) / 255U;
return pwm_set_dt(led, PWM_PERIOD_NS, duty_ns);
}
static int rgb_set(uint8_t r, uint8_t g, uint8_t b)
{
int ret;
ret = pwm_set_u8(&led_r, r);
if (ret < 0) {
return ret;
}
ret = pwm_set_u8(&led_g, g);
if (ret < 0) {
return ret;
}
ret = pwm_set_u8(&led_b, b);
if (ret < 0) {
return ret;
}
return 0;
}
int main(void)
{
#if defined(CONFIG_NRFX_POWER)
nrfx_power_constlat_mode_request();
#endif
if (!device_is_ready(led_r.dev) || !device_is_ready(led_g.dev) || !device_is_ready(led_b.dev)) {
return -1;
}
while (1) {
// Red
rgb_set(255, 0, 0);
k_msleep(STEP_TIME_MS);
// Green
rgb_set(0, 255, 0);
k_msleep(STEP_TIME_MS);
// Blue
rgb_set(0, 0, 255);
k_msleep(STEP_TIME_MS);
// Yellow
rgb_set(255, 255, 0);
k_msleep(STEP_TIME_MS);
// Cyan
rgb_set(0, 255, 255);
k_msleep(STEP_TIME_MS);
// Magenta
rgb_set(255, 0, 255);
k_msleep(STEP_TIME_MS);
// White
rgb_set(255, 255, 255);
k_msleep(STEP_TIME_MS);
// Off
rgb_set(0, 0, 0);
k_msleep(STEP_TIME_MS);
}
return 0;
}
/*
* Copyright (c) 2016 Intel Corporation
*
* SPDX-License-Identifier: Apache-2.0
*/
#include "zephyr/kernel.h"
#include "zephyr/device.h"
#include "zephyr/drivers/pwm.h"
#include "nrfx_power.h"
#define PWM_PERIOD_NS 1000000U
#define STEP_TIME_MS 500
#define LED_R_NODE DT_ALIAS(pwm_led0)
#define LED_G_NODE DT_ALIAS(pwm_led2)
#define LED_B_NODE DT_ALIAS(pwm_led1)
#if !DT_NODE_EXISTS(LED_R_NODE) || !DT_NODE_EXISTS(LED_G_NODE) || !DT_NODE_EXISTS(LED_B_NODE)
#error "This RGB blink demo expects pwm-led0/pwm-led1/pwm-led2 devicetree aliases"
#endif
static const struct pwm_dt_spec led_r = PWM_DT_SPEC_GET(LED_R_NODE);
static const struct pwm_dt_spec led_g = PWM_DT_SPEC_GET(LED_G_NODE);
static const struct pwm_dt_spec led_b = PWM_DT_SPEC_GET(LED_B_NODE);
struct rgb_step {
uint8_t r;
uint8_t g;
uint8_t b;
uint32_t delay_ms;
};
static int pwm_set_u8(const struct pwm_dt_spec *led, uint8_t level)
{
uint32_t duty_ns = (PWM_PERIOD_NS * (uint32_t)level) / 255U;
return pwm_set_dt(led, PWM_PERIOD_NS, duty_ns);
}
static int rgb_set(uint8_t r, uint8_t g, uint8_t b)
{
int ret;
ret = pwm_set_u8(&led_r, r);
if (ret < 0) {
return ret;
}
ret = pwm_set_u8(&led_g, g);
if (ret < 0) {
return ret;
}
ret = pwm_set_u8(&led_b, b);
if (ret < 0) {
return ret;
}
return 0;
}
int main(void)
{
int ret;
#if defined(CONFIG_NRFX_POWER)
nrfx_power_constlat_mode_request();
#endif
if (!device_is_ready(led_r.dev) || !device_is_ready(led_g.dev) || !device_is_ready(led_b.dev)) {
return -1;
}
static const struct rgb_step demo[] = {
{ 255, 0, 0, STEP_TIME_MS }, //red
{ 0, 255, 0, STEP_TIME_MS }, //green
{ 0, 0, 255, STEP_TIME_MS }, //blue
{ 255, 255, 0, STEP_TIME_MS }, //yellow
{ 0, 255, 255, STEP_TIME_MS }, //cyan
{ 255, 0, 255, STEP_TIME_MS }, //magenta
{ 255, 255, 255, STEP_TIME_MS }, //white
{ 0, 0, 0, STEP_TIME_MS }, //off
};
while (1) {
for (size_t i = 0; i < ARRAY_SIZE(demo); i++) {
ret = rgb_set(demo[i].r, demo[i].g, demo[i].b);
if (ret < 0) {
return ret;
}
k_msleep(demo[i].delay_ms);
}
}
return 0;
}
- Agrega la configuración prj.conf
- Selecciona el archivo «prj.conf»
- Agrega la configuración.
- Guarda los cambios con las teclas «CTRL + S«.
CONFIG_GPIO=y
CONFIG_PWM=y
CONFIG_SERIAL=n
Generar configuraciones – Build
- En aplicaciones (APPLICACTIONS), selecciona Agregar configuración de compilación (Add build configurations).
- Selecciona las versiones del SDK y la cadena de herramientas (Toolchain).
- En «Board target» busca y selecciona «xiao_nrf54lm20a/nrf54lm20a/cpuapp».
- En los archivos de configuración base (Base configuration files) agrega el archivo «prj.conf» alojado en tu carpeta de proyecto.
- Desplácese hacia abajo en la página y haga clic en Generar y compilar (Generate and Build) para generar los archivos de configuración correspondientes. (Este paso puede tardar algunos minutos)
- Si la compilación se realiza correctamente, se mostrara el archivo generado en la carpeta del proyecto.
Flashear la placa
- Conecte la XIAO nRF54LM20A Sense con un cable USB-C.
- Abre una nueva terminal nRF Connect (Open terminal).
- Escribe el comando en la terminal. Verifica el nombre del archivo (build, build_1, …) para flashear el programa.
west flash --build-dir build
west flash --build-dir build_1
Resultado:
