app_timer_rtc.c

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

El contador RTC de 32,768 kHz sigue corriendo durante el sueño: app_timer programa una callback a 1 Hz sin bloquear nunca la CPU, que espera en WFE. Es el reloj de servicio de todo programa nRF52840 autónomo.

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 sola (cristal o RC interno de 32 kHz).

Cableado

Sin cableado; LED P0.06 para comprobar el ritmo a ojo (0,5 Hz).

Funcionamiento

app_timer convierte milisegundos en ticks RTC y lanza la callback por interrupción; APP_TIMER_TICKS gestiona la precisión. La CPU casi no consume entre ticks.

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

Crear varios temporizadores (1 Hz medida, 10 Hz BLE), o pasar al driver NRFX_TIMER para un temporizador de 16 bits de alta frecuencia.

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

← Volver a la ficha