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

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

Доступ к памяти

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

Эти объекты памяти можно использовать в сочетании с приведёнными ниже константами регистров периферии для чтения и записи аппаратных регистров периферийных устройств микроконтроллера, а также любой другой ячейки в адресном пространстве 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, под которое была скомпилирована прошивка. Имена в точности повторяют заголовочные файлы CMSIS от ST: 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 (диапазон зависит от корпуса микроконтроллера) следуют той же схеме.

stm.USART1: int

Базовый адрес периферийного устройства USART1. Другие экземпляры USART / UART доступны как USART2, USART3, UART4 … при их наличии.

stm.SPI1: int

Базовый адрес периферийного устройства SPI1. Дополнительные экземпляры SPI отображаются как SPI2, SPI3, … вплоть до количества, имеющегося у микроконтроллера.

stm.I2C1: int

Базовый адрес периферийного устройства I2C1. Далее следуют I2C2I2C4.

stm.TIM1: int

Базовый адрес таймера расширенного управления TIM1. Таймеры общего назначения и базовые таймеры (TIM2TIM17 при наличии) следуют той же схеме именования.

stm.ADC1: int

Базовый адрес ADC1. ADC2 / ADC3 появляются на микроконтроллерах с несколькими блоками ADC.

stm.DAC: int

Базовый адрес периферийного устройства DAC на тех микроконтроллерах, которые его имеют.

stm.DMA1: int

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

stm.RCC: int

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

stm.EXTI: int

Базовый адрес контроллера External Interrupt / Event.

stm.FLASH: int

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

stm.SYSCFG: int

Базовый адрес контроллера System Configuration.

stm.PWR: int

Базовый адрес периферийного устройства Power Control.

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.

Модуль времени выполнения помещает эти символы непосредственно в свой словарь globals при импорте, поэтому __getattr__ фактически никогда не вызывается. Сигнатура предоставляется исключительно для того, чтобы статические средства проверки типов (Pyright, Pylance, mypy) принимали stm.<any CMSIS name> без диагностики «module has no attribute».