system_off.c

nRF52840-MDK (id boards.json: nrf52840-mdk) · Archivo : system_off.c · Lenguaje : C · Uso : Atteindre le microampère en System Off

El nRF52840 baja a unos microamperios en System Off: solo un pin configurado en SENSE puede volver a encender el chip. Este programa se apaga tras un destello de LED y despierta con el botón: la base de un sensor con pila de botón.

Hardware

Una placa nRF52840-MDK (Nordic nRF52840, Cortex-M4F @ 64 MHz, 1 MB flash / 256 KB RAM, BLE 5 + 802.15.4) con depurador integrado, programada en C con nRF5 SDK v17 y SoftDevice S140. nRF52840-MDK con pila o USB (consumo visible con un µA-metro en serie).

Cableado

Botón entre P0.02 y GND. Para medir el sueño real, retirar el depurador o cortar su lado de alimentación.

Funcionamiento

nrf_gpio_cfg_sense_input arma el detector de nivel; SYSTEMOFF corta la alimentación interna. El despertar es un reset hardware: el código empieza de cero.

Ejecución

Abre el ejemplo equivalente del nRF5 SDK v17 (objetivo custom_board), pega este código en main.c, compila con Segger Embedded Studio o el Makefile de gcc y programa por el depurador integrado.

Variantes

Despertar periódico con el RTC (System ON + WFE), o despertar por NFC (campo de un móvil) para un sensor sin botón.

system_off.c

// nRF52840-MDK : sommeil profond System Off (~0,4 µA typique).
// Réveil par appui sur le bouton P0.02 (PIN RESET) ou reset broche.
#include "nrf.h"
#include "nrf_gpio.h"

#define BTN 2U   // P0.02 : configuré en réveil bas niveau

static void configurer_reveil(void) {
  nrf_gpio_cfg_sense_input(BTN,
      NRF_GPIO_PIN_PULLUP,               // repos haut, bouton vers GND
      NRF_GPIO_PIN_SENSE_LOW);           // un niveau bas réveille la puce
}

int main(void) {
  // 1) Tâche brève : allumer la LED 100 ms pour signaler le cycle.
  nrf_gpio_cfg_output(6);
  nrf_gpio_pin_set(6);
  for (volatile int i = 0; i < 800000; i++) __NOP();
  nrf_gpio_pin_clear(6);

  // 2) Configuration du réveil puis entrée en System Off.
  configurer_reveil();
  NRF_POWER->SYSTEMOFF = 1UL;            // écriture magique : la puce s'éteint

  // Inatteignable : après réveil, le programme repart de main().
  for (;;) { }
}

← Volver a la ficha