NRF Connect SDK con Seeed Studio XIAO nRF54LM20A Sense

Introducción
nRF Connect SDK (NCS) es el kit de desarrollo de software oficial de Nordic Semiconductor, construido sobre 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 compatibilidad nativa con Bluetooth Low Energy (BLE), Thread, Matter y otras pilas de protocolos inalámbricos, así como una gestión de energía y control de periféricos más detallados. Nordic mantiene y actualiza oficialmente este SDK de forma continua, garantizando una compatibilidad óptima con el firmware del chip y acceso temprano a las funciones más recientes.
Este tutorial te guiará paso a paso por todo el proceso: desde la configuración del entorno de desarrollo de nRF Connect SDK y la instalación de la toolchain, hasta la creación y configuración de tu primer proyecto, y finalmente la grabación de tu primer programa de ejemplo en la XIAO nRF54LM20A Sense para verlo en funcionamiento.
Primeros pasos con NCS
Preparación de hardware
| Seeed Studio XIAO nRF54LM20A Sense |
|---|
![]() |
Descargar VS Code
Descarga según el sistema que estés utilizando VS Code

Instalar la extensión nRF Connect for VS Code Extension Pack
- Abre VS Code, busca e instala nRF Connect for VS Code Extension Pack. Esta extensión instalará automáticamente todas las subextensiones necesarias para la toolchain completa, incluyendo nRF Connect, Kconfig, DeviceTree y más.

- nRF Connect for VS Code Extension Pack instalará automáticamente las siguientes extensiones por ti.

Instalar la toolchain
- Instala la toolchain requerida para nRF Connect SDK. Utiliza la versión compatible; se recomienda v3.2.4.
- La serie Seeed Studio XIAO nRF54LM20A es compatible con la versión v3.2.x. Las versiones v3.3.x y superiores no son compatibles por ahora.
- La instalación inicial de la toolchain tomará algo de tiempo. Espera pacientemente.

Instalar el paquete SDK
- Abre la extensión nRF Connect, selecciona Install SDK y luego elige nRF Connect SDK.

- Selecciona la versión que coincida con tu toolchain: v3.2.4.

- Se recomienda utilizar la ruta de instalación predeterminada.

nRF Connect SDK es bastante grande. Asegúrate de tener una conexión de red estable durante la instalación para evitar fallos.
Verificación del entorno
Después de instalar la toolchain de desarrollo, el entorno integrado para nRF Connect SDK se configurará automáticamente. Para garantizar un desarrollo fluido posterior, recomendamos verificar el entorno en este paso.
- Inicia nRF Terminal, una terminal integrada de nRF Connect SDK.

- Introduce comandos para comprobar la información de versión de las herramientas necesarias. Puedes copiar y ejecutar los comandos uno por uno para la verificación.
# Check west (project manager & build entry) version
west --version
# Check CMake (build system generator) version
cmake --version
# Check Ninja (build executor) version
ninja --version
# Check Python (scripting runtime for west & Zephyr tools) version
python --version
# Check ARM cross-compiler (Zephyr toolchain for Cortex-M) version
arm-zephyr-eabi-gcc --version
# Check OpenOCD (on-chip debugger & flasher via CMSIS-DAP) version
openocd --version
- La salida se muestra a continuación. Si falta algún componente, vuelve a instalar la toolchain y asegúrate de tener una red estable durante la instalación.

Añadir la ruta de la placa personalizada
Las definiciones de placa para la serie XIAO nRF54LM20A aún no se han fusionado en el repositorio oficial de NCS, por lo que debes añadir la ruta de la placa manualmente.
- Clona el repositorio platform-seeedboards en tu directorio preferido.
git clone https://github.com/Seeed-Studio/platform-seeedboards.git

- Abre Settings en la esquina inferior izquierda de VS Code.

- Busca nRF Connect, modifica Board Roots y añade la ruta
~\your_path\platform-seeedboards\zephyr. Aquí se almacenan las definiciones de placa para la serie XIAO nRF54LM20A.

Crear una nueva aplicación
En esta sección, modificaremos un proyecto de ejemplo en blanco.
- En la extensión, selecciona Create a blank application para duplicar la plantilla.

- Nombra el proyecto
blinkyy elige una ruta de almacenamiento.

- Una vez creado, abre el proyecto copiado.

