stm --- STM32 MCU 專屬功能

本模組提供 STM32 微控制器專屬的功能,包括對周邊裝置暫存器的直接存取。

記憶體存取

本模組公開了三個可下標的物件,用於原始記憶體存取。每個物件的行為都像一個以位元組位址為索引的稀疏陣列:value = memN[addr] 為讀取,memN[addr] = value 為寫入。無論存取寬度為何,位址一律為位元組位址。

這些記憶體物件可與下方的周邊暫存器常數搭配使用,以讀寫 MCU 的硬體周邊暫存器,以及 SoC 位址空間中的任何其他位置。

stm.mem8

可下標的 8 位元記憶體存取器。mem8[addr]addr 處的位元組讀取一個範圍為 0-255 的 intmem8[addr] = value 寫入 value 的低 8 位元。addr 可以是任何依位元組對齊的位址。

stm.mem16

可下標的 16 位元(半字組)記憶體存取器。mem16[addr] 讀取一個範圍為 0-65535 的 intmem16[addr] = value 寫入低 16 位元。addr 必須對齊至 2 個位元組。

stm.mem32

可下標的 32 位元(字組)記憶體存取器。mem32[addr] 讀取一個範圍為 0-0xFFFFFFFF 的 intmem32[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 標頭檔內容。

採用兩種命名慣例:

  • 以周邊裝置實例命名的常數(GPIOAUSART1TIM2……)是 絕對基底位址

  • 以周邊裝置類型作為前綴的常數(GPIO_BSRRUSART_CR1TIM_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

代表性常數

下方所選的常數涵蓋每個主要周邊裝置類別各一項,挑選的目的是讓命名慣例一目了然。建置目標的所有其他 CMSIS 符號也都可在模組上取得——請參閱下方的 __getattr__() 以了解型別檢查器的後援機制。

stm.GPIOA: int

GPIOA 周邊裝置的基底位址。GPIOB ……GPIOK(範圍視 MCU 封裝而定)皆遵循相同模式。

stm.USART1: int

USART1 周邊裝置的基底位址。其他 USART / UART 實例會以 USART2USART3UART4 ……(視可用情況而定)公開。

stm.SPI1: int

SPI1 周邊裝置的基底位址。其他 SPI 實例會以 SPI2SPI3……(直到 MCU 的數量上限)出現。

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)接受 stm.<any CMSIS name> 而不會出現「module has no attribute」的診斷訊息。