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ê um int no intervalo 0-255 do byte em addr; mem8[addr] = value escreve os 8 bits inferiores de value. addr pode ser qualquer endereço alinhado por byte.

stm.mem16

Acessor de memória de 16 bits (meia palavra) subscritável. mem16[addr] lê um int no intervalo 0-65535; mem16[addr] = value escreve os 16 bits inferiores. addr deve estar alinhado a 2 bytes.

stm.mem32

Acessor de memória de 32 bits (palavra) subscritável. mem32[addr] lê um int no intervalo 0-0xFFFFFFFF; mem32[addr] = value escreve os 32 bits inferiores. addr deve 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. GPIOBGPIOK (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 em USART2, USART3, UART4 … conforme disponível.

stm.SPI1: int

Endereço base do periférico SPI1. Instâncias SPI adicionais aparecem como SPI2, SPI3, … até ao número disponível no MCU.

stm.I2C1: int

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

stm.TIM1: int

Endereço base do temporizador de controlo avançado TIM1. Os temporizadores de uso geral e básicos (TIM2TIM17 conforme disponível) 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, nos MCUs que o possuem.

stm.DMA1: int

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

stm.RCC: int

Endereço base do periférico de Controlo de Reset e Relógio.

stm.EXTI: int

Endereço base do Controlador de Interrupção/Evento Externo.

stm.FLASH: int

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

stm.SYSCFG: int

Endereço base do Controlador de Configuração do Sistema.

stm.PWR: int

Endereço base do periférico de Controlo de Energia.

stm.GPIO_BSRR: int

Deslocamento do registo de bit set/reset de GPIO dentro de qualquer base GPIOx.

stm.GPIO_IDR: int

Deslocamento do registo de dados de entrada do GPIO.

stm.GPIO_ODR: int

Deslocamento do registo de dados de saída do GPIO.

stm.USART_CR1: int

Deslocamento do registo de controlo 1 do USART/UART.

stm.TIM_CR1: int

Deslocamento do registo de controlo 1 do temporizador.

stm.TIM_CCR1: int

Deslocamento do registo de captura/comparação 1 do temporizador. TIM_CCR2TIM_CCR4 seguem nos temporizadores que têm múltiplos canais.

stm.RCC_CR: int

Deslocamento do registo de controlo de relógio do RCC.

stm.RCC_CFGR: int

Deslocamento do registo de configuração de relógio do RCC.

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 um int.

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) aceitem stm.<any CMSIS name> sem um diagnóstico «o módulo não tem atributo».