system_off.c

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

Le nRF52840 descend à quelques microampères en System Off : seule la broche configurée en SENSE peut rallumer la puce. Ce programme s'éteint après un éclair de LED et se rallume à l'appui bouton — la base d'un capteur sur pile bouton.

Matériel requis

Une carte nRF52840-MDK (Nordic nRF52840, Cortex-M4F @ 64 MHz, 1 Mo flash / 256 Ko RAM, BLE 5 + 802.15.4) avec son debugger intégré, programmée en C sous nRF5 SDK v17 et SoftDevice S140. nRF52840-MDK sur pile ou USB (consommation visible sur un µA-mètre en série).

Câblage

Bouton entre P0.02 et GND. Pour mesurer le vrai sommeil, retirer le debugger ou couper sa face alimentation.

Fonctionnement

nrf_gpio_cfg_sense_input arme le détecteur de niveau ; SYSTEMOFF coupe l'alimentation interne. Le réveil est un reset matériel : le code repart de zéro.

Exécution

Ouvrir l'exemple correspondant du nRF5 SDK v17 (target custom_board), coller ce code dans main.c, compiler avec Segger Embedded Studio ou Makefile gcc, puis programmer via le debugger intégré (flash_nrf.py ou IDE).

Variantes

Réveil périodique avec le RTC (System ON + WFE), ou réveil par NFC (champ d'un téléphone) pour un capteur sans bouton.

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 (;;) { }
}

← Retour à la fiche