🔐 hal::crc

Hardware CRC32 Calculator - Fast Data Integrity Check

~360 satır ~12 fonksiyon STM32/GD32

📖 Genel Bakış

CRC modülü, hardware accelerated CRC32 hesaplaması sağlar. Polynomial 0x04C11DB7 kullanır (Ethernet standardı). Firmware integrity check, flash verification, communication protocols ve data corruption detection için kritiktir. Software CRC'den 10-100x daha hızlıdır.

🔑 Temel Özellikler

🚀 Hızlı Başlangıç

içe_aktar hal::crc, hal::rcc

// Enable CRC clock
rcc.periph_clock_enable(rcc.PERIPH_CRC)

// Initialize CRC
crc.init()

// Calculate CRC32 of data
değişken data: Dizi<sayı> = [0x12345678, 0xABCDEF00, 0xDEADBEEF]
değişken checksum = crc.calculate(data)

io.yazdir_satır("CRC32: 0x" + checksum.onaltılıya())

// Verify data
eğer crc.verify(data, checksum) yap
    io.yazdir_satır("Data integrity OK")
son

📦 Tipler ve Enum'lar

// CRC Configuration
yapı CRCConfig yap
    polynomial: sayı = 0x04C11DB7,  // Default Ethernet polynomial
    initial_value: sayı = 0xFFFFFFFF,
    input_reverse: mantık = yanlış,
    output_reverse: mantık = yanlış
son

// CRC Result
yapı CRCResult yap
    value: sayı,
    valid: mantık
son

💡 Örnek 1: Firmware Integrity Check

Problem: Flash'taki firmware'in bozulmadığını doğrulamak

içe_aktar hal::crc, hal::flash

sabit FIRMWARE_START: sayı = 0x0800_8000  // Application start
sabit FIRMWARE_SIZE: sayı = 128 * 1024     // 128 KB
sabit CRC_STORAGE: sayı = 0x0807_FFFC      // Last 4 bytes of app region

fonksiyon firmware_calculate_crc() -> sayı yap
    crc.reset()
    
    // Calculate CRC of firmware (32-bit words)
    değişken word_count = FIRMWARE_SIZE / 4
    değişken addr = FIRMWARE_START
    
    için i içinde 0..word_count yap
        değişken word = *(addr kayıt *sayı)
        crc.accumulate(word)
        addr = addr + 4
    son
    
    dön crc.get_value()
son

fonksiyon firmware_store_crc(checksum: sayı) yap
    // Unlock flash
    flash.unlock()
    
    // Erase last page
    flash.erase_page(CRC_STORAGE)
    
    // Write CRC
    flash.program_word(CRC_STORAGE, checksum)
    
    flash.lock()
    
    io.yazdir_satır("CRC stored: 0x" + checksum.onaltılıya())
son

fonksiyon firmware_verify() -> mantık yap
    // Read stored CRC
    değişken stored_crc = *(CRC_STORAGE kayıt *sayı)
    
    // Calculate current CRC
    değişken calculated_crc = firmware_calculate_crc()
    
    io.yazdir_satır("Stored CRC:     0x" + stored_crc.onaltılıya())
    io.yazdir_satır("Calculated CRC: 0x" + calculated_crc.onaltılıya())
    
    eğer stored_crc == calculated_crc yap
        io.yazdir_satır("✅ Firmware integrity OK")
        dön doğru
    yoksa yap
        io.yazdir_satır("❌ Firmware corrupted!")
        dön yanlış
    son
son

fonksiyon ana() yap
    crc.init()
    
    // On firmware update: store CRC
    // firmware_store_crc(firmware_calculate_crc())
    
    // On boot: verify firmware
    eğer değil firmware_verify() yap
        io.yazdir_satır("ERROR: Cannot start corrupted firmware")
        // Enter safe mode or bootloader
        döngü yap son  // Halt
    son
    
    io.yazdir_satır("Starting application...")
son

Sonuç: Boot sırasında firmware corruption detect edilir. Güvenli başlatma sağlanır.

💡 Örnek 2: UART Packet Verification

Problem: Serial communication'da packet integrity kontrolü

içe_aktar hal::crc, hal::usart

yapı Packet yap
    header: sayı8 = 0xAA,
    length: sayı8,
    data: Dizi<sayı8>,
    crc32: sayı
son

fonksiyon packet_calculate_crc(pkt: Packet) -> sayı yap
    crc.reset()
    
    // CRC over header + length + data
    crc.accumulate_byte(pkt.header)
    crc.accumulate_byte(pkt.length)
    
    için byte içinde pkt.data yap
        crc.accumulate_byte(byte)
    son
    
    dön crc.get_value()
son

fonksiyon packet_send(pkt: Packet) yap
    // Calculate CRC
    pkt.crc32 = packet_calculate_crc(pkt)
    
    // Send packet
    usart.write_byte(usart.USART1, pkt.header)
    usart.write_byte(usart.USART1, pkt.length)
    
    için byte içinde pkt.data yap
        usart.write_byte(usart.USART1, byte)
    son
    
    // Send CRC (big-endian)
    usart.write_byte(usart.USART1, (pkt.crc32 >> 24) & 0xFF kayıt sayı8)
    usart.write_byte(usart.USART1, (pkt.crc32 >> 16) & 0xFF kayıt sayı8)
    usart.write_byte(usart.USART1, (pkt.crc32 >> 8) & 0xFF kayıt sayı8)
    usart.write_byte(usart.USART1, pkt.crc32 & 0xFF kayıt sayı8)
