C:
volatile uint32_t captureValue = 0;
volatile bool newCapture = false;
void setup() {
// Initialize serial output
Serial.begin(9600);
while (!Serial); // Wait for serial connection
// Print build date and time
Serial.println(__DATE__);
Serial.println(__TIME__);
// Print CPU clock frequency
Serial.print("CPU clock: ");
Serial.print(F_CPU_ACTUAL / 1E6);
Serial.println(" MHz");
// Print BUS clock frequency
Serial.print("BUS clock: ");
Serial.print(F_BUS_ACTUAL / 1E6);
Serial.println(" MHz");
// Configure Pin 4 as input
pinMode(4, INPUT);
// Configure IOMUXC for Pin 4 (GPT1 Capture 1)
IOMUXC_SW_MUX_CTL_PAD_GPIO_B1_01 = 0x3; // Pin 4 as GPT1_CAPTURE1 (ALT3)
IOMUXC_SW_PAD_CTL_PAD_GPIO_B1_01 = 0x13000; // Pull-Up (100 kOhm), hysteresis, medium drive strength
// Enable clock for GPT1
CCM_CCGR1 |= CCM_CCGR1_GPT(CCM_CCGR_ON);
// Configure GPT1
GPT1_CR = 0; // Reset control register
GPT1_PR = 0; // Prescaler = 0 (no divider)
GPT1_SR = 0x3F; // Clear all prior status
GPT1_IR = GPT_IR_IF1IE; // Enable Input Capture 1 interrupt
GPT1_CR = GPT_CR_EN | GPT_CR_CLKSRC(1) | GPT_CR_FRR | GPT_CR_IM1(1) | GPT_CR_IM2(2); // Enable timer, IPG_CLK, free-run, rising edge on Capture 1, falling edge on Capture 2 (unused)
// Attach interrupt vector and enable interrupt
attachInterruptVector(IRQ_GPT1, gpt1_capture_isr);
NVIC_ENABLE_IRQ(IRQ_GPT1);
}
void loop() {
// Nothing in loop, output handled in interrupt
Serial.println("test");
delay(500);
}
// Interrupt Service Routine for Input Capture
void gpt1_capture_isr() {
if (GPT1_SR & GPT_SR_IF1) { // Check if Capture 1 triggered
captureValue = GPT1_ICR1; // Read capture value (counter state)
float timeUs = captureValue / 150.0; // Convert to microseconds (150 MHz = 6.67 ns/tick)
Serial.printf("Capture-Wert: %u, Zeit: %.3f us\n", captureValue, timeUs);
GPT1_SR |= GPT_SR_IF1; // Clear capture flag
}
}