import machine
import utime
# --- Constants ---
LED_PIN = 0 # Changed from 25 to 0
SIO_BASE = 0xD0000000
GPIO_OUT_XOR = SIO_BASE + 0x01C # XOR register for fast toggle
GPIO_OE = SIO_BASE + 0x024
# --- Setup for direct register access ---
machine.mem32[GPIO_OE] |= (1 << LED_PIN)
# --- Helper: measure elapsed time in microseconds ---
def time_us():
return utime.ticks_us()
# --- Test 1: Using machine.Pin() API ---
pin = machine.Pin(LED_PIN, machine.Pin.OUT)
count = 100_000
t0 = time_us()
for _ in range(count):
pin.toggle()
t1 = time_us()
elapsed_api = utime.ticks_diff(t1, t0)
print(f"machine.Pin.toggle(): {count} toggles in {elapsed_api} µs "
f"({count / (elapsed_api / 1_000_000):.1f} toggles/sec)")
# --- Test 2: Using direct mem32 register access ---
t0 = time_us()
for _ in range(count):
machine.mem32[GPIO_OUT_XOR] = (1 << LED_PIN)
t1 = time_us()
elapsed_reg = utime.ticks_diff(t1, t0)
print(f"mem32 direct write: {count} toggles in {elapsed_reg} µs "
f"({count / (elapsed_reg / 1_000_000):.1f} toggles/sec)")
# --- Compare results ---
speedup = elapsed_api / elapsed_reg
print(f"\n⚙️ Direct register access is about {speedup:.1f}× faster")