son

fonksiyon packet_receive() -> Seçenek<Packet> yap
    // Read header
    değişken header = usart.read_byte(usart.USART1)
    eğer header != 0xAA yap
        dön Seçenek.Hiçbiri
    son
    
    // Read length
    değişken length = usart.read_byte(usart.USART1)
    
    // Read data
    değişken data = Dizi.yeni(length)
    için i içinde 0..length yap
        data[i] = usart.read_byte(usart.USART1)
    son
    
    // Read CRC
    değişken crc_recv = 0 kayıt sayı
    crc_recv = (crc_recv << 8) | usart.read_byte(usart.USART1) kayıt sayı
    crc_recv = (crc_recv << 8) | usart.read_byte(usart.USART1) kayıt sayı
    crc_recv = (crc_recv << 8) | usart.read_byte(usart.USART1) kayıt sayı
    crc_recv = (crc_recv << 8) | usart.read_byte(usart.USART1) kayıt sayı
    
    // Create packet
    değişken pkt = Packet yap
        header: header,
        length: length,
        data: data,
        crc32: crc_recv
    son
    
    // Verify CRC
    değişken crc_calc = packet_calculate_crc(pkt)
    
    eğer crc_calc == crc_recv yap
        io.yazdir_satır("✅ Packet CRC OK")
        dön Seçenek.Bazı(pkt)
    yoksa yap
        io.yazdir_satır("❌ Packet CRC mismatch!")
        dön Seçenek.Hiçbiri
    son
son

Sonuç: UART üzerinden gelen corrupt paketler reddedilir. Data integrity garanti edilir.

💡 Örnek 3: SD Card File Verification

Problem: SD card'dan okunan dosyanın bozulmadığını kontrol etmek

içe_aktar hal::crc, hal::sdio

fonksiyon file_calculate_crc(filename: Metin) -> sayı yap
    // Open file
    değişken file = sdio.file_open(filename, sdio.MODE_READ)
    
    eğer değil file.is_valid() yap
        io.yazdir_satır("ERROR: Cannot open file")
        dön 0
    son
    
    crc.reset()
    
    // Read file in 512-byte blocks
    değişken buffer: Dizi<sayı8> = Dizi.yeni(512)
    
    döngü yap
        değişken bytes_read = sdio.file_read(file, buffer)
        
        eğer bytes_read == 0 yap
            kır  // EOF
        son
        
        // Process full 32-bit words
        için i içinde 0..(bytes_read/4) yap
            değişken word = (buffer[i*4] kayıt sayı) |
                           ((buffer[i*4+1] kayıt sayı) << 8) |
                           ((buffer[i*4+2] kayıt sayı) << 16) |
                           ((buffer[i*4+3] kayıt sayı) << 24)
            crc.accumulate(word)
        son
        
        // Handle remaining bytes
        değişken remainder = bytes_read % 4
        eğer remainder > 0 yap
            için i içinde (bytes_read - remainder)..bytes_read yap
                crc.accumulate_byte(buffer[i])
            son
        son
    son
    
    sdio.file_close(file)
    
    dön crc.get_value()
son

fonksiyon file_verify(filename: Metin, expected_crc: sayı) -> mantık yap
    io.yazdir_satır("Verifying " + filename + "...")
    
    değişken calculated = file_calculate_crc(filename)
    
    io.yazdir_satır("Expected:   0x" + expected_crc.onaltılıya())
    io.yazdir_satır("Calculated: 0x" + calculated.onaltılıya())
    
    dön calculated == expected_crc
son

Kullanım: Firmware update dosyalarının SD card'dan okunurken bozulmadığını garanti eder.

📚 API Referansı

Temel Fonksiyonlar

// CRC initialization
fonksiyon init()
fonksiyon deinit()
fonksiyon reset()  // Reset to initial value

// CRC calculation
fonksiyon calculate(data: Dizi<sayı>) -> sayı
fonksiyon accumulate(word: sayı)  // Add 32-bit word
fonksiyon accumulate_byte(byte: sayı8)  // Add 8-bit byte

// Get result
fonksiyon get_value() -> sayı

// Verification
fonksiyon verify(data: Dizi<sayı>, expected: sayı) -> mantık
⚠️ Önemli Notlar:
  • Word Alignment: CRC hardware 32-bit word aligned çalışır
  • Byte Order: Little-endian işlemci için byte order dikkat edilmeli
  • Initial Value: Reset sonrası 0xFFFFFFFF (not 0x00000000)
  • Final XOR: Bazı protokoller final XOR 0xFFFFFFFF gerektirir

🖥️ Platform Desteği

Platform CRC Support Polynomial Speed
STM32F1 ✅ Var 0x04C11DB7 1 cycle/word
STM32F4 ✅ Var 0x04C11DB7 1 cycle/word
STM32F7 ✅ Var Configurable 1 cycle/word
STM32H7 ✅ Var Configurable 1 cycle/word
GD32VF103 ✅ Var 0x04C11DB7 1 cycle/word

✅ Best Practices

🔗 İlgili Modüller

🔙 HAL Modülleri | 🌐 English