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 un int nell’intervallo 0-255 dal byte all’indirizzo addr; mem8[addr] = value scrive gli 8 bit meno significativi di value. addr può essere qualsiasi indirizzo allineato al byte.

stm.mem16#

Accessor di memoria a 16 bit (halfword) subscriptable. mem16[addr] legge un int nell’intervallo 0-65535; mem16[addr] = value scrive i 16 bit meno significativi. addr deve essere allineato a 2 byte.

stm.mem32#

Accessor di memoria a 32 bit (word) subscriptable. mem32[addr] legge un int nell’intervallo 0-0xFFFFFFFF; mem32[addr] = value scrive i 32 bit meno significativi. addr deve 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. GPIOBGPIOK (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 sotto USART2, USART3, UART4 … a seconda della disponibilità.

stm.SPI1: int#

Indirizzo base della periferica SPI1. Ulteriori istanze SPI compaiono come SPI2, SPI3, … fino al numero presente nell’MCU.

stm.I2C1: int#

Indirizzo base della periferica I2C1. I2C2I2C4 seguono.

stm.TIM1: int#

Indirizzo base del timer advanced-control TIM1. I timer general-purpose e basic (TIM2TIM17 a seconda della disponibilità) seguono la stessa denominazione.

stm.ADC1: int#

Indirizzo base di ADC1. ADC2 / ADC3 compaiono sugli MCU con più blocchi ADC.

stm.DAC: int#

Indirizzo base della periferica DAC, sugli MCU che ne dispongono di una.

stm.DMA1: int#

Indirizzo base di DMA1. DMA2 è presente sulla maggior parte degli STM32; le parti della classe H7 espongono anche BDMA, MDMA e (sulla N6) HPDMA / GPDMA.

stm.RCC: int#

Indirizzo base della periferica Reset and Clock Control.

stm.EXTI: int#

Indirizzo base dell’External Interrupt / Event Controller.

stm.FLASH: int#

Indirizzo base del controller della flash integrata (la periferica, non l’array flash stesso).

stm.SYSCFG: int#

Indirizzo base del System Configuration Controller.

stm.PWR: int#

Indirizzo base della periferica Power Control.

stm.GPIO_BSRR: int#

Offset del registro GPIO bit set/reset all’interno di qualsiasi base GPIOx.

stm.GPIO_IDR: int#

Offset del registro GPIO input data.

stm.GPIO_ODR: int#

Offset del registro GPIO output data.

stm.USART_CR1: int#

Offset del registro di controllo 1 della USART/UART.

stm.TIM_CR1: int#

Offset del registro di controllo 1 del timer.

stm.TIM_CCR1: int#

Offset del registro capture/compare 1 del timer. TIM_CCR2TIM_CCR4 seguono sui timer che hanno più canali.

stm.RCC_CR: int#

Offset del registro RCC clock control.

stm.RCC_CFGR: int#

Offset del registro RCC clock configuration.

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 come int.

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) accettino stm.<any CMSIS name> senza una diagnostica «module has no attribute».