🔌 hal::gpio

General Purpose Input/Output Control - GPIO Pin Yönetimi

381 lines ~30 function STM32/GD32/ESP32

📖 Overview

GPIO (General Purpose Input/Output) modülü, mikrokontrolcü pinlerinin dijital giriş/çıkış olarak kontrolünü sağlar. LED kontrolü, buton okuma, sensör arayüzleri ve dijital sinyaller for kullanılır.

🔑 Key Features

🚀 Quick Start

import hal::gpio

// GPIO clock enable
gpio.clock_enable(gpio.PORT_C)

// LED pin setup (output)
let led = gpio.pin_init(gpio.PORT_C, 13, do
    mode: gpio.MODE_OUTPUT,
    speed: gpio.SPEED_LOW,
    pull: gpio.PULL_NONE
end)

// LED control
gpio.pin_write(led, gpio.HIGH)  // Turn on
gpio.pin_toggle(led)  // Toggle
gpio.pin_write(led, gpio.LOW)  // Turn off

📦 Tipler ve Enum'lar

// GPIO Portları
enum Port {
    A, B, C, D, E, F, G, H, I
}

// Pin Modları
enum Mode {
    INPUT,        // Digital input
    OUTPUT,       // Push-pull output
    OUTPUT_OD,    // Open-drain output
    AF,           // Alternate function push-pull
    AF_OD,        // Alternate function open-drain
    ANALOG        // Analog mode
}

// Hız Seviyesi
enum Speed {
    LOW,       // Low speed (2 MHz)
    MEDIUM,    // Medium speed (25 MHz)
    HIGH,      // High speed (50 MHz)
    VERY_HIGH  // Very high speed (100 MHz)
}

// Pull Direnci
enum Pull {
    NONE,  // No pull resistor
    UP,    // Pull-up
    DOWN   // Pull-down
}

// Logic Level
enum Level {
    LOW,   // Logic 0 (0V)
    HIGH   // Logic 1 (3.3V/5V)
}

// Interrupt Tetikleme
enum Trigger {
    RISING,   // Rising edge
    FALLING,  // Falling edge
    BOTH      // Both edges
}

⚙️ functionlar

Clock Management

function clock_enable(port: Port) -> Result[None, Error]
// Enable GPIO port clock

function clock_disable(port: Port) -> Result[None, Error]
// Disable GPIO port clock

Pin Initialization

function pin_init(port: Port, pin: int, config: PinConfig) -> Pin
// Initialize GPIO pin with configuration

// PinConfig structure
struct PinConfig do
    mode: Mode,      // Pin mode
    speed: Speed,    // Output speed
    pull: Pull,      // Pull resistor
    af: Optional[int]  // Alternate function number
end

Digital I/O

function pin_write(pin: Pin, level: Level)
// Write digital output

function pin_read(pin: Pin) -> Level
// Read digital input

function pin_toggle(pin: Pin)
// Toggle output pin

function port_write(port: Port, value: u16)
// Write entire port (16 pins)

function port_read(port: Port) -> u16
// Read entire port

Interrupt Management

function interrupt_enable(pin: Pin, trigger: Trigger, callback: İşlev)
// Enable pin interrupt

function interrupt_disable(pin: Pin)
// Disable pin interrupt

💡 Example 1: LED Blink

import hal::gpio, hal::core

function ana() do
    // System init
    core.system_init()
    core.clock_config(72_000_000)  // 72MHz
    
    // LED setup (PC13 on STM32 Blue Pill)
    gpio.clock_enable(gpio.PORT_C)
    let led = gpio.pin_init(gpio.PORT_C, 13, do
        mode: gpio.MODE_OUTPUT,
        speed: gpio.SPEED_LOW,
        pull: gpio.PULL_NONE
    end)
    
    // Blink loop
    loop do
        gpio.pin_toggle(led)
        core.delay_ms(500)
    end
end

💡 Example 2: Button Input with Interrupt

import hal::gpio, hal::int

let button_pressed = false

function button_handler() do
    button_pressed = true
    io.println("Button pressed!")
end

