console_uart.c

nRF52840-MDK (id boards.json : nrf52840-mdk) · Fichier : console_uart.c · Langage : C · Usage : Afficher des messages sur la console série du debugger

La console série passe par l'UART connecté au debugger de la MDK : printf léger, écho des caractères reçus, compteur de tick. Le premier outil de débogage de tout projet nRF, sans sonde JTAG.

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 reliée au PC par son USB (le debugger expose un port série).

Câblage

Aucun câblage si on garde les broches du debugger ; sinon TX/RX croisés vers un adaptateur USB-série 3,3 V.

Fonctionnement

app_uart initialise l'UART (broches et débit configurables), print formatte dans une pile puis envoie octet par octet ; app_uart_get draine le FIFO de réception.

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

Basculer sur UARTE + EasyDMA pour du vrai débit, ou rediriger printf via _write (newlib) pour un printf standard.

console_uart.c

// nRF52840-MDK : console UART via le debugger intégré (puce J-Link/CP210x).
// Broches SDK par défaut (custom_board) : TX P0.06 / RX P0.08 — adapter si besoin.
#include <stdio.h>
#include <stdarg.h>
#include "nrf_drv_uart.h"
#include "app_uart.h"

static void uart_init(void) {
  nrf_drv_uart_config_t cfg = NRF_DRV_UART_DEFAULT_CONFIG;
  cfg.pseltxd = 6;          // TX : vérifier le schéma de la carte
  cfg.pselrxd = 8;          // RX
  cfg.baudrate = NRF_UART_BAUDRATE_115200;
  app_uart_init(&cfg);
}

static void print(const char *fmt, ...) {
  char buf[128];
  va_list ap; va_start(ap, fmt);
  int n = vsnprintf(buf, sizeof buf, fmt, ap);
  va_end(ap);
  for (int i = 0; i < n; i++) app_uart_putc(buf[i]);
}

int main(void) {
  uart_init();
  print("\nnRF52840-MDK — console OK\n");
  uint32_t n = 0;
  for (;;) {
    uint8_t octet;
    while (app_uart_get(&octet) == NRF_SUCCESS) {   // écho RX
      app_uart_putc(octet);
      print("[recu 0x%02X]\n", octet);
    }
    if (++n % 500000 == 0) print("tick %u\n", n / 500000);
  }
}

← Retour à la fiche