machine --- ハードウェアに関連する関数¶
machine モジュールには、特定のボード上のハードウェアに関連する固有の関数が含まれています。このモジュール内のほとんどの関数は、システム上のハードウェアブロック(CPU、タイマー、バスなど)への直接かつ無制限のアクセスと制御を実現できます。
メモリアクセス¶
このモジュールは、生のメモリアクセスに使用される 3 つの添字可能なオブジェクトを公開しています。それぞれがバイトアドレスでインデックス付けされたスパース配列のように動作します。value = memN[addr] で読み取り、memN[addr] = value で書き込みます。アドレスはアクセス幅に関係なく常にバイトアドレスです。
- machine.mem8¶
添字可能な 8 ビットメモリアクセサです。
mem8[addr]はaddrのバイトから 0 ~ 255 の範囲のintを読み取ります。mem8[addr] = valueはvalueの下位 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 ではヘッダピン P0 が PB15 に配線されています):
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.SOFT_RESET: int¶
soft_reset()(ハードウェアリセットなしで Python インタプリタが再起動した)によって発生したリセット。STM32 と mimxrt ポート。
クラス¶
- class Pin -- I/Oピンの制御
- class Signal -- 外部 I/O デバイスの制御と検知
- class LED -- ポータブルなオンボード LED 制御
- class ADC -- アナログ-デジタル変換
- class PWM -- パルス幅変調
- class UART -- 全二重シリアル通信バス
- class SPI -- Serial Peripheral Interface バスプロトコル(コントローラ側)
- class SoftSPI -- ソフトウェアエミュレートされた SPI バス
- class I2C -- 2線式シリアルプロトコル
- class SoftI2C -- ソフトウェアでエミュレートされた I2C バス
- class I2CTarget -- I2C ターゲットデバイス
- class I2S -- Inter-IC Sound バスプロトコル
- class CAN -- Controller Area Network プロトコル
- class RTC -- リアルタイムクロック
- class Timer -- 仮想的な周期/ワンショットタイマー
- class WDT -- ウォッチドッグタイマー
- class SDCard -- SD / MMC カードドライバ
- class Counter -- パルスカウンター
- class Encoder -- 直交デコーダー