stm — funcionalidad específica de los MCU STM32

Este módulo proporciona funcionalidad específica de los microcontroladores STM32, incluido el acceso directo a los registros de los periféricos.

Acceso a memoria

El módulo expone tres objetos indexables utilizados para el acceso a memoria sin procesar. Cada uno se comporta como una matriz dispersa indexada por dirección de byte: value = memN[addr] lee, memN[addr] = value escribe. La dirección siempre es una dirección de byte, independientemente del ancho de acceso.

Estos objetos de memoria pueden usarse en combinación con las constantes de registros de periféricos que se indican a continuación para leer y escribir registros de periféricos de hardware del MCU, así como cualquier otra ubicación del espacio de direcciones del SoC.

stm.mem8

Accesor de memoria de 8 bits indexable. mem8[addr] lee un int en el rango 0-255 del byte en addr; mem8[addr] = value escribe los 8 bits menos significativos de value. addr puede ser cualquier dirección alineada a byte.

stm.mem16

Accesor de memoria de 16 bits (media palabra) indexable. mem16[addr] lee un int en el rango 0-65535; mem16[addr] = value escribe los 16 bits menos significativos. addr debe estar alineado a 2 bytes.

stm.mem32

Accesor de memoria de 32 bits (palabra) indexable. mem32[addr] lee un int en el rango 0-0xFFFFFFFF; mem32[addr] = value escribe los 32 bits menos significativos. addr debe estar alineado a 4 bytes.

Constantes de registros de periféricos

El módulo stm expone el conjunto completo de direcciones y desplazamientos de registros CMSIS para la familia STM32 para la que se compiló el firmware. Los nombres reflejan exactamente los encabezados CMSIS de ST: STM32F427xx, STM32F765xx, STM32H743xx y STM32N657xx en las OpenMV Cam de las familias M4, M7, H7 (H7 / H7 Plus / Pure Thermal) y N6 respectivamente. El conjunto completo de nombres consta de varios cientos de símbolos por familia (271 en M4, 306 en M7, 494 en H7, 594 en N6); enumerarlos aquí simplemente duplicaría el manual de referencia de ST y los encabezados CMSIS.

Se utilizan dos convenciones de nomenclatura:

  • Las constantes nombradas según una instancia de periférico (GPIOA, USART1, TIM2, …) son direcciones base absolutas.

  • Las constantes con el prefijo de un tipo de periférico (GPIO_BSRR, USART_CR1, TIM_CCR1, …) son desplazamientos de registro relativos a la base correspondiente.

Sume una base absoluta y un desplazamiento de registro para obtener la dirección completa de un único registro. Por ejemplo, stm.GPIOA + stm.GPIO_BSRR es la dirección absoluta de GPIOA->BSRR.

Ejemplo:

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

Constantes representativas

La selección siguiente cubre una entrada por cada categoría principal de periféricos, escogida de modo que la convención de nomenclatura quede clara a primera vista. Todos los demás símbolos CMSIS para el destino de compilación también están disponibles en el módulo; consulte __getattr__() más abajo para el mecanismo de respaldo del comprobador de tipos.

stm.GPIOA: int

Dirección base del periférico GPIOA. GPIOBGPIOK (el rango depende del encapsulado del MCU) siguen el mismo patrón.

stm.USART1: int

Dirección base del periférico USART1. Otras instancias de USART / UART se exponen como USART2, USART3, UART4 … según disponibilidad.

stm.SPI1: int

Dirección base del periférico SPI1. Las instancias SPI adicionales aparecen como SPI2, SPI3, … hasta el número que tenga el MCU.

stm.I2C1: int

Dirección base del periférico I2C1. I2C2I2C4 le siguen.

stm.TIM1: int

Dirección base del temporizador de control avanzado TIM1. Los temporizadores de propósito general y básicos (TIM2TIM17 según disponibilidad) siguen la misma nomenclatura.

stm.ADC1: int

Dirección base de ADC1. ADC2 / ADC3 aparecen en los MCU con varios bloques ADC.

stm.DAC: int

Dirección base del periférico DAC, en los MCU que disponen de uno.

stm.DMA1: int

Dirección base de DMA1. DMA2 está presente en la mayoría de los STM32; las piezas de clase H7 también exponen BDMA, MDMA y (en la N6) HPDMA / GPDMA.

stm.RCC: int

Dirección base del periférico de Reset and Clock Control.

stm.EXTI: int

Dirección base del External Interrupt / Event Controller.

stm.FLASH: int

Dirección base del controlador de la memoria flash integrada (el periférico, no la propia matriz flash).

stm.SYSCFG: int

Dirección base del System Configuration Controller.

stm.PWR: int

Dirección base del periférico Power Control.

stm.GPIO_BSRR: int

Desplazamiento del registro de set/reset de bits del GPIO dentro de cualquier base GPIOx.

stm.GPIO_IDR: int

Desplazamiento del registro de datos de entrada del GPIO.

stm.GPIO_ODR: int

Desplazamiento del registro de datos de salida del GPIO.

stm.USART_CR1: int

Desplazamiento del registro de control 1 del USART/UART.

stm.TIM_CR1: int

Desplazamiento del registro de control 1 del temporizador.

stm.TIM_CCR1: int

Desplazamiento del registro de captura/comparación 1 del temporizador. TIM_CCR2TIM_CCR4 le siguen en los temporizadores que tienen varios canales.

stm.RCC_CR: int

Desplazamiento del registro de control de reloj del RCC.

stm.RCC_CFGR: int

Desplazamiento del registro de configuración de reloj del RCC.

stm.__getattr__(name: str) int

Mecanismo de respaldo de atributos dinámicos: cualquier símbolo CMSIS expuesto por el firmware que no esté listado individualmente más arriba (por ejemplo, stm.FDCAN1, stm.OCTOSPI1, stm.GPIO_AFR, los diversos desplazamientos y máscaras de campos de bits, …) sigue resolviéndose a su dirección absoluta o desplazamiento como un int.

El módulo en tiempo de ejecución rellena estos símbolos directamente en su diccionario de globales en el momento de la importación, por lo que __getattr__ nunca se invoca realmente. La firma se expone únicamente para que los comprobadores estáticos de tipos (Pyright, Pylance, mypy) acepten stm.<any CMSIS name> sin un diagnóstico de «el módulo no tiene atributo».