🛠 Ingénierie mémoire du Teensy 4.1 : TCM, DMAMEM, EXTMEM, flash QSPI et EEPROM
Objectifs
Le Teensy 4.1 est une machine à mémoire : 1 024 Ko de RAM (512 Ko RAM1 en TCM accès cycle unique + 512 Ko RAM2 optimisée DMA), 8 Mo de flash QSPI (7 936 Ko utilisables, les 256 Ko supérieurs étant réservés à l'EEPROM émulée et au programme de secours), deux caches 32 Ko, et deux empreintes QSPI vides sous la carte pour souder de la PSRAM. Ce tutoriel range consciemment chaque donnée au bon endroit.
Les mots-clés
FASTRUN: code placé dans le TCM d'instruction (ITCM) — comportement par défaut du compilateur Teensy.DMAMEM: buffer en RAM2, seule mémoire optimisée pour le DMA ; le tas (malloc, new, String Arduino) y vit aussi.EXTMEM+extmem_malloc: données dans la PSRAM soudée. Attention au piège documenté : avec une seule puce, elle doit aller sur la plus petite des deux empreintes ; la plus grande accueille certaines puces de flash LittleFS.PROGMEM/F: constantes dans le flash QSPI (bande passante flash listée à 1 984 Mo/s dans les techspecs).- EEPROM : 4 284 octets émulés — et chaque écriture fait pause l'exécution depuis le flash. À bannir des boucles temps-réel.
- 16 octets de RAM RTC sauvegardés par pile (LPGPR0-LPGPR3) survivent à l'extinction.
Code complet
#include <InternalTemperature.h>
DMAMEM uint8_t audioBuf[8192]; // RAM2, compatible DMA
EXTMEM uint8_t bigBuf[1024 * 1024]; // PSRAM : ne lie que si la puce est soudée
const char msg[] PROGMEM = "constante dans le flash QSPI";
void setup {
Serial.begin(9600);
while (!Serial && millis < 3000);
}
void loop {
Serial.print("Temp. die : ");
Serial.print(InternalTemperature.readTemperature); // capteur embarqué
Serial.print(" C | tas libre (RAM2) : ");
Serial.print(malloc_free / 1024);
Serial.println(" Ko");
delay(1000);
}
Vérification attendue
Avec une puce PSRAM soudée sur la petite empreinte, le sketch compile avec EXTMEM et le moniteur affiche température du die et tas libre. Sans PSRAM, le mot-clé EXTMEM provoque une erreur de compilation — c'est le signal de vérifier l'empreinte.
Erreurs fréquentes
- Souder l'unique puce PSRAM sur la grande empreinte : non fonctionnel, documenté par PJRC.
- Mettre un buffer DMA en RAM1 : le DMA vise RAM2 ; utilisez
DMAMEM. - Écrire en EEPROM à chaque boucle pour « sauvegarder » : les écritures bloquent l'exécution depuis le flash — micro-coupures garanties.
- Compter 8 192 Ko de flash libre : retirez les 256 Ko réservés → 7 936 Ko.
- Ignorer l'overclocking : 912 MHz est officiellement supporté avec montée automatique de la tension du cœur (1,25 V à 600 MHz) ; en soutenu, prévoyez la thermique — PJRC note qu'un retour à ≤ 528 MHz réduit la consommation (~100 mA typiques à 600 MHz).
Autres tutoriels pour cette carte
- Premiers pas sur le Teensy 4.1 : Teensyduino, Teensy Loader et premier Blink
- GPIO et PWM sur le Teensy 4.1 : 55 broches en 3,3 V, ni 5 V tolérées ni traîne
- Entrées analogiques du Teensy 4.1 : 18 broches, 2 ADC, 0-3,3 V fixes et zéro DAC
- Logger sur carte SD via le port SDIO natif du Teensy 4.1
- Serveur web embarqué : l'Ethernet natif 10/100 du Teensy 4.1 (DP83825)
- Boîte à rythmes USB MIDI : classes MIDI, MIDIx16 et port hôte USBHost_t36
Exemples de code pour cette carte
clignotante.inoArduinotouche-capacitive.inoArduinoanalogique-12-bits.inoArduinomidi-piano.inoArduinopwm-respiration.inoArduinoservo-angle.inoArduino