function ana() do
    // LED setup (output)
    gpio.clock_enable(gpio.PORT_C)
    let led = gpio.pin_init(gpio.PORT_C, 13, do
        mode: gpio.MODE_OUTPUT,
        speed: gpio.SPEED_LOW,
        pull: gpio.PULL_NONE
    end)
    
    // Button setup (input with pull-up)
    gpio.clock_enable(gpio.PORT_A)
    let button = gpio.pin_init(gpio.PORT_A, 0, do
        mode: gpio.MODE_INPUT,
        pull: gpio.PULL_UP,
        speed: gpio.SPEED_LOW
    end)
    
    // Enable button interrupt
    gpio.interrupt_enable(button, gpio.TRIGGER_FALLING, button_handler)
    
    // Main loop
    loop do
        if button_pressed ise do
            button_pressed = false
            gpio.pin_toggle(led)
        end
        core.delay_ms(10)
    end
end

💡 Example 3: Multi-LED Control (Port Operations)

import hal::gpio, hal::core

function ana() do
    core.system_init()
    
    // Setup 8 LEDs on Port B (PB0-PB7)
    gpio.clock_enable(gpio.PORT_B)
    
    // Initialize all 8 pins
    each i forde 0..8 for do
        gpio.pin_init(gpio.PORT_B, i, do
            mode: gpio.MODE_OUTPUT,
            speed: gpio.SPEED_MEDIUM,
            pull: gpio.PULL_NONE
        end)
    end
    
    // LED patterns
    let patterns = [
        0b00000001,  // Single LED
        0b00000011,  // 2 LEDs
        0b00000111,  // 3 LEDs
        0b00001111,  // 4 LEDs
        0b00011111,  // 5 LEDs
        0b00111111,  // 6 LEDs
        0b01111111,  // 7 LEDs
        0b11111111   // All LEDs
    ]
    
    loop do
        each pattern forde patterns for do
            gpio.port_write(gpio.PORT_B, pattern)
            core.delay_ms(200)
        end
        
        // Reverse
        each pattern forde patterns.ters() for do
            gpio.port_write(gpio.PORT_B, pattern)
            core.delay_ms(200)
        end
    end
end

💡 Example 4: Traffic Light Controller

import hal::gpio, hal::core

struct TrafficLight do
    red: gpio.Pin,
    yellow: gpio.Pin,
    green: gpio.Pin
end

function traffic_light_init() -> TrafficLight do
    gpio.clock_enable(gpio.PORT_A)
    
    let tl = TrafficLight do
        red: gpio.pin_init(gpio.PORT_A, 0, do
            mode: gpio.MODE_OUTPUT,
            speed: gpio.SPEED_LOW,
            pull: gpio.PULL_NONE
        end),
        yellow: gpio.pin_init(gpio.PORT_A, 1, do
            mode: gpio.MODE_OUTPUT,
            speed: gpio.SPEED_LOW,
            pull: gpio.PULL_NONE
        end),
        green: gpio.pin_init(gpio.PORT_A, 2, do
            mode: gpio.MODE_OUTPUT,
            speed: gpio.SPEED_LOW,
            pull: gpio.PULL_NONE
        end)
    end
    
    return tl
end

function set_state(tl: TrafficLight, red: bool, yellow: bool, green: bool) do
    gpio.pin_write(tl.red, if red ise gpio.HIGH else gpio.LOW)
    gpio.pin_write(tl.yellow, if yellow ise gpio.HIGH else gpio.LOW)
    gpio.pin_write(tl.green, if green ise gpio.HIGH else gpio.LOW)
end

function ana() do
    core.system_init()
    let tl = traffic_light_init()
    
    loop do
        // Green light
        set_state(tl, false, false, true)
        core.delay_ms(5000)
        
        // Yellow light
        set_state(tl, false, true, false)
        core.delay_ms(2000)
        
        // Red light
        set_state(tl, true, false, false)
        core.delay_ms(5000)
    end
end

⚠️ Important Notes

📚 Platform Support

🔗 Related Modules

← HAL Modülleri | Tüm Modüller | Ana Sayfa