🛠 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.

Objetivos

Salir del modelo «delay por todas partes» para generar una señal de audio a una cadencia exacta. El Cortex-M7 a 480 MHz del GIGA R1 dispone de temporizadores de hardware e interrupciones; utilizaremos un ticker de hardware (mbed::Ticker, expuesto por el núcleo Arduino Mbed) para muestrear una forma de onda en el DAC de 12 bits mientras loop sigue disponible. También aprenderá las precauciones relacionadas con las interrupciones debido a errores documentados (#789 en attachInterrupt).

Hardware

Código completo

// GIGA R1 WiFi — ton precis genere par ticker materiel, 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 -> frequence 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, reseau, I2C...
  }
}

Verificación esperada

Un sonido continuo y estable sale por la toma jack, sin crujidos incluso si loop realiza procesos largos. El Monitor serie muestra un contador que aumenta exactamente 10 000 veces por segundo, lo que demuestra que la cadencia es mantenida por el temporizador de hardware y no por loop.

Errores frecuentes

> NO VERIFICADO: la exposición directa del DMA de los temporizadores STM32H7 desde el núcleo Arduino no está documentada en la ficha; para DMA en bruto, utilice las capas mbed/LL o el núcleo Zephyr.

Otros tutoriales para esta placa

Ejemplos de código para esta placa

← Volver a la ficha 🛠 Todos los tutoriales