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.GPIOB…GPIOK(діапазон залежить від корпусу MCU) дотримуються того самого шаблону.
- stm.USART1: int¶
Базова адреса периферійного пристрою
USART1. Інші екземпляри USART / UART доступні якUSART2,USART3,UART4… залежно від наявності.
- stm.SPI1: int¶
Базова адреса периферійного пристрою
SPI1. Додаткові екземпляри SPI доступні якSPI2,SPI3, … до кількості, підтримуваної MCU.
- stm.TIM1: int¶
Базова адреса вдосконаленого таймера керування
TIM1. Таймери загального призначення та базові (TIM2…TIM17за наявності) дотримуються того самого іменування.
- stm.DMA1: int¶
Базова адреса
DMA1.DMA2присутній на більшості STM32; чіпи класу H7 також надаютьBDMA,MDMAта (для N6)HPDMA/GPDMA.
- stm.FLASH: int¶
Базова адреса контролера вбудованої флеш-пам’яті (периферійний пристрій, а не сам масив флеш-пам’яті).
- stm.GPIO_BSRR: int¶
Зміщення регістра встановлення/скидання бітів GPIO в межах будь-якої бази
GPIOx.
- stm.TIM_CCR1: int¶
Зміщення регістра захоплення/порівняння 1 таймера.
TIM_CCR2…TIM_CCR4продовжують ряд для таймерів із кількома каналами.
- stm.__getattr__(name: str) int¶
Резервний атрибут для динамічного доступу: будь-який символ CMSIS, наданий мікропрограмою, якого немає в переліку вище (наприклад,
stm.FDCAN1,stm.OCTOSPI1,stm.GPIO_AFR, різні зміщення та маски бітових полів, …) все одно повертає свою абсолютну адресу або зміщення якint.Модуль під час виконання заповнює ці символи безпосередньо у свій словник глобальних змінних під час імпорту, тому
__getattr__фактично ніколи не викликається. Сигнатура надається виключно для того, щоб статичні засоби перевірки типів (Pyright, Pylance, mypy) приймалиstm.<any CMSIS name>без діагностики «модуль не має атрибута».