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 einintim Bereich 0-255 aus dem Byte anaddr;mem8[addr] = valueschreibt die unteren 8 Bit vonvalue.addrkann eine beliebige byte-ausgerichtete Adresse sein.
- stm.mem16¶
Subskriptierbarer 16-Bit-Speicherzugriff (Halfword).
mem16[addr]liest einintim Bereich 0-65535;mem16[addr] = valueschreibt die unteren 16 Bit.addrmuss auf 2 Bytes ausgerichtet sein.
- stm.mem32¶
Subskriptierbarer 32-Bit-Speicherzugriff (Word).
mem32[addr]liest einintim Bereich 0-0xFFFFFFFF;mem32[addr] = valueschreibt die unteren 32 Bit.addrmuss 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.GPIOB…GPIOK(der Bereich hängt vom MCU-Gehäuse ab) folgen demselben Muster.
- stm.USART1: int¶
Basisadresse der Peripherie
USART1. Weitere USART-/UART-Instanzen werden unterUSART2,USART3,UART4… bereitgestellt, sofern verfügbar.
- stm.SPI1: int¶
Basisadresse der Peripherie
SPI1. Weitere SPI-Instanzen erscheinen alsSPI2,SPI3, … bis zur Anzahl, die der MCU bietet.
- stm.TIM1: int¶
Basisadresse des Advanced-Control-Timers
TIM1. Allgemeine und einfache Timer (TIM2…TIM17, sofern verfügbar) folgen derselben Benennung.
- stm.DMA1: int¶
Basisadresse von
DMA1.DMA2ist auf den meisten STM32s vorhanden; Bauteile der H7-Klasse stellen außerdemBDMA,MDMAund (auf dem N6)HPDMA/GPDMAbereit.
- stm.FLASH: int¶
Basisadresse des eingebetteten Flash-Controllers (die Peripherie, nicht das Flash-Array selbst).
- stm.TIM_CCR1: int¶
Offset des Timer-Capture/Compare-Registers 1.
TIM_CCR2…TIM_CCR4folgen bei Timern mit mehreren Kanälen.
- 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 alsintzu 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.