machine — donanımla ilgili işlevler

machine modülü, belirli bir karttaki donanımla ilgili özel işlevler içerir. Bu modüldeki işlevlerin çoğu, bir sistemdeki donanım bloklarına (CPU, zamanlayıcılar, veri yolları vb.) doğrudan ve kısıtlamasız erişim ve denetim sağlar.

Bellek erişimi

Modül, ham bellek erişimi için kullanılan, indeks atanabilir üç nesne sunar. Her biri bayt adresine göre indekslenen seyrek bir dizi gibi davranır: value = memN[addr] okur, memN[addr] = value yazar. Adres, erişim genişliğinden bağımsız olarak her zaman bir bayt adresidir.

machine.mem8

İndeks atanabilir 8 bitlik bellek erişimcisi. mem8[addr] addr‘deki bayttan 0-255 aralığında bir int okur; mem8[addr] = value value‘nun düşük 8 bitini yazar. addr 1 bayta hizalanmış olmalıdır (herhangi bir adres).

machine.mem16

İndeks atanabilir 16 bitlik (yarım sözcük) bellek erişimcisi. mem16[addr] 0-65535 aralığında bir int okur; mem16[addr] = value düşük 16 biti yazar. addr 2 bayta hizalanmış olmalıdır.

machine.mem32

İndeks atanabilir 32 bitlik (sözcük) bellek erişimcisi. mem32[addr] 0-0xFFFFFFFF aralığında bir int okur; mem32[addr] = value düşük 32 biti yazar. addr 4 bayta hizalanmış olmalıdır.

Örnek kullanım (yazmaçlar bir STM32H7 mikrodenetleyiciye özgüdür; OpenMV Cam H7 / H7 Plus / Pure Thermal üzerinde P0 başlık pini PB15‘e bağlıdır):

import machine
from micropython import const

GPIOB = const(0x58020400)
GPIO_BSRR = const(0x18)
GPIO_IDR = const(0x10)

# set P0 (PB15) high via the GPIOB bit-set/reset register
machine.mem32[GPIOB + GPIO_BSRR] = 1 << 15

# read P0 (PB15) directly out of the GPIOB input-data register
value = (machine.mem32[GPIOB + GPIO_IDR] >> 15) & 1

Çeşitli işlevler

machine.unique_id() bytes

Bu kart için benzersiz bir tanımlayıcı içeren bir bytes nesnesi döndürür. Değer MCU’nun donanımından okunur (genellikle fabrikada programlanmış aygıt seri numarası); bu nedenle yeniden başlatmalar arasında kararlıdır ve karttan karta farklılık gösterir.

Uzunluk MCU ailesine bağlıdır; STM32’de 12 bayt, mimxrt ve alif portlarında 8 bayt. Uygulamanız sabit uzunlukta bir ID’ye ihtiyaç duyuyorsa döndürülen değeri dilimleyin veya karma değerini (hash) alın.

machine.time_pulse_us(pin: Pin, pulse_level: int, timeout_us: int = 1000000, /) int

pin üzerindeki tek bir darbenin genişliğini ölçer ve süresini mikrosaniye cinsinden döndürür.

pin dijital giriş olarak yapılandırılmış olmalıdır.

pulse_level zamanlanacak darbe polaritesidir: yüksek darbe için 1, düşük darbe için 0.

İşlev iki aşamada çalışır. İlk olarak, pin zaten pulse_level değerinde değilse, pinin pulse_level değerine geçmesini bekler (darbenin başlangıcı). Ardından pinin geri geçmeden önce pulse_level değerinde kaldığı süreyi ölçer (darbenin sonu). Ölçülen süre mikrosaniye cinsinden döndürülür.

timeout_us her aşamayı bağımsız olarak sınırlar (yani en kötü durumda bir çağrı 2 * timeout_us‘a kadar sürer). Zaman aşımında işlev, hangi aşamanın zaman aşımına uğradığını belirten negatif bir değer döndürür:

  • -2 – öncü kenarı beklerken zaman aşımına uğradı (pin hiçbir zaman pulse_level değerine ulaşmadı).

  • -1 – art kenarı beklerken zaman aşımına uğradı (darbe timeout_us‘tan daha uzundu).

machine.bitstream(pin: Pin, encoding: int, timing: tuple, data: bytes, /) None

Belirtilen pin üzerinde bit-banging yaparak data iletir. encoding argümanı bitlerin nasıl kodlandığını belirtir ve timing kodlamaya özgü bir zamanlama belirtimidir.

Desteklenen kodlamalar şunlardır:

  • “yüksek düşük” darbe süresi modülasyonu için 0. Bu, 0 ve 1 bitlerini en anlamlı bitten başlayarak zamanlanmış darbeler olarak iletir. timing, (high_time_0, low_time_0, high_time_1, low_time_1) biçiminde nanosaniyelerden oluşan dört öğeli bir demet olmalıdır. Örneğin (400, 850, 800, 450), 800kHz’de WS2812 RGB LED’leri için zamanlama belirtimidir.

Zamanlama doğruluğu donanıma bağlıdır; daha hızlı MCU’lar daha sıkı darbeler (genellikle onlarca nanosaniye) üretir.

Not

WS2812 / NeoPixel şeritlerini denetlemek için daha üst düzey bir API için neopixel modülüne bakın.

Sabitler

Aşağıdaki sabitler reset_cause() tarafından döndürülür ve MCU’nun en son neden sıfırlandığını belirtir. STM32 ve mimxrt portlarında kullanılabilir; alif portu (OpenMV Cam AE3) şu anda sıfırlama nedeni sabitlerini sunmaz ve reset_cause() her zaman 0 döndürür.

machine.PWRON_RESET: int

Yonga gücün uygulanmasından kaynaklanan sıfırlama. STM32 ve mimxrt portları.

machine.WDT_RESET: int

Bekçi köpeği zamanlayıcısının süresinin dolmasından kaynaklanan sıfırlama. STM32 ve mimxrt portları.

machine.SOFT_RESET: int

soft_reset() tarafından gerçekleştirilen sıfırlama (Python yorumlayıcısı donanımsal sıfırlama olmadan yeniden başlatıldı). STM32 ve mimxrt portları.

machine.HARD_RESET: int

NRST pininin etkinleştirilmesinden (harici sıfırlama düğmesi) kaynaklanan sıfırlama. Yalnızca STM32 portları.

machine.DEEPSLEEP_RESET: int

Derin uykudan uyanmaktan kaynaklanan sıfırlama. Yalnızca STM32 portları.

Sınıflar