stm — funkcionalita specifická pro STM32 MCU

Tento modul poskytuje funkcionalitu specifickou pro mikrokontroléry STM32, včetně přímého přístupu k registrům periferií.

Přístup do paměti

Modul vystavuje tři indexovatelné objekty používané pro přímý přístup do paměti. Každý se chová jako řídké pole indexované adresou bajtu: value = memN[addr] čte, memN[addr] = value zapisuje. Adresa je vždy adresou bajtu, bez ohledu na šířku přístupu.

Tyto paměťové objekty lze v kombinaci s níže uvedenými konstantami registrů periferií použít ke čtení a zápisu registrů hardwarových periferií MCU, stejně jako jakéhokoli jiného místa v adresním prostoru SoC.

stm.mem8

Indexovatelný 8bitový přístupový objekt paměti. mem8[addr] čte int v rozsahu 0-255 z bajtu na adrese addr; mem8[addr] = value zapisuje spodních 8 bitů hodnoty value. addr může být libovolná adresa zarovnaná na bajt.

stm.mem16

Indexovatelný 16bitový (halfword) přístupový objekt paměti. mem16[addr] čte int v rozsahu 0-65535; mem16[addr] = value zapisuje spodních 16 bitů. addr musí být zarovnaná na 2 bajty.

stm.mem32

Indexovatelný 32bitový (word) přístupový objekt paměti. mem32[addr] čte int v rozsahu 0-0xFFFFFFFF; mem32[addr] = value zapisuje spodních 32 bitů. addr musí být zarovnaná na 4 bajty.

Konstanty registrů periferií

Modul stm vystavuje úplnou sadu adres a offsetů registrů CMSIS pro tu rodinu STM32, pro kterou byl firmware zkompilován. Názvy přesně odpovídají hlavičkovým souborům CMSIS od ST: STM32F427xx, STM32F765xx, STM32H743xx a STM32N657xx na OpenMV Cams rodiny M4, M7, H7 (H7 / H7 Plus / Pure Thermal) a N6. Úplná sada názvů čítá několik set symbolů na rodinu (271 na M4, 306 na M7, 494 na H7, 594 na N6); jejich výčet zde by pouze duplikoval referenční příručku ST a hlavičkové soubory CMSIS.

Používají se dvě konvence pojmenování:

  • Konstanty pojmenované podle instance periferie (GPIOA, USART1, TIM2, …) jsou absolutní bázové adresy.

  • Konstanty s prefixem typu periferie (GPIO_BSRR, USART_CR1, TIM_CCR1, …) jsou offsety registrů relativní vůči odpovídající bázi.

Sečtením absolutní báze a offsetu registru získáte úplnou adresu jednoho registru. Například stm.GPIOA + stm.GPIO_BSRR je absolutní adresa GPIOA->BSRR.

Příklad:

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

Reprezentativní konstanty

Níže uvedený výběr pokrývá jednu položku na každou hlavní kategorii periferií, zvolenou tak, aby byla konvence pojmenování na první pohled zřejmá. Každý další symbol CMSIS pro daný cíl sestavení je rovněž v modulu dostupný – viz __getattr__() níže pro náhradní řešení pro typovou kontrolu.

stm.GPIOA: int

Bázová adresa periferie GPIOA. GPIOBGPIOK (rozsah závisí na pouzdru MCU) následují stejný vzor.

stm.USART1: int

Bázová adresa periferie USART1. Další instance USART / UART jsou vystaveny pod USART2, USART3, UART4 … podle dostupnosti.

stm.SPI1: int

Bázová adresa periferie SPI1. Další instance SPI se objevují jako SPI2, SPI3, … až do počtu odpovídajícího MCU.

stm.I2C1: int

Bázová adresa periferie I2C1. I2C2I2C4 následují.

stm.TIM1: int

Bázová adresa časovače TIM1 s pokročilým řízením. Univerzální a základní časovače (TIM2TIM17 podle dostupnosti) následují stejné pojmenování.

stm.ADC1: int

Bázová adresa ADC1. ADC2 / ADC3 se objevují na MCU s více bloky ADC.

stm.DAC: int

Bázová adresa periferie DAC, na MCU, které ji mají.

stm.DMA1: int

Bázová adresa DMA1. DMA2 je přítomna na většině STM32; součásti třídy H7 navíc vystavují BDMA, MDMA a (na N6) HPDMA / GPDMA.

stm.RCC: int

Bázová adresa periferie Reset and Clock Control.

stm.EXTI: int

Bázová adresa řadiče External Interrupt / Event Controller.

stm.FLASH: int

Bázová adresa řadiče vestavěné flash paměti (periferie, nikoli samotného pole flash paměti).

stm.SYSCFG: int

Bázová adresa řadiče System Configuration Controller.

stm.PWR: int

Bázová adresa periferie Power Control.

stm.GPIO_BSRR: int

Offset registru GPIO bit set/reset v rámci libovolné báze GPIOx.

stm.GPIO_IDR: int

Offset vstupního datového registru GPIO.

stm.GPIO_ODR: int

Offset výstupního datového registru GPIO.

stm.USART_CR1: int

Offset řídicího registru 1 USART/UART.

stm.TIM_CR1: int

Offset řídicího registru 1 časovače.

stm.TIM_CCR1: int

Offset registru capture/compare 1 časovače. TIM_CCR2TIM_CCR4 následují na časovačích, které mají více kanálů.

stm.RCC_CR: int

Offset registru řízení hodin RCC.

stm.RCC_CFGR: int

Offset konfiguračního registru hodin RCC.

stm.__getattr__(name: str) int

Náhradní řešení pro dynamické atributy: jakýkoli symbol CMSIS vystavený firmwarem, který není individuálně uveden výše (např. stm.FDCAN1, stm.OCTOSPI1, stm.GPIO_AFR, různé posuny a masky bitových polí, …), se stále vyhodnotí na svou absolutní adresu nebo offset jako int.

Běhový modul vkládá tyto symboly přímo do svého slovníku globals při importu, takže __getattr__ se ve skutečnosti nikdy nevolá. Signatura je vystavena pouze proto, aby statické typové kontroly (Pyright, Pylance, mypy) přijaly stm.<any CMSIS name> bez diagnostiky „module has no attribute“.