TinyGo 0.42 добавляет поддержку 87 вариантов Puya PY32 MCU и двух плат EmbedFire

TinyGo 0.42 добавляет поддержку Puya PY32 семейство 32-битных микроконтроллеров Arm. Новый порт включает стартовый код, сгенерированные определения регистров устройств, скрипты компоновщика, поддержку GPIO и UART, а также цели для 87 отдельных конфигураций MCU. Также включены определения плат для двух недорогих отладочных плат EmbedFire, доступных на AliExpress.

Порт был предложен Павлом Бургром и принят через TinyGo pull request #5106 . Одним из мотивов было создание надёжной и простой в использовании платформы для прошивок небольших IoT-устройств, построенной вокруг сервиса Registry и энергоэффективного радиопротокола BleRiot (подробнее об этом в конце поста). Эти проекты не связаны с TinyGo, но они демонстрируют тип приложений с ограниченными ресурсами, для которых предназначены новые целевые платформы.

TinyGo Puya py32 MCU

Широкий охват целевых платформ PY32

TinyGo — это компилятор Go для микроконтроллеров, WebAssembly и других систем с ограниченными ресурсами. Он использует LLVM для создания компактных нативных бинарных файлов и предоставляет уровень аппаратной абстракции через такие пакеты, как машина, сохраняя привычный синтаксис и инструментарий Go. Запуск Go на микросхеме всего с 2 КБ SRAM может звучать как вызов, но именно для таких вызовов и был создан TinyGo.

Порт PY32 охватывает устройства Cortex-M0+ и Cortex-M4. Таблица целевых устройств содержит 87 конкретных конфигураций памяти для 40 семейств определений устройств — от микросхем с 8 КБ флеш-памяти и 2 КБ SRAM до устройств с 512 КБ флеш-памяти и 144 КБ SRAM.

Поддерживаемые серии включают:

  • PY32E407
  • PY32F001, F002, F003, F021, F030, F031, F032, F040, F071, F072, F403 и F410
  • PY32L020 и L090
  • PY32M010, M020, M030, M031 и M070
  • PY32MD310, MD320, MD410, MD420 и MD430
  • PY32T020, T090 и T092

Каждая целевая микросхема выбирает корректную карту флеш-памяти и SRAM. Определения периферии генерируются из данных CMSIS компании Puya через вспомогательный репозиторий py32-svd , предоставляя авторам драйверов типизированные имена регистров в device/py32 вместо приватных таблиц адресов.

machine API в TinyGo 0.42 охватывает инициализацию тактирования и таймеров, GPIO и UART, включая второй UART на отдельных микроконтроллерах. ADC, I2C, SPI и PWM пока не имеют переносимых драйверов machine, но их сгенерированные регистры доступны низкоуровневому коду.

Две поддерживаемые платы EmbedFire

Low-cost Puya py32 development boards

Две небольшие отладочные платы Puya32 имеют выделенные цели и псевдонимы выводов, что делает их самым простым способом опробовать порт. Обе доступны менее чем за $2 на AliExpress , а плата PY32F030 стоит от $7 и выше на Amazon. .

Board EmbedFire PY32F030 EmbedFire PY32F002B
MCU PY32F030K28U6TR PY32F002BF15U6TR
Core and memory Cortex-M0+, 64 KB flash, 8 KB SRAM Cortex-M0+ up to 24 MHz, 24 KB flash, 3 KB SRAM
Onboard aliases 3 LEDs, 2 keys, default UART 3 LEDs, 2 keys, default UART
TinyGo target embedfire-py32f030 embedfire-py32f002b

Плата PY32F030 сопоставляет LED1 , LED2 и LED3 к PA2, PA3 и PA4, а две кнопки — к PA5 и PA6. Его UART по умолчанию использует PA7 для TX и PA8 для RX. На меньшей плате PY32F002B светодиоды подключены к PA1, PA5 и PA4, кнопки — к PA3 и PA0, а UART по умолчанию — к PA6 и PA7.

Обе платы определяют machine.LED как псевдоним для второго встроенного светодиода. Как того требует традиция встраиваемых систем, та же самая первая программа может выполнять церемониальное мигание на любом целевом устройстве:

package main

import (
	"machine"
	"time"
)

func main() {
	led := machine.LED
	led.Configure(machine.PinConfig{Mode: machine.PinOutput})

	for {
		led.Set(true)
		time.Sleep(500 * time.Millisecond)
		led.Set(false)
		time.Sleep(500 * time.Millisecond)
	}
}