- Elimina las configuraciones originales. Este paso elimina interferencias para configurar los ajustes relacionados con XIAO nRF54LM20A en la siguiente fase.

Escribir el programa Blinky
Dado que la serie XIAO nRF54LM20A utiliza devicetree y asignaciones de pines de hardware personalizadas, es necesario modificar varios archivos. Los archivos que se deben editar se enumeran a continuación.
main.c: Programa principal que contiene la lógica de la aplicación.app.overlay: Archivo overlay de 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.

- Modificar el código en main.c
main.c
/*
* 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_led1)
#define LED_G_NODE DT_ALIAS(pwm_led2)
#define LED_B_NODE DT_ALIAS(pwm_led0)
#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 },
{ 0, 255, 0, STEP_TIME_MS },
{ 0, 0, 255, STEP_TIME_MS },
{ 255, 255, 0, STEP_TIME_MS },
{ 0, 255, 255, STEP_TIME_MS },
{ 255, 0, 255, STEP_TIME_MS },
{ 255, 255, 255, STEP_TIME_MS },
{ 0, 0, 0, STEP_TIME_MS },
};
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;
}
- Añade xiao_nrf54lm20a_nrf54lm20a_cpuapp.overlay
- Crea una carpeta board en el directorio raíz del proyecto blinky, al mismo nivel que carpetas como src.

- Crea el archivo devicetree xiao_nrf54lm20a_nrf54lm20a_cpuapp.overlay dentro de la carpeta board.
xiao_nrf54lm20a_nrf54lm20a_cpuapp.overlay
/*
* Device tree overlay for XIAO nRF54LM20A RGB LED PWM demo.
*
* PWM20 peripheral is used for RGB LED control:
* - Channel 0: P1.22 (Blue LED) -> pwm_led0
* - Channel 1: P1.23 (Red LED) -> pwm_led1
* - Channel 2: P1.24 (Green LED) -> pwm_led2
*/
&pwm20 {
status = "okay";
};
/ {
pwmleds {
compatible = "pwm-leds";
pwm_led0: pwm_led_0 {
pwms = <&pwm20 0 PWM_MSEC(20) PWM_POLARITY_NORMAL>;
label = "Blue LED";
};
pwm_led1: pwm_led_1 {
pwms = <&pwm20 1 PWM_MSEC(20) PWM_POLARITY_NORMAL>;
label = "Red LED";
};
pwm_led2: pwm_led_2 {
pwms = <&pwm20 2 PWM_MSEC(20) PWM_POLARITY_NORMAL>;
label = "Green LED";
};
};
};
/ {
aliases {
pwm-led0 = &pwm_led0;
pwm-led1 = &pwm_led1;
pwm-led2 = &pwm_led2;
};
};
- Modifica el archivo prj.conf para habilitar las configuraciones correspondientes.
CONFIG_GPIO=y
CONFIG_PWM=y
CONFIG_SERIAL=n
- Ve a la sección APPLICATIONS de la extensión y selecciona Add build configuration. Confirma las versiones del SDK y del toolchain. Establece Board Target en
xiao_nrf54lm20a/nrf54lm20a/cpuappy base configuration files enprj.conf, luego haz clic en Generate and Build para crear las configuraciones correspondientes.

Si xiao_nrf54lm20a/nrf54lm20a/cpuapp no se puede encontrar aquí, comprueba si la ruta se añadió correctamente en la sección Add Custom Board Path.
- Si la compilación se realiza correctamente, se mostrará la siguiente información en la terminal.

Programar el flasheo
En esta sección, utilizamos la herramienta west del nRF Connect SDK para flashear el programa.
- Conecta el XIAO nRF54LM20A Sense con un cable USB-C. Abre el nRF Terminal e introduce el comando west para flashear el programa.
west flash

Si el firmware que se va a flashear se genera a partir del primer archivo de configuración creado en Add build configuration, debes especificar la ruta de configuración cuando existan varias carpetas de configuración como build y build_1.
# examples: west flash configgration build_1
west flash --build-dir build_1
Observar el resultado

Soporte técnico y debate sobre el producto
Gracias por elegir nuestros productos. Estamos aquí para ofrecerte diferentes tipos de soporte y garantizar que tu experiencia con nuestros productos sea lo más fluida posible. Ofrecemos varios canales de comunicación para adaptarnos a diferentes preferencias y necesidades.
