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> без діагностики «модуль не має атрибута».