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».