stm --- STM32 MCU 固有の機能¶
このモジュールは、ペリフェラルレジスタへの直接アクセスを含む、STM32 マイクロコントローラ固有の機能を提供します。
メモリアクセス¶
このモジュールは、生のメモリアクセスに使用される 3 つの添字アクセス可能なオブジェクトを公開しています。それぞれはバイトアドレスをインデックスとするスパース配列のように振る舞います。value = memN[addr] で読み出し、memN[addr] = value で書き込みます。アドレスは、アクセス幅に関係なく常にバイトアドレスです。
これらのメモリオブジェクトは、以下のペリフェラルレジスタ定数と組み合わせて、MCU のハードウェアペリフェラルレジスタや、SoC のアドレス空間内の他の任意の場所を読み書きするために使用できます。
- stm.mem8¶
添字アクセス可能な 8 ビットメモリアクセサです。
mem8[addr]はaddrのバイトから 0〜255 の範囲のintを読み出します。mem8[addr] = valueはvalueの下位 8 ビットを書き込みます。addrは任意のバイト境界アドレスにできます。
- stm.mem16¶
添字アクセス可能な 16 ビット(ハーフワード)メモリアクセサです。
mem16[addr]は 0〜65535 の範囲のintを読み出します。mem16[addr] = valueは下位 16 ビットを書き込みます。addrは 2 バイト境界に整列している必要があります。
- stm.mem32¶
添字アクセス可能な 32 ビット(ワード)メモリアクセサです。
mem32[addr]は 0〜0xFFFFFFFF の範囲のintを読み出します。mem32[addr] = valueは下位 32 ビットを書き込みます。addrは 4 バイト境界に整列している必要があります。
ペリフェラルレジスタ定数¶
stm モジュールは、ファームウェアがコンパイルされた STM32 ファミリーに応じて、CMSIS レジスタアドレスとオフセットの完全なセットを公開します。名前は ST の CMSIS ヘッダーをそのまま反映しており、M4、M7、H7 ファミリー(H7 / H7 Plus / Pure Thermal)および N6 の OpenMV Cam ではそれぞれ STM32F427xx、STM32F765xx、STM32H743xx、STM32N657xx となります。名前の完全なセットはファミリーごとに数百個のシンボルに及びます(M4 で 271 個、M7 で 306 個、H7 で 494 個、N6 で 594 個)。ここでそれらをすべて列挙しても、単に ST のリファレンスマニュアルや CMSIS ヘッダーを複製するだけになってしまいます。
2 つの命名規則が使用されています:
ペリフェラルインスタンスにちなんで名付けられた定数(
GPIOA、USART1、TIM2など)は 絶対ベースアドレス です。ペリフェラルタイプを接頭辞とする定数(
GPIO_BSRR、USART_CR1、TIM_CCR1など)は、対応するベースに対する レジスタオフセット です。
絶対ベースとレジスタオフセットを加算すると、単一のレジスタの完全なアドレスが得られます。たとえば stm.GPIOA + stm.GPIO_BSRR は GPIOA->BSRR の絶対アドレスです。
例:
import stm
# set PA2 high
stm.mem32[stm.GPIOA + stm.GPIO_BSRR] = 1 << 2
# read PA3
value = (stm.mem32[stm.GPIOA + stm.GPIO_IDR] >> 3) & 1
代表的な定数¶
以下の選択は、命名規則が一目で分かるように選んだ、主要なペリフェラルカテゴリごとに 1 つのエントリを取り上げたものです。ビルドターゲットに対するその他すべての CMSIS シンボルもモジュール上で利用できます。型チェッカー用のフォールバックについては、以下の __getattr__() を参照してください。
- stm.USART1: int¶
USART1ペリフェラルのベースアドレス。その他の USART / UART インスタンスは、利用可能なものがUSART2、USART3、UART4... として公開されます。
- stm.DMA1: int¶
DMA1のベースアドレス。DMA2はほとんどの STM32 に存在します。H7 クラスの部品ではBDMA、MDMA、(N6 では)HPDMA/GPDMAも公開されます。
- stm.__getattr__(name: str) int¶
動的属性のフォールバック: 上記で個別に列挙されていないファームウェアが公開するあらゆる CMSIS シンボル(たとえば
stm.FDCAN1、stm.OCTOSPI1、stm.GPIO_AFR、各種のビットフィールドのシフトやマスクなど)も、依然としてintとしての絶対アドレスまたはオフセットに解決されます。ランタイムモジュールはインポート時にこれらのシンボルを直接そのグローバル辞書に登録するため、
__getattr__が実際に呼び出されることはありません。このシグネチャは、静的型チェッカー(Pyright、Pylance、mypy)が「module has no attribute」という診断を出さずにstm.<any CMSIS name>を受け入れられるようにするためだけに公開されています。