stm
--- STM32 MCU に固有の機能¶
このモジュールは、ペリフェラルレジスタへの直接アクセスなど、STM32 マイクロコントローラに特有の機能を提供します。
メモリアクセス¶
このモジュールは、素のメモリアクセスに使う3つのオブジェクトを提供します。
- stm.mem8¶
メモリを8ビットで読み書きします。
- stm.mem16¶
メモリを16ビットで読み書きします。
- stm.mem32¶
メモリを32ビットで読み書きします。
これらのオブジェクトにインデックスを付けるには、添字表記 [...]
を使って、目的のアドレスを指定します。
これらのメモリオブジェクトは、ペリフェラルレジスタ定数と組み合わせて、MCU ハードウェアペリフェラルレジスタや、その他のすべてのアドレス空間の領域を読み書きするために使えます。
ペリフェラルレジスタ定数¶
このモジュールでは、CMSIS ヘッダファイルから生成されるレジスタの定数を定義していて、コンパイル対象のマイクロコントローラシリーズに応じて利用できる定数が異なります。定数の例としては以下のようなものがあります。
- stm.GPIOA¶
GPIOA ペリフェラルのベースアドレス
- stm.GPIOB¶
GPIOB ペリフェラルのベースアドレス
- stm.GPIO_BSRR¶
GPIO ビットセット/リセットレジスタのオフセット
- stm.GPIO_IDR¶
GPIO 入力データレジスタのオフセット
- stm.GPIO_ODR¶
GPIO 出力データレジスタのオフセット
GPIOA
のようにペリフェラルの名前が付いている定数は、そのペリフェラルの絶対アドレスです。GPIO_BSRR
のように、ペリフェラルの名前をプレフィックスに持つ定数は、レジスタの相対オフセットです。ペリフェラルのレジスタにアクセスするには、周辺機器の絶対ベースアドレスと相対レジスタオフセットを加算する必要があります。たとえば GPIOA + GPIO_BSRR
は GPIOA->BSRR
レジスタの絶対アドレスとなります。
使用例:
# PA2 をハイにセット
stm.mem32[stm.GPIOA + stm.GPIO_BSRR] = 1 << 2
# PA3 を読取り
value = (stm.mem32[stm.GPIOA + stm.GPIO_IDR] >> 3) & 1
STM32WBxx MCU に固有の関数¶
これらの関数は STM32WBxx マイクロコントローラで利用でき、第2のCPUであるRFコアと相互に連携します。
- stm.rfcore_status()¶
2つ目のCPUの状態を整数で返します(デバイス情報テーブルの第1ワード)。
- stm.rfcore_fw_version(id)¶
2つ目のCPUで動作しているファームウェアのバージョンを取得します。 id に 0 を渡すと FUS バージョン、1 を渡すと WS バージョンを取得します。
完全なバージョン番号を5項目の5タプルで返します。
- stm.rfcore_sys_hci(ogf, ocf, data, timeout_ms=0)¶
SYS チャンネルで HCI コマンドを実行します。実行は同期しています。
SYS コマンドの結果をバイト列オブジェクトで返します。
STM32WLxx MCU に固有の関数¶
これらの関数は STM32WLxx マイクロコントローラで利用でき、統合されている "SUBGHZ" 無線モデムペリフェラルと相互に連携します。
- stm.subghz_cs(level)¶
無線ペリフェラルに接続された内部 SPI CS ピンを設定します。
level
引数は有効/無効です。真の値は「CSピンを高」にし、シグナルを非アサート化し、偽の値は「CSピンを低」にし、シグナルをアサート化します。この CS シグナルに対応する内部専用の SPI バスは、 machine.SPI() の
id
値を"SUBGHZ"
としてインスタンス化できます。
- stm.subghz_irq(handler)¶
指定した関数を内部の SUBGHZ 無線の割り込みハンドラとして設定します。無線ペリフェラルの割り込みに応答して、ハンドラ関数は「ハード」割り込みとして呼び出されます。MicroPython の割り込みハンドラについての詳細は 割り込みハンドラの作成 を参照してください。
handler 引数を None にしてこの関数を呼び出すと、IRQ が無効になります。
ハードウェアの制約により、この IRQ が発生するたびに MicroPython はハンドラを呼び出す前に IRQ を無効にします。別の割り込みを受信するために、Python コードは再び
subghz_irq()
を呼び出してハンドラを設定する必要があります。これにより IRQ が再度有効になる副作用があります。
- stm.subghz_is_busy()¶
無線ペリフェラルからの内部の "RFBUSYS" シグナルに対応するブール値を返します。新しいコマンドを SPI 経由で無線送信する前に、この関数が
False
を返すまでポーリングする必要があります。これにより、ビジーシグナルが非アサート化されていることを確認します。