stm — funcționalitate specifică microcontrolerelor STM32

Acest modul oferă funcționalitate specifică microcontrolerelor STM32, inclusiv acces direct la registrele perifericelor.

Acces la memorie

Modulul expune trei obiecte indexabile folosite pentru acces brut la memorie. Fiecare se comportă ca un tablou rar indexat după adresa de octet: value = memN[addr] citește, memN[addr] = value scrie. Adresa este întotdeauna o adresă de octet, indiferent de lățimea accesului.

Aceste obiecte de memorie pot fi folosite în combinație cu constantele de registru ale perifericelor de mai jos pentru a citi și scrie registrele perifericelor hardware ale MCU-ului, precum și orice altă locație din spațiul de adrese al SoC-ului.

stm.mem8

Accesor de memorie indexabil pe 8 biți. mem8[addr] citește un int în intervalul 0-255 din octetul de la addr; mem8[addr] = value scrie cei mai puțini semnificativi 8 biți ai value. addr poate fi orice adresă aliniată la octet.

stm.mem16

Accesor de memorie indexabil pe 16 biți (halfword). mem16[addr] citește un int în intervalul 0-65535; mem16[addr] = value scrie cei mai puțini semnificativi 16 biți. addr trebuie să fie aliniat la 2 octeți.

stm.mem32

Accesor de memorie indexabil pe 32 de biți (word). mem32[addr] citește un int în intervalul 0-0xFFFFFFFF; mem32[addr] = value scrie cei mai puțini semnificativi 32 de biți. addr trebuie să fie aliniat la 4 octeți.

Constante de registru ale perifericelor

Modulul stm expune setul complet de adrese și deplasamente de registru CMSIS pentru oricare familie STM32 pentru care a fost compilat firmware-ul. Numele oglindesc exact antetele CMSIS ale ST: STM32F427xx, STM32F765xx, STM32H743xx și STM32N657xx pe camerele OpenMV Cam din familiile M4, M7, H7 (H7 / H7 Plus / Pure Thermal) și, respectiv, N6. Setul complet de nume cuprinde câteva sute de simboluri pe familie (271 pe M4, 306 pe M7, 494 pe H7, 594 pe N6); enumerarea lor aici nu ar face decât să dubleze manualul de referință al ST și antetele CMSIS.

Se folosesc două convenții de denumire:

  • Constantele denumite după o instanță de periferic (GPIOA, USART1, TIM2, …) sunt adrese de bază absolute.

  • Constantele cu prefixul unui tip de periferic (GPIO_BSRR, USART_CR1, TIM_CCR1, …) sunt deplasamente de registru relative la baza corespunzătoare.

Adună o bază absolută cu un deplasament de registru pentru a obține adresa completă a unui singur registru. De exemplu, stm.GPIOA + stm.GPIO_BSRR este adresa absolută a GPIOA->BSRR.

Exemplu:

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

Constante reprezentative

Selecția de mai jos acoperă câte o intrare pentru fiecare categorie majoră de periferice, aleasă astfel încât convenția de denumire să fie clară dintr-o privire. Orice alt simbol CMSIS pentru ținta de compilare este de asemenea disponibil pe modul – vezi __getattr__() mai jos pentru soluția de rezervă a verificatorului de tipuri.

stm.GPIOA: int

Adresa de bază a perifericului GPIOA. GPIOBGPIOK (intervalul depinde de capsula MCU-ului) urmează același tipar.

stm.USART1: int

Adresa de bază a perifericului USART1. Alte instanțe USART / UART sunt expuse sub USART2, USART3, UART4 …, după disponibilitate.

stm.SPI1: int

Adresa de bază a perifericului SPI1. Instanțe SPI suplimentare apar ca SPI2, SPI3, … până la numărul existent pe MCU.

stm.I2C1: int

Adresa de bază a perifericului I2C1. I2C2I2C4 urmează.

stm.TIM1: int

Adresa de bază a temporizatorului de control avansat TIM1. Temporizatoarele de uz general și cele de bază (TIM2TIM17, după disponibilitate) urmează aceeași denumire.

stm.ADC1: int

Adresa de bază a ADC1. ADC2 / ADC3 apar pe MCU-urile cu mai multe blocuri ADC.

stm.DAC: int

Adresa de bază a perifericului DAC, pe MCU-urile care au unul.

stm.DMA1: int

Adresa de bază a DMA1. DMA2 este prezent pe majoritatea STM32-urilor; componentele din clasa H7 expun de asemenea BDMA, MDMA și (pe N6) HPDMA / GPDMA.

stm.RCC: int

Adresa de bază a perifericului Reset and Clock Control.

stm.EXTI: int

Adresa de bază a controlerului de întreruperi / evenimente externe (External Interrupt / Event Controller).

stm.FLASH: int

Adresa de bază a controlerului de memorie flash încorporată (perifericul, nu matricea de memorie flash propriu-zisă).

stm.SYSCFG: int

Adresa de bază a controlerului de configurare a sistemului (System Configuration Controller).

stm.PWR: int

Adresa de bază a perifericului Power Control.

stm.GPIO_BSRR: int

Deplasamentul registrului GPIO de setare/resetare a biților, în interiorul oricărei baze GPIOx.

stm.GPIO_IDR: int

Deplasamentul registrului de date de intrare GPIO.

stm.GPIO_ODR: int

Deplasamentul registrului de date de ieșire GPIO.

stm.USART_CR1: int

Deplasamentul registrului de control 1 al USART/UART.

stm.TIM_CR1: int

Deplasamentul registrului de control 1 al temporizatorului.

stm.TIM_CCR1: int

Deplasamentul registrului de captură/comparare 1 al temporizatorului. TIM_CCR2TIM_CCR4 urmează pe temporizatoarele care au mai multe canale.

stm.RCC_CR: int

Deplasamentul registrului RCC de control al ceasului.

stm.RCC_CFGR: int

Deplasamentul registrului RCC de configurare a ceasului.

stm.__getattr__(name: str) int

Soluție de rezervă pentru atribute dinamice: orice simbol CMSIS expus de firmware care nu este listat individual mai sus (de exemplu stm.FDCAN1, stm.OCTOSPI1, stm.GPIO_AFR, diversele deplasări și măști pentru câmpuri de biți, …) se rezolvă în continuare la adresa sau deplasamentul său absolut ca un int.

Modulul în timpul execuției populează aceste simboluri direct în dicționarul său de variabile globale la momentul importului, așa că __getattr__ nu este niciodată apelat efectiv. Semnătura este expusă exclusiv pentru ca verificatoarele statice de tipuri (Pyright, Pylance, mypy) să accepte stm.<any CMSIS name> fără un diagnostic „module has no attribute”.