stm --- STM32 MCU 专用功能

本模块提供 STM32 微控制器专用的功能,包括对外设寄存器的直接访问。

内存访问

该模块暴露了三个可下标访问的对象,用于原始内存访问。每个对象都表现得像一个以字节地址为索引的稀疏数组:value = memN[addr] 用于读取,memN[addr] = value 用于写入。无论访问宽度如何,地址始终是字节地址。

这些内存对象可与下文的外设寄存器常量配合使用,以读写 MCU 硬件外设寄存器,以及 SoC 地址空间中的任何其他位置。

stm.mem8

可下标访问的 8 位内存访问器。mem8[addr]addr 处的字节读取一个 0-255 范围内的 intmem8[addr] = value 写入 value 的低 8 位。addr 可以是任何按字节对齐的地址。

stm.mem16

可下标访问的 16 位(半字)内存访问器。mem16[addr] 读取一个 0-65535 范围内的 intmem16[addr] = value 写入低 16 位。addr 必须按 2 字节对齐。

stm.mem32

可下标访问的 32 位(字)内存访问器。mem32[addr] 读取一个 0-0xFFFFFFFF 范围内的 intmem32[addr] = value 写入低 32 位。addr 必须按 4 字节对齐。

外设寄存器常量

stm 模块为固件所编译的目标 STM32 系列暴露全套 CMSIS 寄存器地址和偏移量。这些名称与 ST 的 CMSIS 头文件完全一致:在 M4、M7、H7 系列(H7 / H7 Plus / Pure Thermal)和 N6 OpenMV Cam 上分别为 STM32F427xxSTM32F765xxSTM32H743xxSTM32N657xx。每个系列的全套名称多达数百个符号(M4 上 271 个,M7 上 306 个,H7 上 494 个,N6 上 594 个);在此一一列举只会重复 ST 的参考手册和 CMSIS 头文件。

使用了两种命名约定:

  • 以外设实例命名的常量(GPIOAUSART1TIM2……)是 绝对基地址

  • 以外设类型为前缀的常量(GPIO_BSRRUSART_CR1TIM_CCR1……)是相对于对应基地址的 寄存器偏移量

将一个绝对基地址与一个寄存器偏移量相加即可得到单个寄存器的完整地址。例如 stm.GPIOA + stm.GPIO_BSRR 就是 GPIOA->BSRR 的绝对地址。

示例:

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

代表性常量

下面的选取每个主要外设类别各取一项,旨在让命名约定一目了然。构建目标的所有其他 CMSIS 符号同样可在该模块上获得——请参阅下文的 __getattr__() 类型检查器后备方案。

stm.GPIOA: int

GPIOA 外设的基地址。GPIOB …… GPIOK(范围取决于 MCU 封装)遵循相同的模式。

stm.USART1: int

USART1 外设的基地址。其他 USART / UART 实例视情况以 USART2USART3UART4 …… 的形式暴露。

stm.SPI1: int

SPI1 外设的基地址。其他 SPI 实例以 SPI2SPI3…… 的形式出现,直到 MCU 所具备的数量。

stm.I2C1: int

I2C1 外设的基地址。I2C2 …… I2C4 依次类推。

stm.TIM1: int

TIM1 高级控制定时器的基地址。通用定时器和基本定时器(视情况为 TIM2 …… TIM17)遵循相同的命名方式。

stm.ADC1: int

ADC1 的基地址。ADC2 / ADC3 出现在具有多个 ADC 模块的 MCU 上。

stm.DAC: int

DAC 外设的基地址,仅在具备该外设的 MCU 上。

stm.DMA1: int

DMA1 的基地址。大多数 STM32 上都有 DMA2;H7 级别的器件还会暴露 BDMAMDMA 以及(在 N6 上)HPDMA / GPDMA

stm.RCC: int

复位和时钟控制(Reset and Clock Control)外设的基地址。

stm.EXTI: int

外部中断 / 事件控制器(External Interrupt / Event Controller)的基地址。

stm.FLASH: int

嵌入式闪存控制器的基地址(指该外设,而非闪存阵列本身)。

stm.SYSCFG: int

系统配置控制器(System Configuration Controller)的基地址。

stm.PWR: int

电源控制(Power Control)外设的基地址。

stm.GPIO_BSRR: int

GPIO 位置位/复位寄存器在任意 GPIOx 基地址内的偏移量。

stm.GPIO_IDR: int

GPIO 输入数据寄存器的偏移量。

stm.GPIO_ODR: int

GPIO 输出数据寄存器的偏移量。

stm.USART_CR1: int

USART/UART 控制寄存器 1 的偏移量。

stm.TIM_CR1: int

定时器控制寄存器 1 的偏移量。

stm.TIM_CCR1: int

定时器捕获/比较寄存器 1 的偏移量。TIM_CCR2 …… TIM_CCR4 在具有多个通道的定时器上依次类推。

stm.RCC_CR: int

RCC 时钟控制寄存器的偏移量。

stm.RCC_CFGR: int

RCC 时钟配置寄存器的偏移量。

stm.__getattr__(name: str) int

动态属性后备方案:固件所暴露的、上文未单独列出的任何 CMSIS 符号(例如 stm.FDCAN1stm.OCTOSPI1stm.GPIO_AFR,以及各种位域移位和掩码……),仍会被解析为其绝对地址或偏移量,类型为 int

运行时模块在导入时会将这些符号直接填充到其全局字典中,因此 __getattr__ 实际上从不会被调用。暴露该签名仅仅是为了让静态类型检查器(Pyright、Pylance、mypy)接受 stm.<any CMSIS name> 而不报“module has no attribute”诊断。