stm — функціональність, специфічна для мікроконтролерів STM32#

Цей модуль надає функціональність, специфічну для мікроконтролерів STM32, включаючи прямий доступ до регістрів периферійних пристроїв.

Доступ до пам’яті#

Модуль надає три індексовані об’єкти для прямого доступу до пам’яті. Кожен поводиться як розріджений масив, індексований байтовою адресою: value = memN[addr] — читання, memN[addr] = value — запис. Адреса завжди є байтовою, незалежно від ширини доступу.

Ці об’єкти пам’яті можна використовувати разом із константами регістрів периферійних пристроїв нижче для читання та запису регістрів апаратних периферійних пристроїв MCU, а також будь-якого іншого місця в адресному просторі SoC.

stm.mem8#

Індексований 8-бітний аксесор пам’яті. mem8[addr] читає int в діапазоні 0–255 з байта за адресою addr; mem8[addr] = value записує молодші 8 біт value. addr може бути будь-якою байтово-вирівняною адресою.

stm.mem16#

Індексований 16-бітний (напівслово) аксесор пам’яті. mem16[addr] читає int в діапазоні 0–65535; mem16[addr] = value записує молодші 16 біт. addr повинна бути вирівняна до 2 байтів.

stm.mem32#

Індексований 32-бітний (слово) аксесор пам’яті. mem32[addr] читає int в діапазоні 0–0xFFFFFFFF; mem32[addr] = value записує молодші 32 біти. addr повинна бути вирівняна до 4 байтів.

Константи регістрів периферійних пристроїв#

Модуль stm надає повний набір адрес і зміщень регістрів CMSIS для тієї родини STM32, для якої скомпільовано мікропрограму. Імена точно відповідають заголовкам ST CMSIS: STM32F427xx, STM32F765xx, STM32H743xx та STM32N657xx для OpenMV Cam на базі M4, M7, H7 (H7 / H7 Plus / Pure Thermal) та N6 відповідно. Повний набір імен налічує кілька сотень символів на родину (271 для M4, 306 для M7, 494 для H7, 594 для N6); перерахування їх тут лише дублювало б довідковий посібник ST та заголовки CMSIS.

Використовуються дві угоди про іменування:

  • Константи, названі за екземпляром периферійного пристрою (GPIOA, USART1, TIM2, …) — це абсолютні базові адреси.

  • Константи з префіксом типу периферійного пристрою (GPIO_BSRR, USART_CR1, TIM_CCR1, …) — це зміщення регістрів відносно відповідної бази.

Для отримання повної адреси окремого регістра слід додати абсолютну базову адресу та зміщення регістра. Наприклад, stm.GPIOA + stm.GPIO_BSRR — це абсолютна адреса GPIOA->BSRR.

Приклад:

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

Репрезентативні константи#

Наведений нижче перелік охоплює по одному запису на кожну основну категорію периферійних пристроїв, обраних так, щоб угода про іменування була зрозуміла з першого погляду. Кожен інший символ CMSIS для цільового середовища збірки також доступний у модулі — дивіться __getattr__() нижче для резервного варіанту перевірки типів.

stm.GPIOA: int#

Базова адреса периферійного пристрою GPIOA. GPIOBGPIOK (діапазон залежить від корпусу MCU) дотримуються того самого шаблону.

stm.USART1: int#

Базова адреса периферійного пристрою USART1. Інші екземпляри USART / UART доступні як USART2, USART3, UART4 … залежно від наявності.

stm.SPI1: int#

Базова адреса периферійного пристрою SPI1. Додаткові екземпляри SPI доступні як SPI2, SPI3, … до кількості, підтримуваної MCU.

stm.I2C1: int#

Базова адреса периферійного пристрою I2C1. I2C2I2C4 продовжують ряд.

stm.TIM1: int#

Базова адреса вдосконаленого таймера керування TIM1. Таймери загального призначення та базові (TIM2TIM17 за наявності) дотримуються того самого іменування.

stm.ADC1: int#

Базова адреса ADC1. ADC2 / ADC3 доступні на MCU з кількома блоками ADC.

stm.DAC: int#

Базова адреса периферійного пристрою DAC на MCU, де він наявний.

stm.DMA1: int#

Базова адреса DMA1. DMA2 присутній на більшості STM32; чіпи класу H7 також надають BDMA, MDMA та (для N6) HPDMA / GPDMA.

stm.RCC: int#

Базова адреса периферійного пристрою Reset and Clock Control.

stm.EXTI: int#

Базова адреса контролера зовнішніх переривань/подій.

stm.FLASH: int#

Базова адреса контролера вбудованої флеш-пам’яті (периферійний пристрій, а не сам масив флеш-пам’яті).

stm.SYSCFG: int#

Базова адреса контролера конфігурації системи.

stm.PWR: int#

Базова адреса периферійного пристрою керування живленням.

stm.GPIO_BSRR: int#

Зміщення регістра встановлення/скидання бітів GPIO в межах будь-якої бази GPIOx.

stm.GPIO_IDR: int#

Зміщення регістра вхідних даних GPIO.

stm.GPIO_ODR: int#

Зміщення регістра вихідних даних GPIO.

stm.USART_CR1: int#

Зміщення регістра керування 1 USART/UART.

stm.TIM_CR1: int#

Зміщення регістра керування 1 таймера.

stm.TIM_CCR1: int#

Зміщення регістра захоплення/порівняння 1 таймера. TIM_CCR2TIM_CCR4 продовжують ряд для таймерів із кількома каналами.

stm.RCC_CR: int#

Зміщення регістра керування тактуванням RCC.

stm.RCC_CFGR: int#

Зміщення регістра конфігурації тактування RCC.

stm.__getattr__(name: str) int#

Резервний атрибут для динамічного доступу: будь-який символ CMSIS, наданий мікропрограмою, якого немає в переліку вище (наприклад, stm.FDCAN1, stm.OCTOSPI1, stm.GPIO_AFR, різні зміщення та маски бітових полів, …) все одно повертає свою абсолютну адресу або зміщення як int.

Модуль під час виконання заповнює ці символи безпосередньо у свій словник глобальних змінних під час імпорту, тому __getattr__ фактично ніколи не викликається. Сигнатура надається виключно для того, щоб статичні засоби перевірки типів (Pyright, Pylance, mypy) приймали stm.<any CMSIS name> без діагностики «модуль не має атрибута».