🛠 Timers matériels, interruptions imbriquées et FASTRUN : la vitesse Cortex-M4
Objetivos
Salir de delay y del polling: la Teensy 3.2 esconde una verdadera fábrica de tiempo real — un controlador de interrupciones vectorizadas anidadas (NVIC) con prioridades, 16 canales DMA de uso general, una batería de temporizadores (PDB, CMT, LPTMR, 4 contadores PIT, temporizadores FTM del PWM), la palabra clave FASTRUN para ejecutar funciones desde la RAM, y un bus doble de 32 bits (búsqueda de instrucción + datos simultáneos). Este tutorial hace parpadear el LED 13 desde un IntervalTimer de hardware y mide lo que se gana con un bucle de toggle rápido.
Material
- 1 Teensy 3.2 (el LED naranja en el pin 13 es suficiente)
- Opcional: osciloscopio o analizador lógico en un pin libre para medir las frecuencias
Código completo
digitalToggle y la clase IntervalTimer están documentados en la página de la tienda PJRC (secciones Digital Output Pins / Timing):
#include <IntervalTimer.h>
IntervalTimer t1;
volatile bool flashing = false;
void flash { // execute depuis un timer materiel, pas la boucle
digitalToggle(13); // broche 13 = LED orange integrée
}
void setup {
pinMode(13, OUTPUT);
t1.priority(0); // attention : sur Teensy, 0 = priorite LA PLUS haute
t1.begin(flash, 500000); // appelle flash toutes les 500 ms (en us)
}
void loop {
// Pour la vitesse brute, digitalToggle en boucle serrée bat les paires
// digitalWrite ; pour une forme d'onde précise, pilotez une broche PWM.
}
Acelerar el código
- digitalToggle en bucle cerrado: la salida digital más rápida en la API de Arduino; para el máximo absoluto, el acceso directo a los registros del K20 es posible — la correspondencia pin → bit de puerto debe tomarse entonces del manual del MK20DX256 (K20P64M72SF1RM.pdf) y de la tarjeta de pines card7a.
- FASTRUN:
FASTRUN void miFuncion { ... }coloca la función en los 64 KB de RAM (más rápida que la flash, 256 KB a 192 MB/s con caché de 256 bytes). - Overclock: el núcleo está especificado a 72 MHz pero oficialmente es overclockeable a 96 MHz (tabla techspecs) — el reloj proviene de un cristal de 16 MHz multiplicado por una PLL.
- Prioridades de interrupciones: el NVIC acepta el anidamiento (una interrupción de mayor prioridad interrumpe a la de menor prioridad) —
t1.priority(0)es aquí la más alta, convención Teensy. - DMA (16 canales): mueva bloques (SPI, ADC, UART, memoria) sin CPU — OctoWS2811 y la biblioteca Audio son demostraciones de ello.
Verificación esperada
El LED 13 parpadea a 1 Hz exactos, incluso si loop está ocupado por un bucle de cálculo — la prueba de que el temporizador de hardware trabaja independientemente. Comente el flash en el código: el LED permanece fijo, su código principal continúa. En el osciloscopio en un pin en toggle libre, mida la frecuencia máxima, luego compare con digitalToggle controlado por IntervalTimer a 1 µs.
Errores frecuentes
- Equivocarse en el sentido de las prioridades: en Teensy, 0 = la más alta (contrariamente a la intuición « 0 = ninguna »).
- Hacer operaciones de tiempo largo en una rutina de interrupción o de temporizador: delay, Serial.print pesados → bloqueos en cascada; mantenga las ISR cortas y use un flag volatile.
- Olvidar volatile en las variables compartidas entre ISR y loop: el compilador optimiza y su flag nunca cambia « mágicamente ».
- Poner TODO el código en FASTRUN: la RAM tiene 64 KB, la flash 256 KB — coloque solo las funciones críticas en RAM.
- Confundir los grupos de temporizadores: los 4 PIT, el LPTMR, el PDB, el CMT y los FTM no comparten los mismos pines ni los mismos usos (el LPTMR está optimizado para ultra-bajo consumo).
- Esperar un comportamiento idéntico tras el overclock a 96 MHz: verifique las bibliotecas que dependen de temporizaciones (bit-banging, retardos calibrados).
Otros tutoriales para esta placa
- Premiers pas sur la Teensy 3.2 : Teensyduino, HalfKay et premier Blink
- Broches, ADC 13 bits, DAC 12 bits et PWM : dompter les E/S de la Teensy 3.2
- Un instrument MIDI USB en 10 minutes : Bounce, boutons et règle d'or du drain
- Audio Shield SGTL5000 : boucle stéréo 44,1 kHz et outil de conception graphique
- OctoWS2811 : piloter 8 rubans WS2812 en parallèle par DMA (presque zéro CPU)
- Intégration produit : alimentation VIN/VUSB, régulateur 250 mA, RTC à quartz et EEPROM
Ejemplos de código para esta placa
clignotante.inoArduinotouche-capacitive.inoArduinoanalogique-12-bits.inoArduinomidi-piano.inoArduinopwm-respiration.inoArduinoservo-angle.inoArduino