stm — funcionalidades específicas para MCUs STM32¶
Este módulo fornece funcionalidades específicas para microcontroladores STM32, incluindo acesso direto a registos de periféricos.
Acesso à memória¶
O módulo expõe três objetos subscritáveis utilizados para acesso direto à memória. Cada um comporta-se 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.
Estes objetos de memória podem ser utilizados em combinação com as constantes de registos de periféricos abaixo para ler e escrever registos de periféricos de hardware do MCU, bem como qualquer outro local no espaço de endereços do SoC.
- stm.mem8¶
Acessor de memória de 8 bits subscritável.
mem8[addr]lê umintno intervalo 0-255 do byte emaddr;mem8[addr] = valueescreve os 8 bits inferiores devalue.addrpode ser qualquer endereço alinhado por byte.
- stm.mem16¶
Acessor de memória de 16 bits (meia palavra) subscritável.
mem16[addr]lê umintno intervalo 0-65535;mem16[addr] = valueescreve os 16 bits inferiores.addrdeve estar alinhado a 2 bytes.
- stm.mem32¶
Acessor de memória de 32 bits (palavra) subscritável.
mem32[addr]lê umintno intervalo 0-0xFFFFFFFF;mem32[addr] = valueescreve os 32 bits inferiores.addrdeve estar alinhado a 4 bytes.
Constantes de registos de periféricos¶
O módulo stm expõe o conjunto completo de endereços e deslocamentos de registos 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 famílias M4, M7, H7 (H7 / H7 Plus / Pure Thermal) e N6 das OpenMV Cams, respetivamente. 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 seria apenas duplicar o manual de referência da ST e os cabeçalhos CMSIS.
São utilizadas duas convenções de nomenclatura:
As constantes com o nome de uma instância de periférico (
GPIOA,USART1,TIM2, …) são endereços base absolutos.As constantes prefixadas com um tipo de periférico (
GPIO_BSRR,USART_CR1,TIM_CCR1, …) são deslocamentos de registo relativos à base correspondente.
Some um endereço base absoluto e um deslocamento de registo para obter o endereço completo de um único registo. 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 para que a convenção de nomenclatura seja clara à primeira vista. Todos os outros símbolos CMSIS para o alvo de compilação estão também disponíveis no módulo – consulte __getattr__() abaixo para o fallback do verificador de tipos.
- stm.GPIOA: int¶
Endereço base do periférico
GPIOA.GPIOB…GPIOK(o intervalo 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 estão expostas emUSART2,USART3,UART4… conforme disponível.
- stm.SPI1: int¶
Endereço base do periférico
SPI1. Instâncias SPI adicionais aparecem comoSPI2,SPI3, … até ao número disponível no MCU.
- stm.TIM1: int¶
Endereço base do temporizador de controlo avançado
TIM1. Os temporizadores de uso geral e básicos (TIM2…TIM17conforme disponível) seguem a mesma nomenclatura.
- stm.DMA1: int¶
Endereço base de
DMA1.DMA2está presente na maioria dos STM32; os componentes da classe H7 também expõemBDMA,MDMAe (no N6)HPDMA/GPDMA.
- stm.FLASH: int¶
Endereço base do controlador de flash embutido (o periférico, não o próprio array de flash).
- stm.TIM_CCR1: int¶
Deslocamento do registo de captura/comparação 1 do temporizador.
TIM_CCR2…TIM_CCR4seguem nos temporizadores que têm múltiplos canais.
- stm.__getattr__(name: str) int¶
Fallback de atributo dinâmico: qualquer símbolo CMSIS exposto pelo firmware que não esteja individualmente listado acima (por exemplo,
stm.FDCAN1,stm.OCTOSPI1,stm.GPIO_AFR, os vários deslocamentos de campos de bits e máscaras, …) ainda resolve para o seu endereço absoluto ou deslocamento como umint.O módulo em tempo de execução popula estes símbolos diretamente no seu dicionário de globais no momento da importação, pelo que
__getattr__nunca é realmente invocado. A assinatura é exposta exclusivamente para que os verificadores de tipos estáticos (Pyright, Pylance, mypy) aceitemstm.<any CMSIS name>sem um diagnóstico «o módulo não tem atributo».