MicroPython:Библиотеки/machine
Модуль machine — функции для работы с аппаратными элементами плат[1]
Модуль machine содержит специфические функции, связанные с уникальными аппаратными компонентами плат. Большинство функций в этом модуле дают прямой и неограниченный доступ и возможность управлять аппаратными элементами системы (вроде CPU, таймеров, шин и т.д.). Если использовать функционал этого модуля некорректно, это может привести к сбоям, блокировкам и крашам, а в крайних случаях – даже к повреждению аппаратных элементов платы. Небольшое примечание по функциям обратного вызова, которые используются функциями и методами класса в модуле machine: все эти функции обратного вызова должны рассматриваться, как выполняемые в контексте прерываний. Это касается и физических устройств с ID >= 0, и «виртуальных» устройств с отрицательными ID вроде «-1» (эти «виртуальные» устройства – по-прежнему лишь тонкая «прокладка», лежащая поверх реальных аппаратных элементов и реальных аппаратных прерываний). Более подробно читайте в статье «Написание обработчиков прерываний».
Функции, связанные со сбросом
- machine.reset() – сбрасывает устройство по аналогии с нажатием на кнопку RESET.
- machine.soft_reset() – выполняет мягкий сброс интерпретатора, удаляя все Python-объекты и сбрасывая кучу Python. Также пытается запомнить способ, с помощью которого пользователь подключался к MicroPython REPL (например, через USB, WiFi или последовательное соединение).
- machine.reset_cause() – считывает причину сброса. О том, какие значения может вернуть эта функция, читайте ниже в разделе «Константы».
Функции, связанные с прерываниями
- machine.disable_irq() – отключает запросы на прерывания. Возвращает предыдущее IRQ-состояние, которое нужно воспринимать как скрытое значение. Это возвращенное значение должно быть передано функции enable_irq(), чтобы вернуть прерываниям их исходное состояние – до того, как была вызвана disable_irq().
- machine.enable_irq(state) – включает запросы на прерывания. В аргументе state нужно задать значение, возвращенное при самом последнем вызове disable_irq().
Функции, связанные с питанием
- machine.freq() – возвращает частоту CPU в герцах.
- machine.idle() – значительно снижает частоту CPU («clock gating»). Можно использовать в любой момент с целью снижения энергопотребления на короткие или долгие промежутки времени. Периферийные компоненты продолжат работать, а код снова начнет исполняться сразу после запуска прерывания (на многих портах для этого используются прерывания системного таймера, происходящие с регулярными интервалами периодичностью примерно в миллисекунду).
- machine.sleep() – эта функция устарела. Вместо нее используйте lightsleep() без аргументов.
- machine.lightsleep([time_ms]) и machine.deepsleep([time_ms]) – останавливают выполнение кода, пытаясь войти в режим пониженного энергопотребления.
Если задан аргумент time_ms, то это будет максимальная продолжительность сна (в миллисекундах). Если его задано не будет, сон будет длиться бесконечно. Независимо от того, есть таймаут или нет, система в любой момент может начать вновь выполнять код при наличии событий, требующих обработки. Эти события (они же «источники пробуждения») необходимо задать и настроить до перехода в режим сна – это может быть, например, изменение контакта Pin или истечение таймаута RTC. Поведение и энергосберегающие возможности двух этих функций сильно зависят от используемого оборудования, однако они все же обладают некоторыми общими свойствами:
- При использовании lightsleep() сохраняется и RAM, и состояние системы. При пробуждении система начнет работать с того момента, где она была переведена в режим сна, со всеми рабочими подсистемами.
- При использовании deepsleep() состояние RAM или какой-то другой системы (например, периферийных компонентов или сетевых интерфейсов), возможно, сохранены не будут. При пробуждении выполнение кода начнется с главного скрипта – как если бы это был аппаратный сброс или включение. Функция reset_cause() вернет machine.DEEPSLEEP, и это можно использовать для того, чтобы различать переход в режим глубокого сна от других причин сброса.
- machine.wake_reason() – считывает причину пробуждения. О том, какие значения может вернуть эта функция, читайте ниже в разделе «Константы».
Доступность: ESP32, WiPy.
Прочие функции
- machine.unique_id() – возвращает строку байтов, обозначающую уникальный идентификатор платы/SoC. У разных экземпляров одной и той же платы/SoC эти ID могут варьироваться (если их оборудование допускает такую возможность). Размер ID зависит от оборудования (поэтому, если ID ожидается коротким, используйте подстроку). В некоторых MicroPython-портах ID соответствует MAC-адресу.
- machine.time_pulse_us(pin, pulse_level, timeout_us=1000000, /) – определяет длину импульса на заданном контакте и возвращает его (в микросекундах). Значением в аргументе pulse_level должно быть «0» (если нужно определить продолжительность импульса в состоянии «0») или «1» (если нужно определить продолжительность импульса в состоянии «1»).
Если текущее значение контакта pin отличается от того, что задано в pulse_level, функция сначала (*) ждет, пока значение на контакте не станет таким же, как в pulse_level, а затем замеряет продолжительность этого импульса. Если значение контакта pin уже равно значению в pulse_level (**), то замер начнется сразу же. В аргументе timeout_us задается таймаут для замера (в микросекундах). Если время, заданное в timeout_us, истекло в ситуации, помеченной одной звездочкой (*), функция вернет «-2», а если в ситуации, помеченной двумя звездочками (**), то «-1».
- machine.rng() – возвращает 24-битное программно сгенерированное случайное число.
Доступность: WiPy.
Константы
- machine.IDLE, machine.SLEEP и machine.DEEPSLEEP – значения для IRQ-состояния.
- machine.PWRON_RESET, machine.HARD_RESET, machine.WDT_RESET, machine.DEEPSLEEP_RESET и machine.SOFT_RESET – причины сброса.
- machine.WLAN_WAKE, machine.PIN_WAKE и machine.RTC_WAKE – причины пробуждения.
Классы
- Класс Pin – управление I/O-контактами
- Класс Signal – управление и считывание данных с внешних I/O-устройств
- Класс ADC – аналогово-цифровое преобразование
- Класс UART – двусторонняя последовательная шина
- Класс SPI – протокол шины SPI (со стороны ведущего устройства)
- Класс I2C – протокол для передачи последовательных данных по 2 линиям
- Класс RTC – часы реального времени
- Класс Timer – управление аппаратными таймерами
- Класс WDT – сторожевой таймер
- Класс SD – карта памяти типа Secure Digital (только для порта cc3200)
- Класс SDCard – карта памяти типа Secure Digital