🛠 Temps réel : timers matériels et interruptions sur le GIGA R1

Arduino GIGA R1 · avance · Schéma : IMG-giga-r1-a2-1-timer-interruptions.svg — Les timers matériels du STM32H747XI pilotant une sortie DAC du GIGA R1 à cadence fixe pendant que la boucle loop reste libre pour le reste du programme.

Objectifs

Sortir du modèle « delay partout » pour générer un signal audio à cadence exacte. Le Cortex-M7 à 480 MHz du GIGA R1 dispose de timers matériels et d'interruptions ; nous allons utiliser un ticker matériel (mbed::Ticker, exposé par le cœur Arduino Mbed) pour échantillonner une forme d'onde sur le DAC 12 bits pendant que loop reste disponible. Vous apprendrez aussi les précautions d'interruption liées aux bogues documentées (#789 sur attachInterrupt).

Matériel

Code complet

// GIGA R1 WiFi — ton precis genere par ticker matériel, loop reste libre
#include <Arduino.h>
#include "mbed.h"

const int DAC_PIN = DAC0;          // jack audio embarque
mbed::Ticker ticker;
uint32_t phase = 0;
const uint32_t PAS = 32;           // pas de phase -> fréquence du ton
volatile uint32_t compteur = 0;    // partage ISR <-> loop : volatile obligatoire

void echantillonner {            // s'execute en contexte d'interruption
  phase = (phase + PAS) & 0xFFF;   // onde 12 bits
  analogWrite(DAC_PIN, phase);
  compteur++;
}

void setup {
  Serial.begin(115200);
  analogWriteResolution(12);
  ticker.attach(echantillonner, 0.0001);  // 10 kHz constants
}

void loop {
  static uint32_t dernier = 0;
  if (compteur - dernier >= 10000) {      // ~1 s d'echantillons a 10 kHz
    dernier = compteur;
    Serial.print("echantillons 10 kHz : ");
    Serial.println(compteur);
    // loop peut faire autre chose : capteurs, réseau, I2C...
  }
}

Vérification attendue

Un son continu et stable sort de la prise jack, sans craquement même si loop fait des traitements longs. Le Moniteur série affiche un compteur qui augmente exactement de 10 000 par seconde, preuve que la cadence est tenue par le timer matériel et non par loop.

Erreurs fréquentes

Autres tutoriels pour cette carte

Exemples de code pour cette carte

← Retour à la fiche 🛠 Tous les tutoriels