🔧 HAL - Hardware Abstraction Layer

Hardware Abstraction Layer for Embedded Systems

STM32 ESP32 ARM Cortex-M RISC-V Bare Metal

📋 HAL Modules (21 Modules)

🔌 gpio

381 lines - GPIO Pin Control

Digital I/O, input/output modes, interrupts, pull-up/down

📊 adc

400 lines - Analog-to-Digital Converter

ADC channels, sampling, resolution, DMA support

📈 dac

391 lines - Digital-to-Analog Converter

DAC output, waveform generation, voltage control

🔄 spi

394 lines - Serial Peripheral Interface

SPI master/slave, full-duplex, DMA transfers

🔗 i2c

396 lines - Inter-Integrated Circuit

I2C bus, multi-master, 7/10-bit addressing

📡 usart

407 lines - Universal Serial Communication

UART/USART, baud rates, parity, DMA

🚗 can

383 lines - Controller Area Network

CAN bus, filters, message queues, error handling

⏱️ timer

366 lines - Hardware Timers

PWM, input capture, output compare, encoder mode

🕐 rtc

379 lines - Real-Time Clock

Date/time, alarms, calendar, backup registers

💾 dma

391 lines - Direct Memory Access

Memory-to-memory, peripheral-to-memory transfers

⚡ int

366 lines - Interrupt Controller

NVIC, interrupt priorities, enable/disable

🧠 core

367 lines - CPU Core Functions

System init, clock config, power modes

🎛️ regs

366 lines - Register Access

Memory-mapped registers, bit manipulation

🔧 hw

366 lines - Hardware Utilities

Delays, atomic operations, critical sections

📦 dev

371 lines - Device Management

Device tree, resource allocation

🖥️ host

367 lines - Host Communication

USB host, debugging interface

🔀 pipe

369 lines - Data Pipes

Stream processing, buffering

📝 enum

366 lines - Enumerations

Hardware enums, constants

⚠️ ie

366 lines - Interrupt Events

Event handling, callbacks

🎵 transc

366 lines - Transceivers

RF transceivers, wireless communication

📚 std

366 lines - Standard HAL Library

Common types, utilities

🚀 Quick Start

import hal::gpio, hal::timer

// GPIO LED blink
let led_pin = gpio.pin_init(gpio.PORT_A, 5, gpio.MODE_OUTPUT)
gpio.pin_write(led_pin, gpio.HIGH)

// Timer PWM
let pwm = timer.pwm_init(timer.TIM1, timer.CH1, 1000)  // 1kHz
timer.pwm_set_duty(pwm, 50)  // 50% duty cycle
timer.pwm_start(pwm)

💡 Example: STM32 LED Blink

import hal::core, hal::gpio, hal::timer

function main() do
    // System initialization
    core.system_init()
    core.clock_config(72_000_000)  // 72MHz
    
    // GPIO setup
    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: ADC Reading

import hal::adc, hal::gpio, hal::core

function read_temperature() -> float do
    // ADC setup
    adc.clock_enable()
    let adc1 = adc.init(adc.ADC1, do
        resolution: adc.RESOLUTION_12BIT,
        align: adc.ALIGN_RIGHT
    end)
    
    // GPIO for analog input
    let pin = gpio.pin_init(gpio.PORT_A, 0, gpio.MODE_ANALOG)
    
    // Configure channel
    adc.channel_config(adc1, adc.CHANNEL_0, do
        sampling_time: adc.SAMPLETIME_480CYCLES
    end)
    
    // Read value
    adc.start(adc1)
    let raw = adc.read(adc1)
    
    // Convert to temperature (example)
    let voltage = raw.float() * 3.3 / 4095.0
    let temp = (voltage - 0.76) / 0.0025 + 25.0
    
    return temp
end

function main() do
    core.system_init()
    
    loop do
        let temp = read_temperature()
        io.println("Temperature: " + temp.to_string() + "°C")
        core.delay_ms(1000)
    end
end

💡 Example: I2C OLED Display

import hal::i2c, hal::gpio

const OLED_ADDR = 0x3C

function oled_init(i2c: I2CHandle) do
    // Initialization sequence
    let init_cmds = [
        0xAE,  // Display off
        0xD5, 0x80,  // Clock divide
        0xA8, 0x3F,  // Multiplex
        0xD3, 0x00,  // Display offset
        0x40,  // Start line
        0x8D, 0x14,  // Charge pump
        0x20, 0x00,  // Memory mode
        0xA1,  // Segment remap
        0xC8,  // COM scan direction
        0xDA, 0x12,  // COM pins
        0x81, 0xCF,  // Contrast
        0xD9, 0xF1,  // Pre-charge
        0xDB, 0x40,  // VCOMH deselect
        0xA4,  // Display resume
        0xA6,  // Normal display
        0xAF   // Display on
    ]
    
    for cmd in init_cmds do
        i2c.write_byte(i2c, OLED_ADDR, 0x00, cmd)
    end
end

function main() do
    // I2C setup
    gpio.pin_init(gpio.PORT_B, 6, gpio.MODE_AF_OD)  // SCL
    gpio.pin_init(gpio.PORT_B, 7, gpio.MODE_AF_OD)  // SDA
    
    let i2c1 = i2c.init(i2c.I2C1, do
        speed: i2c.SPEED_100KHZ,
        mode: i2c.MODE_I2C
    end)
    
    oled_init(i2c1)
    
    // Display text
    oled_print(i2c1, "BERK v1.0.0")
    oled_print(i2c1, "Embedded!")
end

📚 Platform Support

🔗 Related Resources

← All Modules | Home