stm — STM32 MCU에 특화된 기능

이 모듈은 주변장치 레지스터에 대한 직접 접근을 포함하여 STM32 마이크로컨트롤러에 특화된 기능을 제공합니다.

메모리 접근

이 모듈은 원시 메모리 접근에 사용되는 세 개의 첨자 접근 가능 객체를 노출합니다. 각각은 바이트 주소로 인덱싱되는 희소 배열처럼 동작합니다. value = memN[addr]는 읽기, memN[addr] = value는 쓰기입니다. 주소는 접근 폭에 관계없이 항상 바이트 주소입니다.

이 메모리 객체들은 아래의 주변장치 레지스터 상수와 함께 사용하여 MCU 하드웨어 주변장치 레지스터뿐만 아니라 SoC 주소 공간 내의 다른 모든 위치를 읽고 쓸 수 있습니다.

stm.mem8

첨자 접근 가능한 8비트 메모리 접근자입니다. mem8[addr]addr의 바이트에서 0-255 범위의 int를 읽고, mem8[addr] = valuevalue의 하위 8비트를 씁니다. addr는 임의의 바이트 정렬 주소일 수 있습니다.

stm.mem16

첨자 접근 가능한 16비트(하프워드) 메모리 접근자입니다. mem16[addr]는 0-65535 범위의 int를 읽고, mem16[addr] = value는 하위 16비트를 씁니다. addr는 2바이트로 정렬되어야 합니다.

stm.mem32

첨자 접근 가능한 32비트(워드) 메모리 접근자입니다. mem32[addr]는 0-0xFFFFFFFF 범위의 int를 읽고, mem32[addr] = value는 하위 32비트를 씁니다. addr는 4바이트로 정렬되어야 합니다.

주변장치 레지스터 상수

stm 모듈은 펌웨어가 컴파일된 STM32 제품군에 대한 CMSIS 레지스터 주소 및 오프셋 전체 집합을 노출합니다. 이름은 ST의 CMSIS 헤더를 정확히 반영합니다. M4, M7, H7 제품군(H7 / H7 Plus / Pure Thermal) 및 N6 OpenMV Cam에 각각 STM32F427xx, STM32F765xx, STM32H743xx, STM32N657xx입니다. 전체 이름 집합은 제품군당 수백 개의 심볼입니다(M4에 271개, M7에 306개, H7에 494개, N6에 594개). 여기에 이를 모두 나열하는 것은 단순히 ST의 참조 매뉴얼과 CMSIS 헤더를 중복하는 일이 될 것입니다.

두 가지 명명 규칙이 사용됩니다:

  • 주변장치 인스턴스의 이름을 딴 상수(GPIOA, USART1, TIM2, …)는 절대 기본 주소입니다.

  • 주변장치 유형이 접두사로 붙은 상수(GPIO_BSRR, USART_CR1, TIM_CCR1, …)는 해당 기본 주소를 기준으로 한 레지스터 오프셋입니다.

절대 기본 주소와 레지스터 오프셋을 더하면 단일 레지스터의 전체 주소를 얻을 수 있습니다. 예를 들어 stm.GPIOA + stm.GPIO_BSRRGPIOA->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 주변장치의 베이스 주소입니다. GPIOBGPIOK(범위는 MCU 패키지에 따라 다름)도 동일한 패턴을 따릅니다.

stm.USART1: int

USART1 주변장치의 기본 주소입니다. 다른 USART / UART 인스턴스는 사용 가능한 경우 USART2, USART3, UART4 …로 노출됩니다.

stm.SPI1: int

SPI1 주변장치의 기본 주소입니다. 추가 SPI 인스턴스는 MCU의 개수까지 SPI2, SPI3, …로 나타납니다.

stm.I2C1: int

I2C1 주변장치의 기본 주소입니다. I2C2I2C4가 뒤따릅니다.

stm.TIM1: int

TIM1 고급 제어 타이머의 기본 주소입니다. 범용 및 기본 타이머(사용 가능한 경우 TIM2TIM17)도 동일한 명명을 따릅니다.

stm.ADC1: int

ADC1의 기본 주소입니다. ADC2 / ADC3는 다중 ADC 블록을 가진 MCU에서 나타납니다.

stm.DAC: int

DAC 주변장치를 가진 MCU에서의 해당 주변장치 기본 주소입니다.

stm.DMA1: int

DMA1의 기본 주소입니다. DMA2는 대부분의 STM32에 존재하며, H7급 부품은 BDMA, MDMA와 (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

임의의 GPIOx 기본 주소 내 GPIO 비트 설정/재설정 레지스터의 오프셋입니다.

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_CCR2TIM_CCR4가 뒤따릅니다.

stm.RCC_CR: int

RCC 클록 제어 레지스터의 오프셋입니다.

stm.RCC_CFGR: int

RCC 클록 구성 레지스터의 오프셋입니다.

stm.__getattr__(name: str) int

동적 속성 폴백: 위에 개별적으로 나열되지 않은, 펌웨어가 노출하는 모든 CMSIS 심볼(예: stm.FDCAN1, stm.OCTOSPI1, stm.GPIO_AFR, 다양한 비트 필드 시프트 및 마스크 등)도 여전히 int로서의 절대 주소 또는 오프셋으로 해석됩니다.

런타임 모듈은 가져오기 시점에 이러한 심볼을 자신의 globals 딕셔너리에 직접 채우므로 __getattr__은 실제로 호출되지 않습니다. 이 시그니처는 정적 타입 검사기(Pyright, Pylance, mypy)가 “module has no attribute” 진단 없이 stm.<any CMSIS name>을 허용하도록 하기 위해서만 노출됩니다.