machine --- ハードウェアに関連する関数

machine モジュールには、特定のボード上のハードウェアに関連する固有の関数が含まれています。このモジュール内のほとんどの関数は、システム上のハードウェアブロック(CPU、タイマー、バスなど)への直接かつ無制限のアクセスと制御を実現できます。

メモリアクセス

このモジュールは、生のメモリアクセスに使用される 3 つの添字可能なオブジェクトを公開しています。それぞれがバイトアドレスでインデックス付けされたスパース配列のように動作します。value = memN[addr] で読み取り、memN[addr] = value で書き込みます。アドレスはアクセス幅に関係なく常にバイトアドレスです。

machine.mem8

添字可能な 8 ビットメモリアクセサです。mem8[addr]addr のバイトから 0 ~ 255 の範囲の int を読み取ります。mem8[addr] = valuevalue の下位 8 ビットを書き込みます。addr は 1 バイト境界に整列している必要があります(任意のアドレス)。

machine.mem16

添字可能な 16 ビット(ハーフワード)メモリアクセサです。mem16[addr] は 0 ~ 65535 の範囲の int を読み取ります。mem16[addr] = value は下位 16 ビットを書き込みます。addr は 2 バイト境界に整列している必要があります。

machine.mem32

添字可能な 32 ビット(ワード)メモリアクセサです。mem32[addr] は 0 ~ 0xFFFFFFFF の範囲の int を読み取ります。mem32[addr] = value は下位 32 ビットを書き込みます。addr は 4 バイト境界に整列している必要があります。

使用例(レジスタは STM32H7 マイクロコントローラ固有のものです。OpenMV Cam H7 / H7 Plus / Pure Thermal ではヘッダピン P0PB15 に配線されています):

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

その他の関数

machine.unique_id() bytes

このボードの一意の識別子を含む bytes オブジェクトを返します。値は MCU のハードウェア(通常は工場でプログラムされたデバイスのシリアル番号)から読み出されるため、再起動しても安定しており、ボードごとに異なります。

長さは MCU ファミリによって異なります。STM32 では 12 バイト、mimxrt と alif ポートでは 8 バイトです。アプリケーションで固定長の ID が必要な場合は、返された値をスライスするかハッシュ化してください。

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

pin 上の単一パルスの幅を測定し、その持続時間をマイクロ秒単位で返します。

pin はデジタル入力として設定されている必要があります。

pulse_level は計測するパルスの極性です。ハイパルスの場合は 1、ローパルスの場合は 0 です。

この関数は 2 つのフェーズで動作します。まず、ピンがまだ pulse_level になっていない場合は、ピンが pulse_level に遷移する(パルスの開始)のを待ちます。次に、ピンが再び遷移して戻る(パルスの終了)までに pulse_level に留まっている時間を測定します。測定された時間はマイクロ秒単位で返されます。

timeout_us フェーズを独立して制限します(そのため最悪の場合、呼び出しは最大で 2 * timeout_us 続きます)。タイムアウト時には、どのフェーズがタイムアウトしたかを示す負の値を返します:

  • -2 -- 立ち上がりエッジを待機中にタイムアウトしました(ピンが pulse_level に達しませんでした)。

  • -1 -- 立ち下がりエッジを待機中にタイムアウトしました(パルスが timeout_us より長かった)。

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

指定した pin をビットバンギングして data を送信します。encoding 引数はビットのエンコード方法を指定し、timing はエンコード固有のタイミング仕様です。

サポートされているエンコーディングは次のとおりです:

  • 0 は「ハイロー」パルス幅変調用です。これは 0 と 1 のビットを、最上位ビットから順にタイミング指定されたパルスとして送信します。timing(high_time_0, low_time_0, high_time_1, low_time_1) の形式でナノ秒を表す 4 要素タプルでなければなりません。たとえば (400, 850, 800, 450) は 800kHz の WS2812 RGB LED 用のタイミング仕様です。

タイミングの精度はハードウェアに依存します。高速な MCU ほど、より正確なパルス(通常は数十ナノ秒)を生成します。

注釈

WS2812 / NeoPixel ストリップの制御については、より高レベルの API として neopixel モジュールを参照してください。

定数

以下の定数は reset_cause() によって返され、MCU が最後にリセットした理由を識別します。STM32 と mimxrt ポートで利用できます。alif ポート(OpenMV Cam AE3)は現在リセット原因の定数を公開しておらず、その reset_cause() は常に 0 を返します。

machine.PWRON_RESET: int

チップへの電源投入によって発生したリセット。STM32 と mimxrt ポート。

machine.WDT_RESET: int

ウォッチドッグタイマーの期限切れによって発生したリセット。STM32 と mimxrt ポート。

machine.SOFT_RESET: int

soft_reset()(ハードウェアリセットなしで Python インタプリタが再起動した)によって発生したリセット。STM32 と mimxrt ポート。

machine.HARD_RESET: int

NRST ピンがアサートされた(外部リセットボタン)ことによって発生したリセット。STM32 ポートのみ。

machine.DEEPSLEEP_RESET: int

ディープスリープからのウェイクによって発生したリセット。STM32 ポートのみ。

クラス