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ê umintna faixa de 0 a 255 a partir do byte emaddr;mem8[addr] = valueescreve os 8 bits menos significativos devalue.addrpode ser qualquer endereço alinhado a byte.
- stm.mem16¶
Acessor de memória subscritável de 16 bits (halfword).
mem16[addr]lê umintna faixa de 0 a 65535;mem16[addr] = valueescreve os 16 bits menos significativos.addrdeve estar alinhado a 2 bytes.
- stm.mem32¶
Acessor de memória subscritável de 32 bits (word).
mem32[addr]lê umintna faixa de 0 a 0xFFFFFFFF;mem32[addr] = valueescreve os 32 bits menos significativos.addrdeve 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.GPIOB…GPIOK(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 comoUSART2,USART3,UART4… conforme disponíveis.
- stm.SPI1: int¶
Endereço base do periférico
SPI1. Instâncias SPI adicionais aparecem comoSPI2,SPI3, … até a quantidade do MCU.
- stm.TIM1: int¶
Endereço base do timer de controle avançado
TIM1. Os timers de uso geral e básicos (TIM2…TIM17conforme disponíveis) seguem a mesma nomenclatura.
- stm.DMA1: int¶
Endereço base de
DMA1.DMA2está presente na maioria dos STM32; peças da classe H7 também expõemBDMA,MDMAe (no N6)HPDMA/GPDMA.
- stm.FLASH: int¶
Endereço base do controlador de flash embarcado (o periférico, não o próprio array de flash).
- stm.GPIO_BSRR: int¶
Offset do registrador de set/reset de bits do GPIO dentro de qualquer base
GPIOx.
- stm.TIM_CCR1: int¶
Offset do registrador de captura/comparação 1 do timer.
TIM_CCR2…TIM_CCR4seguem em timers que possuem múltiplos canais.
- 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 umint.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) aceitemstm.<any CMSIS name>sem um diagnóstico de “module has no attribute”.