stm --- STM32 MCU 專屬功能¶
本模組提供 STM32 微控制器專屬的功能,包括對周邊裝置暫存器的直接存取。
記憶體存取¶
本模組公開了三個可下標的物件,用於原始記憶體存取。每個物件的行為都像一個以位元組位址為索引的稀疏陣列: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 標頭檔內容。
採用兩種命名慣例:
以周邊裝置實例命名的常數(
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
代表性常數¶
下方所選的常數涵蓋每個主要周邊裝置類別各一項,挑選的目的是讓命名慣例一目了然。建置目標的所有其他 CMSIS 符號也都可在模組上取得——請參閱下方的 __getattr__() 以了解型別檢查器的後援機制。
- stm.__getattr__(name: str) int¶
動態屬性後援:任何由韌體公開但未在上方個別列出的 CMSIS 符號(例如
stm.FDCAN1、stm.OCTOSPI1、stm.GPIO_AFR,以及各種位元欄位的位移與遮罩……)仍會以int形式解析為其絕對位址或位移。執行時模組會在匯入時將這些符號直接填入其全域字典中,因此
__getattr__實際上永遠不會被呼叫。公開此簽章的唯一目的,是讓靜態型別檢查器(Pyright、Pylance、mypy)接受stm.<any CMSIS name>而不會出現「module has no attribute」的診斷訊息。