stm — funcionalidades específicas dos MCUs STM32

Este módulo fornece funcionalidades específicas dos microcontroladores STM32, incluindo acesso direto aos registradores de periféricos.

Acesso à memória

O módulo expõe três objetos subscritáveis usados para acesso bruto à memória. Cada um se comporta como um array esparso indexado por endereço de byte: value = memN[addr] lê, memN[addr] = value escreve. O endereço é sempre um endereço de byte, independentemente da largura de acesso.

Esses objetos de memória podem ser usados em conjunto com as constantes de registradores de periféricos abaixo para ler e escrever nos registradores de periféricos de hardware do MCU, bem como em qualquer outro local do espaço de endereços do SoC.

stm.mem8

Acessor de memória subscritável de 8 bits. mem8[addr] lê um int na faixa de 0 a 255 a partir do byte em addr; mem8[addr] = value escreve os 8 bits menos significativos de value. addr pode ser qualquer endereço alinhado a byte.

stm.mem16

Acessor de memória subscritável de 16 bits (halfword). mem16[addr] lê um int na faixa de 0 a 65535; mem16[addr] = value escreve os 16 bits menos significativos. addr deve estar alinhado a 2 bytes.

stm.mem32

Acessor de memória subscritável de 32 bits (word). mem32[addr] lê um int na faixa de 0 a 0xFFFFFFFF; mem32[addr] = value escreve os 32 bits menos significativos. addr deve estar alinhado a 4 bytes.

Constantes de registradores de periféricos

O módulo stm expõe o conjunto completo de endereços e offsets de registradores CMSIS para a família STM32 para a qual o firmware foi compilado. Os nomes espelham exatamente os cabeçalhos CMSIS da ST: STM32F427xx, STM32F765xx, STM32H743xx e STM32N657xx nas OpenMV Cams das famílias M4, M7, H7 (H7 / H7 Plus / Pure Thermal) e N6, respectivamente. O conjunto completo de nomes é de várias centenas de símbolos por família (271 no M4, 306 no M7, 494 no H7, 594 no N6); enumerá-los aqui simplesmente duplicaria o manual de referência e os cabeçalhos CMSIS da ST.

São usadas duas convenções de nomenclatura:

  • Constantes nomeadas a partir de uma instância de periférico (GPIOA, USART1, TIM2, …) são endereços base absolutos.

  • Constantes prefixadas com um tipo de periférico (GPIO_BSRR, USART_CR1, TIM_CCR1, …) são offsets de registrador relativos à base correspondente.

Some um endereço base absoluto e um offset de registrador para obter o endereço completo de um único registrador. Por exemplo, stm.GPIOA + stm.GPIO_BSRR é o endereço absoluto de GPIOA->BSRR.

Exemplo:

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

A seleção abaixo cobre uma entrada por categoria principal de periférico, escolhida de modo que a convenção de nomenclatura fique clara à primeira vista. Todos os demais símbolos CMSIS para o alvo de compilação também estão disponíveis no módulo – veja __getattr__() abaixo para o fallback do verificador de tipos.

stm.GPIOA: int

Endereço base do periférico GPIOA. GPIOBGPIOK (a faixa depende do encapsulamento do MCU) seguem o mesmo padrão.

stm.USART1: int

Endereço base do periférico USART1. Outras instâncias USART / UART são expostas como USART2, USART3, UART4 … conforme disponíveis.

stm.SPI1: int

Endereço base do periférico SPI1. Instâncias SPI adicionais aparecem como SPI2, SPI3, … até a quantidade do MCU.

stm.I2C1: int

Endereço base do periférico I2C1. I2C2I2C4 seguem.

stm.TIM1: int

Endereço base do timer de controle avançado TIM1. Os timers de uso geral e básicos (TIM2TIM17 conforme disponíveis) seguem a mesma nomenclatura.

stm.ADC1: int

Endereço base de ADC1. ADC2 / ADC3 aparecem em MCUs com múltiplos blocos ADC.

stm.DAC: int

Endereço base do periférico DAC, em MCUs que possuem um.

stm.DMA1: int

Endereço base de DMA1. DMA2 está presente na maioria dos STM32; peças da classe H7 também expõem BDMA, MDMA e (no N6) HPDMA / GPDMA.

stm.RCC: int

Endereço base do periférico Reset and Clock Control.

stm.EXTI: int

Endereço base do External Interrupt / Event Controller.

stm.FLASH: int

Endereço base do controlador de flash embarcado (o periférico, não o próprio array de flash).

stm.SYSCFG: int

Endereço base do System Configuration Controller.

stm.PWR: int

Endereço base do periférico Power Control.

stm.GPIO_BSRR: int

Offset do registrador de set/reset de bits do GPIO dentro de qualquer base GPIOx.

stm.GPIO_IDR: int

Offset do registrador de dados de entrada do GPIO.

stm.GPIO_ODR: int

Offset do registrador de dados de saída do GPIO.

stm.USART_CR1: int

Offset do registrador de controle 1 do USART/UART.

stm.TIM_CR1: int

Offset do registrador de controle 1 do timer.

stm.TIM_CCR1: int

Offset do registrador de captura/comparação 1 do timer. TIM_CCR2TIM_CCR4 seguem em timers que possuem múltiplos canais.

stm.RCC_CR: int

Offset do registrador de controle de clock do RCC.

stm.RCC_CFGR: int

Offset do registrador de configuração de clock do RCC.

stm.__getattr__(name: str) int

Fallback de atributo dinâmico: qualquer símbolo CMSIS exposto pelo firmware que não esteja listado individualmente acima (por exemplo, stm.FDCAN1, stm.OCTOSPI1, stm.GPIO_AFR, os diversos deslocamentos e máscaras de campos de bits, …) ainda resolve para seu endereço absoluto ou offset como um int.

O módulo em tempo de execução popula esses símbolos diretamente em seu dicionário de globais no momento da importação, de modo que __getattr__ nunca é realmente invocado. A assinatura é exposta apenas para que verificadores estáticos de tipos (Pyright, Pylance, mypy) aceitem stm.<any CMSIS name> sem um diagnóstico de “module has no attribute”.