stm — STM32-MCU-spezifische Funktionalität

Dieses Modul bietet Funktionalität, die spezifisch für STM32-Mikrocontroller ist, einschließlich direktem Zugriff auf Peripherie-Register.

Speicherzugriff

Das Modul stellt drei subskriptierbare Objekte für den direkten Speicherzugriff bereit. Jedes verhält sich wie ein dünn besetztes, nach Byte-Adresse indiziertes Array: value = memN[addr] liest, memN[addr] = value schreibt. Die Adresse ist unabhängig von der Zugriffsbreite stets eine Byte-Adresse.

Diese Speicherobjekte können in Kombination mit den untenstehenden Peripherie-Register-Konstanten verwendet werden, um Hardware-Peripherie-Register des MCU sowie jeden anderen Ort im Adressraum des SoC zu lesen und zu schreiben.

stm.mem8

Subskriptierbarer 8-Bit-Speicherzugriff. mem8[addr] liest ein int im Bereich 0-255 aus dem Byte an addr; mem8[addr] = value schreibt die unteren 8 Bit von value. addr kann eine beliebige byte-ausgerichtete Adresse sein.

stm.mem16

Subskriptierbarer 16-Bit-Speicherzugriff (Halfword). mem16[addr] liest ein int im Bereich 0-65535; mem16[addr] = value schreibt die unteren 16 Bit. addr muss auf 2 Bytes ausgerichtet sein.

stm.mem32

Subskriptierbarer 32-Bit-Speicherzugriff (Word). mem32[addr] liest ein int im Bereich 0-0xFFFFFFFF; mem32[addr] = value schreibt die unteren 32 Bit. addr muss auf 4 Bytes ausgerichtet sein.

Peripherie-Register-Konstanten

Das Modul stm stellt den vollständigen Satz von CMSIS-Register-Adressen und -Offsets für diejenige STM32-Familie bereit, für die die Firmware kompiliert wurde. Die Namen entsprechen exakt den CMSIS-Headern von ST: STM32F427xx, STM32F765xx, STM32H743xx und STM32N657xx auf den OpenMV Cams der M4-, M7-, H7-Familie (H7 / H7 Plus / Pure Thermal) bzw. N6. Der vollständige Satz von Namen umfasst mehrere Hundert Symbole pro Familie (271 auf M4, 306 auf M7, 494 auf H7, 594 auf N6); sie hier aufzuzählen würde lediglich das Referenzhandbuch von ST und die CMSIS-Header duplizieren.

Es werden zwei Namenskonventionen verwendet:

  • Konstanten, die nach einer Peripherie-Instanz benannt sind (GPIOA, USART1, TIM2, …), sind absolute Basisadressen.

  • Konstanten mit einem Peripherie-Typ-Präfix (GPIO_BSRR, USART_CR1, TIM_CCR1, …) sind Register-Offsets relativ zur passenden Basis.

Addieren Sie eine absolute Basis und einen Register-Offset, um die vollständige Adresse eines einzelnen Registers zu erhalten. Zum Beispiel ist stm.GPIOA + stm.GPIO_BSRR die absolute Adresse von GPIOA->BSRR.

Beispiel:

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

Repräsentative Konstanten

Die folgende Auswahl deckt einen Eintrag pro wichtiger Peripherie-Kategorie ab, ausgewählt so, dass die Namenskonvention auf einen Blick klar wird. Jedes weitere CMSIS-Symbol für das Build-Ziel ist ebenfalls im Modul verfügbar – siehe __getattr__() unten für den Type-Checker-Fallback.

stm.GPIOA: int

Basisadresse der Peripherie GPIOA. GPIOBGPIOK (der Bereich hängt vom MCU-Gehäuse ab) folgen demselben Muster.

stm.USART1: int

Basisadresse der Peripherie USART1. Weitere USART-/UART-Instanzen werden unter USART2, USART3, UART4 … bereitgestellt, sofern verfügbar.

stm.SPI1: int

Basisadresse der Peripherie SPI1. Weitere SPI-Instanzen erscheinen als SPI2, SPI3, … bis zur Anzahl, die der MCU bietet.

stm.I2C1: int

Basisadresse der Peripherie I2C1. I2C2I2C4 folgen.

stm.TIM1: int

Basisadresse des Advanced-Control-Timers TIM1. Allgemeine und einfache Timer (TIM2TIM17, sofern verfügbar) folgen derselben Benennung.

stm.ADC1: int

Basisadresse von ADC1. ADC2 / ADC3 erscheinen auf MCUs mit mehreren ADC-Blöcken.

stm.DAC: int

Basisadresse der DAC-Peripherie, auf MCUs, die eine besitzen.

stm.DMA1: int

Basisadresse von DMA1. DMA2 ist auf den meisten STM32s vorhanden; Bauteile der H7-Klasse stellen außerdem BDMA, MDMA und (auf dem N6) HPDMA / GPDMA bereit.

stm.RCC: int

Basisadresse der Reset- and Clock-Control-Peripherie.

stm.EXTI: int

Basisadresse des External Interrupt / Event Controllers.

stm.FLASH: int

Basisadresse des eingebetteten Flash-Controllers (die Peripherie, nicht das Flash-Array selbst).

stm.SYSCFG: int

Basisadresse des System Configuration Controllers.

stm.PWR: int

Basisadresse der Power-Control-Peripherie.

stm.GPIO_BSRR: int

Offset des GPIO-Bit-Set/Reset-Registers innerhalb einer beliebigen GPIOx-Basis.

stm.GPIO_IDR: int

Offset des GPIO-Eingangsdatenregisters.

stm.GPIO_ODR: int

Offset des GPIO-Ausgangsdatenregisters.

stm.USART_CR1: int

Offset des USART/UART-Steuerregisters 1.

stm.TIM_CR1: int

Offset des Timer-Steuerregisters 1.

stm.TIM_CCR1: int

Offset des Timer-Capture/Compare-Registers 1. TIM_CCR2TIM_CCR4 folgen bei Timern mit mehreren Kanälen.

stm.RCC_CR: int

Offset des RCC-Clock-Control-Registers.

stm.RCC_CFGR: int

Offset des RCC-Clock-Configuration-Registers.

stm.__getattr__(name: str) int

Fallback für dynamische Attribute: Jedes von der Firmware bereitgestellte CMSIS-Symbol, das oben nicht einzeln aufgeführt ist (z. B. stm.FDCAN1, stm.OCTOSPI1, stm.GPIO_AFR, die verschiedenen Bitfeld-Shifts und -Masken, …), wird dennoch als int zu seiner absoluten Adresse oder seinem Offset aufgelöst.

Das Laufzeitmodul füllt diese Symbole zum Importzeitpunkt direkt in sein globals-Dict ein, sodass __getattr__ tatsächlich nie aufgerufen wird. Die Signatur wird ausschließlich offengelegt, damit statische Type-Checker (Pyright, Pylance, mypy) stm.<any CMSIS name> ohne eine „module has no attribute“-Diagnose akzeptieren.