app_timer_rtc.c

nRF52840-MDK (id boards.json : nrf52840-mdk) · Fichier : app_timer_rtc.c · Langage : C · Usage : Exécuter une tâche périodique avec le timer RTC

Le compteur RTC 32,768 kHz continue de tourner pendant le sommeil : app_timer planifie une callback à 1 Hz sans jamais bloquer le CPU, qui attend en WFE. C'est l'horloge de service de tout programme nRF52840 autonome.

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 seule (crystal ou RC interne 32 kHz).

Câblage

Aucun câblage ; LED P0.06 pour vérifier le rythme à l'œil (0,5 Hz).

Fonctionnement

app_timer convertit les millisecondes en ticks RTC et déclenche la callback en interruption ; APP_TIMER_TICKS gère la précision. Le CPU ne consomme presque rien entre deux ticks.

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

Créer plusieurs timers (1 Hz mesure, 10 Hz BLE), ou basculer sur le driver NRFX_TIMER pour un timer 16 bits haute fréquence.

app_timer_rtc.c

// nRF52840-MDK : tâche périodique 1 Hz via app_timer (compteur RTC 32,768 kHz).
// Le CPU dort entre deux ticks : bien plus économe qu'une boucle delay().
#include "app_timer.h"
#include "nrf_gpio.h"
#include "nrf_sdh.h"

APP_TIMER_DEF(m_timer);
static volatile uint32_t secondes;

static void tick(void *ctx) {
  (void)ctx;
  secondes++;
  nrf_gpio_pin_toggle(6);          // LED à 0,5 Hz pile
  // Ici : lecture capteur, mise à jour BLE, sauvegarde...
}

int main(void) {
  nrf_sdh_enable_request();        // horloge 32 kHz gérée (SoftDevice ou LFCLK)
  if (!nrf_sdh_is_enabled()) {
    NRF_CLOCK->TASKS_LFCLKSTART = 1;
    while (!NRF_CLOCK->EVENTS_LFCLKSTARTED) { }
  }
  app_timer_init();
  app_timer_create(&m_timer, APP_TIMER_MODE_REPEATED, tick);
  app_timer_start(m_timer, APP_TIMER_TICKS(1000), NULL);

  nrf_gpio_cfg_output(6);
  for (;;) {
    // Le cœur peut dormir : le RTC et les interruptions le réveillent.
    __WFE();
    if (secondes >= 60) {          // exemple : une action par minute
      secondes = 0;
      // publish_ble_mesure();
    }
  }
}

← Retour à la fiche