stm — funzionalità specifica per gli MCU STM32#
Questo modulo fornisce funzionalità specifica per i microcontrollori STM32, incluso l’accesso diretto ai registri delle periferiche.
Accesso alla memoria#
Il modulo espone tre oggetti subscriptable usati per l’accesso grezzo alla memoria. Ciascuno si comporta come un array sparso indicizzato per indirizzo di byte: value = memN[addr] legge, memN[addr] = value scrive. L’indirizzo è sempre un indirizzo di byte, indipendentemente dalla larghezza dell’accesso.
Questi oggetti di memoria possono essere usati in combinazione con le costanti dei registri delle periferiche elencate di seguito per leggere e scrivere i registri delle periferiche hardware dell’MCU, così come qualsiasi altra posizione nello spazio di indirizzamento del SoC.
- stm.mem8#
Accessor di memoria a 8 bit subscriptable.
mem8[addr]legge unintnell’intervallo 0-255 dal byte all’indirizzoaddr;mem8[addr] = valuescrive gli 8 bit meno significativi divalue.addrpuò essere qualsiasi indirizzo allineato al byte.
- stm.mem16#
Accessor di memoria a 16 bit (halfword) subscriptable.
mem16[addr]legge unintnell’intervallo 0-65535;mem16[addr] = valuescrive i 16 bit meno significativi.addrdeve essere allineato a 2 byte.
- stm.mem32#
Accessor di memoria a 32 bit (word) subscriptable.
mem32[addr]legge unintnell’intervallo 0-0xFFFFFFFF;mem32[addr] = valuescrive i 32 bit meno significativi.addrdeve essere allineato a 4 byte.
Costanti dei registri delle periferiche#
Il modulo stm espone l’insieme completo degli indirizzi e degli offset dei registri CMSIS per qualunque famiglia STM32 per cui è stato compilato il firmware. I nomi rispecchiano esattamente gli header CMSIS di ST: STM32F427xx, STM32F765xx, STM32H743xx e STM32N657xx rispettivamente sulle OpenMV Cam delle famiglie M4, M7, H7 (H7 / H7 Plus / Pure Thermal) e N6. L’insieme completo dei nomi è di diverse centinaia di simboli per famiglia (271 su M4, 306 su M7, 494 su H7, 594 su N6); enumerarli qui non farebbe altro che duplicare il manuale di riferimento e gli header CMSIS di ST.
Vengono usate due convenzioni di denominazione:
Le costanti che prendono il nome da un’istanza di periferica (
GPIOA,USART1,TIM2, …) sono indirizzi base assoluti.Le costanti con prefisso del tipo di periferica (
GPIO_BSRR,USART_CR1,TIM_CCR1, …) sono offset di registro relativi alla base corrispondente.
Somma un indirizzo base assoluto e un offset di registro per ottenere l’indirizzo completo di un singolo registro. Ad esempio stm.GPIOA + stm.GPIO_BSRR è l’indirizzo assoluto di GPIOA->BSRR.
Esempio:
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
Costanti rappresentative#
La selezione seguente copre una voce per ciascuna principale categoria di periferica, scelta in modo che la convenzione di denominazione sia chiara a colpo d’occhio. Ogni altro simbolo CMSIS per il target di compilazione è anch’esso disponibile sul modulo – vedi __getattr__() di seguito per il fallback del type-checker.
- stm.GPIOA: int#
Indirizzo base della periferica
GPIOA.GPIOB…GPIOK(l’intervallo dipende dal package dell’MCU) seguono lo stesso schema.
- stm.USART1: int#
Indirizzo base della periferica
USART1. Altre istanze USART / UART sono esposte sottoUSART2,USART3,UART4… a seconda della disponibilità.
- stm.SPI1: int#
Indirizzo base della periferica
SPI1. Ulteriori istanze SPI compaiono comeSPI2,SPI3, … fino al numero presente nell’MCU.
- stm.TIM1: int#
Indirizzo base del timer advanced-control
TIM1. I timer general-purpose e basic (TIM2…TIM17a seconda della disponibilità) seguono la stessa denominazione.
- stm.DMA1: int#
Indirizzo base di
DMA1.DMA2è presente sulla maggior parte degli STM32; le parti della classe H7 espongono ancheBDMA,MDMAe (sulla N6)HPDMA/GPDMA.
- stm.FLASH: int#
Indirizzo base del controller della flash integrata (la periferica, non l’array flash stesso).
- stm.TIM_CCR1: int#
Offset del registro capture/compare 1 del timer.
TIM_CCR2…TIM_CCR4seguono sui timer che hanno più canali.
- stm.__getattr__(name: str) int#
Fallback per attributi dinamici: qualsiasi simbolo CMSIS esposto dal firmware che non sia elencato individualmente sopra (ad es.
stm.FDCAN1,stm.OCTOSPI1,stm.GPIO_AFR, i vari shift e maschere dei campi di bit, …) si risolve comunque nel suo indirizzo assoluto o offset comeint.Il modulo a runtime popola questi simboli direttamente nel proprio dict di globals al momento dell’import, quindi
__getattr__non viene mai effettivamente invocato. La firma è esposta unicamente affinché i type checker statici (Pyright, Pylance, mypy) accettinostm.<any CMSIS name>senza una diagnostica «module has no attribute».