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