led_blink.c

nRF52840-MDK (id boards.json : nrf52840-mdk) · Fichier : led_blink.c · Langage : C · Usage : Faire clignoter la LED utilisateur en registre pur

Le hello world bas niveau du nRF52840 : la LED clignote en écrivant directement dans les registres GPIO, sans SDK ni horloge configurée. Comprendre OUTSET/OUTCLR et PIN_CNF est la base de tout le reste sur les puces Nordic.

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 alimentée par USB ; LED utilisateur P0.06 (ou LED externe + résistance 330 Ω sur une broche libre).

Câblage

Aucun pour la LED embarquée. Externe : anode via 330 Ω sur la broche choisie, cathode vers GND (les broches tolèrent 3,3 V).

Fonctionnement

PIN_CNF configure direction et drive ; OUTSET/OUTCLR mettent la broche à 1/0 atomiquement, sans read-modify-write. Le délai est une boucle NOP calibrée à vue.

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

Remplacer le délai par le timer RTC pour dormir entre deux clignotements (version basse consommation), ou piloter deux LED en alternance.

led_blink.c

// nRF52840-MDK : clignotement LED en accès direct aux registres (zéro SDK).
// LED utilisateur MDK : P0.06 (vérifier la sérigraphie de votre révision).
#include <stdint.h>
#include "nrf.h"

#define LED_PIN  6                       // P0.06 sur MDK
#define PORT0_BASE 0x50000000UL
typedef struct { volatile uint32_t t[12]; } NRF_GPIO_Type;
#define NRF_GPIO0 ((NRF_GPIO_Type *)PORT0_BASE)

static void delay_ms(uint32_t ms) {      // boucle d'attente grossière
  for (volatile uint32_t i = 0; i < ms * 8000UL; i++) { __NOP(); }
}

int main(void) {
  // Configure P0.06 en sortie push-pull, drive standard.
  NRF_GPIO->PIN_CNF[LED_PIN] =
      (GPIO_PIN_CNF_DIR_Output << GPIO_PIN_CNF_DIR_Pos) |
      (GPIO_PIN_CNF_DRIVE_S0S1 << GPIO_PIN_CNF_DRIVE_Pos);

  for (;;) {
    NRF_GPIO->OUTSET = (1UL << LED_PIN); // LED ON (cathode vers GND)
    delay_ms(500);
    NRF_GPIO->OUTCLR = (1UL << LED_PIN); // LED OFF
    delay_ms(500);
  }
}

← Retour à la fiche