🛠 Temps réel : timers matériels et interruptions sur le GIGA R1
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
- 1 placa Arduino GIGA R1 WiFi
- 1 auricular o amplificador conectado a la toma jack integrada (DAC0)
- 1 osciloscopio lógico o un simple LED en un pin para observar la cadencia (opcional)
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.
- Olvidar
volatileen una variable compartida entre la ISR y loop: el compilador optimiza y el bucle nunca ve las actualizaciones. - Llamadas bloqueantes (Serial.print, delay) dentro de la rutina de interrupción: bloqueos y fallos; la ISR debe ser lo más corta posible.
attachInterrupten pines o modos mal admitidos: se han documentado fallos (error #789, cerrado); prefiera los tickers mbed cuando sea posible y actualice el núcleo.- Confusión entre ticker de hardware / Ticker de software (millis): solo el ticker de hardware garantiza la cadencia bajo carga.
- Frecuencia de ISR demasiado alta con el DAC: el núcleo M7 es rápido (480 MHz), pero la escritura analogWrite en la ISR tiene un coste; mida antes de aumentar la frecuencia.
Otros tutoriales para esta placa
Ejemplos de código para esta placa
clignotante.inoArduinobouton.inoArduinorespiration.inoArduinoanalogique.inoArduinodac-onde.inoArduinooled-i2c.inoArduino