mesure-frequence.ino
Les GPIO du GD32 ont la matrice d'interruption : chaque front d'appel la routine, et compter sur une fenêtre de 1 s donne la fréquence. Le patron ISR-courte + copie verrouillée est celui de tous les compteurs.
Matériel requis
Une carte de développement GD32F103C8T6 (Cortex-M3 108 MHz, compatible broche à broche Blue Pill), alimentée en 3,3 V/5 V, avec un adaptateur ST-Link ou série. Un générateur de carré (sortie PWM d'une autre carte, capteur à effet Hall, codeur).
Branchement
Signal sur PA3 (3,3 V max !), masses communes. Le générateur peut être la broche PWM d'une autre carte via 1 kΩ.
Fonctionnement
attachInterrupt mappe PA3 sur EXTI3 ; l'ISR ne fait qu'incrémenter un volatile. noInterrupts/interrupts encadrent la lecture pour une copie cohérente du compteur 32 bits. Avec Arduino : installez le core « STM32F1 » (Roger Clark, gestionnaire de cartes) et choisissez la carte « GD32F103C » ; le LED utilisateur est PC13 (actif à LOW). En C : bibliothèque GD32F10x + ST-Link.
Pour aller plus loin
Un compteur d'impulsions d'eau/électricité (lente), ou un tachymètre avec deux fenêtres de durées différentes.
mesure-frequence.ino
// Compteur de fronts sur PA3 (signal carre 1 Hz a 5 kHz) via attachInterrupt.
const int ENTREE = PA3;
volatile uint32_t fronts = 0;
unsigned long fenetre = 0;
void surFront() { fronts++; } // ISR minimale
void setup() {
Serial.begin(115200);
pinMode(ENTREE, INPUT);
attachInterrupt(digitalPinToInterrupt(ENTREE), surFront, RISING);
fenetre = millis();
}
void loop() {
if (millis() - fenetre >= 1000) {
noInterrupts();
uint32_t n = fronts; fronts = 0; // copie atomique
interrupts();
fenetre = millis();
Serial.printf("frequence = %lu Hz\n", (unsigned long)n);
}
delay(10);
}