machine — 하드웨어 관련 함수

machine 모듈에는 특정 보드의 하드웨어와 관련된 구체적인 함수가 포함되어 있습니다. 이 모듈의 대부분의 함수는 시스템의 하드웨어 블록(CPU, 타이머, 버스 등)에 대한 직접적이고 제한 없는 접근과 제어를 가능하게 합니다.

메모리 접근

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

machine.mem8

첨자 접근 가능한 8비트 메모리 접근자입니다. mem8[addr]addr의 바이트에서 0-255 범위의 int를 읽고, mem8[addr] = valuevalue의 하위 8비트를 씁니다. addr은 1바이트로 정렬되어야 합니다(임의의 주소).

machine.mem16

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

machine.mem32

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

사용 예시(레지스터는 STM32H7 마이크로컨트롤러에 특정됩니다 – OpenMV Cam H7 / H7 Plus / Pure Thermal에서 헤더 핀 P0PB15에 연결되어 있습니다):

import machine
from micropython import const

GPIOB = const(0x58020400)
GPIO_BSRR = const(0x18)
GPIO_IDR = const(0x10)

# set P0 (PB15) high via the GPIOB bit-set/reset register
machine.mem32[GPIOB + GPIO_BSRR] = 1 << 15

# read P0 (PB15) directly out of the GPIOB input-data register
value = (machine.mem32[GPIOB + GPIO_IDR] >> 15) & 1

기타 함수

machine.unique_id() bytes

이 보드의 고유 식별자를 포함하는 bytes 객체를 반환합니다. 이 값은 MCU의 하드웨어에서 읽어 들이므로(일반적으로 공장에서 프로그래밍된 장치 일련번호), 재부팅 후에도 안정적이며 보드마다 다릅니다.

길이는 MCU 제품군에 따라 다릅니다 – STM32에서는 12바이트, mimxrt 및 alif 포트에서는 8바이트입니다. 애플리케이션에 고정 길이 ID가 필요하면 반환된 값을 슬라이스하거나 해시하십시오.

machine.time_pulse_us(pin: Pin, pulse_level: int, timeout_us: int = 1000000, /) int

pin에서 단일 펄스의 폭을 측정하고 그 지속 시간을 마이크로초 단위로 반환합니다.

pin은 디지털 입력으로 구성되어야 합니다.

pulse_level은 측정할 펄스 극성입니다: 하이 펄스의 경우 1, 로우 펄스의 경우 0입니다.

이 함수는 두 단계로 작동합니다. 먼저, 핀이 아직 pulse_level에 있지 않으면 핀이 pulse_level로 전환될 때까지 기다립니다(펄스의 시작). 그런 다음 핀이 다시 전환되기 전까지 pulse_level에 머무는 시간을 측정합니다(펄스의 끝). 측정된 시간은 마이크로초 단위로 반환됩니다.

timeout_us 단계를 독립적으로 제한합니다(따라서 최악의 경우 호출은 최대 2 * timeout_us 동안 지속됩니다). 타임아웃 시 함수는 어느 단계가 타임아웃되었는지 식별하는 음수 값을 반환합니다:

  • -2 – 상승 에지를 기다리다 타임아웃됨(핀이 pulse_level에 도달하지 못함).

  • -1 – 하강 에지를 기다리다 타임아웃됨(펄스가 timeout_us보다 길었음).

machine.bitstream(pin: Pin, encoding: int, timing: tuple, data: bytes, /) None

지정된 pin을 비트 뱅잉하여 data를 송신합니다. encoding 인수는 비트가 인코딩되는 방식을 지정하며, timing은 인코딩에 특정한 타이밍 사양입니다.

지원되는 인코딩은 다음과 같습니다:

  • “high low” 펄스 지속 시간 변조의 경우 0. 이는 0과 1 비트를 최상위 비트부터 시작하여 타이밍된 펄스로 송신합니다. timing(high_time_0, low_time_0, high_time_1, low_time_1) 형식의 나노초 4-튜플이어야 합니다. 예를 들어, (400, 850, 800, 450)은 800kHz에서 WS2812 RGB LED의 타이밍 사양입니다.

타이밍 정확도는 하드웨어에 따라 다릅니다. 더 빠른 MCU는 더 정밀한 펄스를 생성합니다(일반적으로 수십 나노초).

참고

WS2812 / NeoPixel 스트립 제어에 대해서는 보다 상위 수준의 API를 제공하는 neopixel 모듈을 참조하십시오.

상수

아래 상수는 reset_cause()에 의해 반환되며 MCU가 마지막으로 리셋된 이유를 식별합니다. STM32 및 mimxrt 포트에서 사용할 수 있습니다. alif 포트(OpenMV Cam AE3)는 현재 리셋 원인 상수를 노출하지 않으며 reset_cause()는 항상 0을 반환합니다.

machine.PWRON_RESET: int

칩에 전원이 인가되어 발생한 리셋. STM32 및 mimxrt 포트.

machine.WDT_RESET: int

워치독 타이머가 만료되어 발생한 리셋. STM32 및 mimxrt 포트.

machine.SOFT_RESET: int

soft_reset()에 의해 발생한 리셋(하드웨어 리셋 없이 Python 인터프리터가 재시작됨). STM32 및 mimxrt 포트.

machine.HARD_RESET: int

NRST 핀이 어서트되어 발생한 리셋(외부 리셋 버튼). STM32 포트 전용.

machine.DEEPSLEEP_RESET: int

딥 슬립에서 깨어나면서 발생한 리셋. STM32 포트 전용.

클래스