tick_basse_conso.c

nRF52833-DK (id de boards.json: nrf52833-dk) · Archivo : tick_basse_conso.c · Lenguaje : C · Uso : Réveil périodique en consommation minimale

El patrón de sensores a pila: la placa duerme 30 segundos, despierta, parpadea 1 ms y vuelve a dormir. Entre despertares la CPU está en idle y PM apaga los drivers: la base de autonomías de meses con pila de botón.

Hardware

Una placa nRF52833-DK (Nordic, SoC nRF52833 Cortex-M4F, BLE 5) alimentada por USB: 4 LED en P0.13-P0.16 (activos a nivel bajo) y 4 botones en P0.11, P0.12, P0.24, P0.25 (activos a bajo, pull-up interno a activar). La placa a pila (el MDK no tiene cargador: prever regulador o LiPo por pads) e idealmente un microamperímetro.

Cableado

Sin cableado para la prueba. En campo, alimentar por el pad VDD y medir en serie con un PPK2 o nanoamperímetro.

Funcionamiento

k_sleep(K_SECONDS(30)) deja el núcleo en idle profundo (WFI); solo la RTC cuenta el tiempo. El LED se enciende un milisegundo para que la energía por ciclo sea insignificante.

Ejecución

Proyecto Zephyr: west build -b nrf52833dk/nrf52833 y luego west flash (J-Link embarcado); consola serie 115200 en el conector USB UART.

Variantes

Despertar por GPIO (botón, alarma de sensor) en vez de timer, agrupar medidas en un único envío BLE, o apagar dominios de reloj no usados.

tick_basse_conso.c

/* Battement basse consommation : réveil toutes les 30 s.
 * Kconfig : CONFIG_PM=y, CONFIG_PM_DEVICE=y pour éteindre les
 * pilotes inutilisés ; le CPU dort en idle entre deux réveils.
 * À mesurer avec un PPK2 : l'éclair LED doit durer < 1 ms. */
#include <zephyr/kernel.h>
#include <zephyr/drivers/gpio.h>

static const struct gpio_dt_spec led =
	GPIO_DT_SPEC_GET(DT_ALIAS(led0), gpios);

int main(void)
{
	gpio_pin_configure_dt(&led, GPIO_OUTPUT_INACTIVE);

	while (1) {
		/* k_sleep = System ON idle : le noyau WFI, seule
		   l'horloge temps réel reste armée. */
		k_sleep(K_SECONDS(30));

		/* Signal visuel bref : 1 flash = un cycle de 30 s */
		gpio_pin_set_dt(&led, 1);
		k_msleep(1);
		gpio_pin_set_dt(&led, 0);

		/* Ici : lecture capteur + envoi BLE, puis redormir */
	}
	return 0;
}

← Volver a la ficha