При подключенном поддерживаемом SWD-отладчике и pyOCD Если pyOCD настроен для выбранного устройства Puya, программу можно собрать и прошить одной командой, без раскопок в Makefile:

tinygo flash -target=embedfire-py32f030 .

Для платы меньшего размера изменяется только цель:

tinygo flash -target=embedfire-py32f002b .

Целевые конфигурации плат наследуют точные py32f030x8 и py32f002bx5 карты памяти и используют соответствующую цель pyOCD при прошивке. Для плат собственной разработки также доступны цели для микросхем без платы. Небольшая Шаблон проекта TinyGo PY32 предоставляет дополнительные примеры мигания и стартовый Makefile.

tinygo py32 template

От недорогого микроконтроллера до подключенного к реестру IoT-узла

Когда традиционное мигание уже позади, практическая мотивация порта становится более интересной. Pavel разработал поддержку PY32 при создании BleRiot , простой и надежный протокол запроса/ответа для энергоэффективных RF-узлов.

Каждый узел предоставляет знаковые 32-битные регистры и понимает только две операции: GET и SETЭто весь набор команд, что является особенностью, а не упущением. Linux-концентратор опрашивает регистры и обрабатывает имена, преобразования единиц измерения, а также повторы и тайм-ауты. Этот небольшой предсказуемый интерфейс обеспечивает компактность прошивки, при этом восстановление после потери пакета обрабатывается один раз в концентраторе, а не каждым приложением.

Один концентратор обменивается данными со многими узлами по собственному радиоканалу GFSK на 250 кбит/с с кадрированием пакетов, совместимым с BLE, хотя это не Bluetooth LE и не GATT. Эталонный узел сопрягает PY32F030x8 с радиомодулем PAN211x на 2,4 ГГц, тогда как концентратор использует простой USB-радиоадаптер.

BleRiot публикует значения узлов в Registry , легковесный локальный сервис, который дает каждому регистру имя, текущее значение, необязательные метаданные и время жизни. Устаревшие значения автоматически истекают. Приложения могут использовать его HTTP/JSON API напрямую; предоставленные Node-RED узлы Они сочетаются со стандартными MQTT-узлами для создания моста, а встроенная конечная точка Prometheus предоставляет числовые регистры в виде метрик, готовых для информационных панелей Grafana. Иными словами, чтобы вывести температуру на панель, не нужно обучать 3-килобайтный микроконтроллер работе с Grafana.

Контроллер при запросе изменения проходит тот же путь в обратном порядке. BleRiot использует общие типы устройств и определения регистров между прошивкой TinyGo и Linux-хабом, а его инструментарий может создавать идентификатор узла, собирать прошивку с помощью TinyGo и прошивать её через SWD.

Registry и BleRiot не обязательны для использования TinyGo на PY32, а поддержка PY32 не привязана к конкретному радиомодулю. Они являются полезными примерами того, почему недорогие микроконтроллеры выигрывают от поддерживаемого компилятора, воспроизводимых целевых платформ микросхем и стандартного аппаратного API для Go.

Доступность и следующие шаги

Поддержка PY32 доступна в TinyGo 0.42.0. Две целевые платформы EmbedFire служат наиболее прямой точкой входа, а более широкий список микросхем дает разработчикам основу для создания собственных плат: от крошечных сенсорных узлов до более крупных контроллеров Cortex-M4.

TinyGo 0.42 делает акцент на стабильности исполнения, корректных картах памяти, GPIO и последовательной связи, а не на полном покрытии периферии. Будущие дополнения могут добавить переносимые API для ADC, I2C, SPI, PWM и определения плат поверх сгенерированного слоя регистров device/py32. Для разработчиков, уже использующих Go на стороне хоста IoT-системы, этот порт делает недорогое семейство микроконтроллеров Puya гораздо более доступной конечной точкой.

Примечание CNXSoft: Поддержка TinyGo для микроконтроллеров AT32 по-видимому, на очереди.

Выражаем свою благодарность источнику, с которого взята и переведена статья, сайту cnx-software.com.

Оригинал статьи вы можете прочитать здесь.

0 0 votes
Article Rating
Подписаться
Уведомление о
guest

Этот сайт использует Akismet для борьбы со спамом. Узнайте, как обрабатываются ваши данные комментариев.

0 Комментарий
Oldest
Newest Most Voted
Inline Feedbacks
View all comments