🔌 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
- Digital input/output modes
- Push-pull/Open-drain output
- Pull-up/Pull-down resistors
- Pin speed configuration
- Interrupt support (EXTI)
- Alternate function mapping
- Atomic bit operations
- Port locking
🚀 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
- Pin kullanmadan önce port clock'unu enable etmelisiniz
- Open-drain çıkışlar external pull-up gerektirir
- 5V tolerant pinler for datasheet kontrol edin
- Interrupt kullanırken NVIC konfigürasyonu gerekir
- Maximum pin current sınırlarına dikkat edin (~25mA)
- Analog mode kullanırken dijital bufferleri disable edilir
📚 Platform Support
- STM32: Tüm F/L/H/G serisi
- GD32: GD32VF103 (RISC-V)
- ESP32: GPIO 0-39
- Nordic: nRF52/53 GPIO
🔗 Related Modules
hal::int- Interrupt controllerhal::core- System initializationhal::timer- PWM generation