stm — funkcjonalność specyficzna dla mikrokontrolerów STM32

Ten moduł zapewnia funkcjonalność specyficzną dla mikrokontrolerów STM32, w tym bezpośredni dostęp do rejestrów urządzeń peryferyjnych.

Dostęp do pamięci

Moduł udostępnia trzy obiekty z możliwością indeksowania, używane do surowego dostępu do pamięci. Każdy z nich zachowuje się jak rzadka tablica indeksowana adresem bajtu: value = memN[addr] odczytuje, memN[addr] = value zapisuje. Adres jest zawsze adresem bajtu, niezależnie od szerokości dostępu.

Tych obiektów pamięci można używać w połączeniu ze stałymi rejestrów urządzeń peryferyjnych poniżej do odczytu i zapisu rejestrów sprzętowych urządzeń peryferyjnych MCU, jak również dowolnej innej lokalizacji w przestrzeni adresowej SoC.

stm.mem8

Akcesor pamięci 8-bitowej z możliwością indeksowania. mem8[addr] odczytuje wartość int z zakresu 0-255 z bajtu pod adresem addr; mem8[addr] = value zapisuje dolne 8 bitów wartości value. addr może być dowolnym adresem wyrównanym do bajtu.

stm.mem16

Akcesor pamięci 16-bitowej (półsłowa) z możliwością indeksowania. mem16[addr] odczytuje wartość int z zakresu 0-65535; mem16[addr] = value zapisuje dolne 16 bitów. addr musi być wyrównany do 2 bajtów.

stm.mem32

Akcesor pamięci 32-bitowej (słowa) z możliwością indeksowania. mem32[addr] odczytuje wartość int z zakresu 0-0xFFFFFFFF; mem32[addr] = value zapisuje dolne 32 bity. addr musi być wyrównany do 4 bajtów.

Stałe rejestrów urządzeń peryferyjnych

Moduł stm udostępnia pełny zestaw adresów i przesunięć rejestrów CMSIS dla rodziny STM32, dla której zostało skompilowane oprogramowanie układowe. Nazwy dokładnie odzwierciedlają nagłówki CMSIS firmy ST: STM32F427xx, STM32F765xx, STM32H743xx i STM32N657xx odpowiednio na kamerach OpenMV Cam z rodzin M4, M7, H7 (H7 / H7 Plus / Pure Thermal) i N6. Pełny zestaw nazw to kilkaset symboli na rodzinę (271 na M4, 306 na M7, 494 na H7, 594 na N6); wyliczanie ich tutaj byłoby zwykłym powieleniem podręcznika referencyjnego ST i nagłówków CMSIS.

Stosowane są dwie konwencje nazewnictwa:

  • Stałe nazwane od instancji urządzenia peryferyjnego (GPIOA, USART1, TIM2, …) to bezwzględne adresy bazowe.

  • Stałe z przedrostkiem typu urządzenia peryferyjnego (GPIO_BSRR, USART_CR1, TIM_CCR1, …) to przesunięcia rejestrów względem odpowiadającej bazy.

Dodaj bezwzględną bazę i przesunięcie rejestru, aby uzyskać pełny adres pojedynczego rejestru. Na przykład stm.GPIOA + stm.GPIO_BSRR to bezwzględny adres GPIOA->BSRR.

Przykład:

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

Reprezentatywne stałe

Poniższy wybór obejmuje po jednym wpisie na każdą główną kategorię urządzeń peryferyjnych, dobranym tak, aby konwencja nazewnictwa była jasna na pierwszy rzut oka. Każdy inny symbol CMSIS dla celu kompilacji jest również dostępny w module – zob. __getattr__() poniżej, opisujący mechanizm awaryjny dla narzędzia sprawdzającego typy.

stm.GPIOA: int

Adres bazowy urządzenia peryferyjnego GPIOA. GPIOBGPIOK (zakres zależy od obudowy MCU) podążają za tym samym wzorcem.

stm.USART1: int

Adres bazowy urządzenia peryferyjnego USART1. Pozostałe instancje USART / UART są udostępniane pod USART2, USART3, UART4 … w miarę dostępności.

stm.SPI1: int

Adres bazowy urządzenia peryferyjnego SPI1. Dodatkowe instancje SPI pojawiają się jako SPI2, SPI3, … aż do liczby dostępnej w MCU.

stm.I2C1: int

Adres bazowy urządzenia peryferyjnego I2C1. Dalej następują I2C2I2C4.

stm.TIM1: int

Adres bazowy licznika czasu (timera) zaawansowanego sterowania TIM1. Liczniki ogólnego przeznaczenia i podstawowe (TIM2TIM17 w miarę dostępności) podążają za tym samym nazewnictwem.

stm.ADC1: int

Adres bazowy ADC1. ADC2 / ADC3 pojawiają się na MCU z wieloma blokami ADC.

stm.DAC: int

Adres bazowy urządzenia peryferyjnego DAC, na MCU, które je posiadają.

stm.DMA1: int

Adres bazowy DMA1. DMA2 jest obecny na większości układów STM32; części klasy H7 udostępniają również BDMA, MDMA oraz (na N6) HPDMA / GPDMA.

stm.RCC: int

Adres bazowy urządzenia peryferyjnego Reset and Clock Control.

stm.EXTI: int

Adres bazowy kontrolera External Interrupt / Event Controller.

stm.FLASH: int

Adres bazowy wbudowanego kontrolera pamięci flash (urządzenia peryferyjnego, a nie samej macierzy flash).

stm.SYSCFG: int

Adres bazowy kontrolera System Configuration Controller.

stm.PWR: int

Adres bazowy urządzenia peryferyjnego Power Control.

stm.GPIO_BSRR: int

Przesunięcie rejestru ustawiania/resetowania bitów GPIO w obrębie dowolnej bazy GPIOx.

stm.GPIO_IDR: int

Przesunięcie rejestru danych wejściowych GPIO.

stm.GPIO_ODR: int

Przesunięcie rejestru danych wyjściowych GPIO.

stm.USART_CR1: int

Przesunięcie rejestru sterującego 1 USART/UART.

stm.TIM_CR1: int

Przesunięcie rejestru sterującego 1 licznika czasu (timera).

stm.TIM_CCR1: int

Przesunięcie rejestru przechwytywania/porównywania 1 licznika czasu (timera). TIM_CCR2TIM_CCR4 następują na licznikach posiadających wiele kanałów.

stm.RCC_CR: int

Przesunięcie rejestru sterującego zegarem RCC.

stm.RCC_CFGR: int

Przesunięcie rejestru konfiguracji zegara RCC.

stm.__getattr__(name: str) int

Mechanizm awaryjny atrybutów dynamicznych: każdy symbol CMSIS udostępniany przez oprogramowanie układowe, który nie jest indywidualnie wymieniony powyżej (np. stm.FDCAN1, stm.OCTOSPI1, stm.GPIO_AFR, różne przesunięcia i maski pól bitowych, …) nadal rozwiązuje się do swojego bezwzględnego adresu lub przesunięcia jako wartość int.

Moduł czasu wykonania wypełnia te symbole bezpośrednio do swojego słownika globals w momencie importu, więc __getattr__ nigdy nie jest faktycznie wywoływany. Sygnatura jest udostępniona wyłącznie po to, aby statyczne narzędzia sprawdzające typy (Pyright, Pylance, mypy) akceptowały stm.<any CMSIS name> bez komunikatu diagnostycznego „module has no attribute”.