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