mesure-frequence.ino
Los GPIO del GD32 tienen la matriz de interrupción: cada flanco llama a la rutina, y contar en una ventana de 1 s da la frecuencia. El patrón ISR-corta + copia bloqueada es el plano de todo contador.
Hardware necesario
Una placa de desarrollo GD32F103C8T6 (Cortex-M3 a 108 MHz, compatible pin a pin con Blue Pill), alimentada a 3,3 V/5 V, con un adaptador ST-Link o serie. Un generador de cuadrada (salida PWM de otra placa, sensor de efecto Hall, codificador).
Cableado
Señal en PA3 (3,3 V máx!), masas comunes. El generador puede ser un pin PWM de otra placa por 1 kΩ.
Funcionamiento
attachInterrupt mapea PA3 a EXTI3; la ISR solo incrementa un volatile. noInterrupts/interrupts enmarcan la lectura para una copia coherente del contador de 32 bits. Con Arduino: instale el core « STM32F1 » (Roger Clark, gestor de placas) y elija la placa « GD32F103C »; el LED de usuario es PC13 (activo en LOW). En C: biblioteca de firmware GD32F10x + ST-Link.
Para ir más lejos
Un contador de impulsos de agua/electricidad (lento), o un tacómetro con dos ventanas de duraciones distintas.
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);
}