stm --- STM32 MCU 固有の機能

このモジュールは、ペリフェラルレジスタへの直接アクセスを含む、STM32 マイクロコントローラ固有の機能を提供します。

メモリアクセス

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

これらのメモリオブジェクトは、以下のペリフェラルレジスタ定数と組み合わせて、MCU のハードウェアペリフェラルレジスタや、SoC のアドレス空間内の他の任意の場所を読み書きするために使用できます。

stm.mem8

添字アクセス可能な 8 ビットメモリアクセサです。mem8[addr]addr のバイトから 0〜255 の範囲の int を読み出します。mem8[addr] = valuevalue の下位 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 ではそれぞれ STM32F427xxSTM32F765xxSTM32H743xxSTM32N657xx となります。名前の完全なセットはファミリーごとに数百個のシンボルに及びます(M4 で 271 個、M7 で 306 個、H7 で 494 個、N6 で 594 個)。ここでそれらをすべて列挙しても、単に ST のリファレンスマニュアルや CMSIS ヘッダーを複製するだけになってしまいます。

2 つの命名規則が使用されています:

  • ペリフェラルインスタンスにちなんで名付けられた定数(GPIOAUSART1TIM2 など)は 絶対ベースアドレス です。

  • ペリフェラルタイプを接頭辞とする定数(GPIO_BSRRUSART_CR1TIM_CCR1 など)は、対応するベースに対する レジスタオフセット です。

絶対ベースとレジスタオフセットを加算すると、単一のレジスタの完全なアドレスが得られます。たとえば stm.GPIOA + stm.GPIO_BSRRGPIOA->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.GPIOA: int

GPIOA ペリフェラルのベースアドレス。GPIOB ... GPIOK(範囲は MCU のパッケージに依存)も同じパターンに従います。

stm.USART1: int

USART1 ペリフェラルのベースアドレス。その他の USART / UART インスタンスは、利用可能なものが USART2USART3UART4 ... として公開されます。

stm.SPI1: int

SPI1 ペリフェラルのベースアドレス。追加の SPI インスタンスは、MCU の数に応じて SPI2SPI3 ... として現れます。

stm.I2C1: int

I2C1 ペリフェラルのベースアドレス。I2C2 ... I2C4 が続きます。

stm.TIM1: int

TIM1 アドバンスドコントロールタイマーのベースアドレス。汎用タイマーおよびベーシックタイマー(利用可能なものが TIM2 ... TIM17)も同じ命名に従います。

stm.ADC1: int

ADC1 のベースアドレス。ADC2 / ADC3 は複数の ADC ブロックを持つ MCU に現れます。

stm.DAC: int

DAC ペリフェラルのベースアドレス(DAC を備えた MCU の場合)。

stm.DMA1: int

DMA1 のベースアドレス。DMA2 はほとんどの STM32 に存在します。H7 クラスの部品では BDMAMDMA、(N6 では)HPDMA / GPDMA も公開されます。

stm.RCC: int

Reset and Clock Control ペリフェラルのベースアドレス。

stm.EXTI: int

External Interrupt / Event Controller のベースアドレス。

stm.FLASH: int

組み込みフラッシュコントローラ(フラッシュアレイそのものではなくペリフェラル)のベースアドレス。

stm.SYSCFG: int

System Configuration Controller のベースアドレス。

stm.PWR: int

Power Control ペリフェラルのベースアドレス。

stm.GPIO_BSRR: int

任意の GPIOx ベース内における GPIO ビットセット/リセットレジスタのオフセット。

stm.GPIO_IDR: int

GPIO 入力データレジスタのオフセット。

stm.GPIO_ODR: int

GPIO 出力データレジスタのオフセット。

stm.USART_CR1: int

USART/UART コントロールレジスタ 1 のオフセット。

stm.TIM_CR1: int

タイマーコントロールレジスタ 1 のオフセット。

stm.TIM_CCR1: int

タイマーキャプチャ/コンペアレジスタ 1 のオフセット。複数チャンネルを持つタイマーでは TIM_CCR2 ... TIM_CCR4 が続きます。

stm.RCC_CR: int

RCC クロックコントロールレジスタのオフセット。

stm.RCC_CFGR: int

RCC クロックコンフィギュレーションレジスタのオフセット。

stm.__getattr__(name: str) int

動的属性のフォールバック: 上記で個別に列挙されていないファームウェアが公開するあらゆる CMSIS シンボル(たとえば stm.FDCAN1stm.OCTOSPI1stm.GPIO_AFR、各種のビットフィールドのシフトやマスクなど)も、依然として int としての絶対アドレスまたはオフセットに解決されます。

ランタイムモジュールはインポート時にこれらのシンボルを直接そのグローバル辞書に登録するため、__getattr__ が実際に呼び出されることはありません。このシグネチャは、静的型チェッカー(Pyright、Pylance、mypy)が「module has no attribute」という診断を出さずに stm.<any CMSIS name> を受け入れられるようにするためだけに公開されています。