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