TinyGo 0.42 добавляет поддержку Puya PY32 семейство 32-битных микроконтроллеров Arm. Новый порт включает стартовый код, сгенерированные определения регистров устройств, скрипты компоновщика, поддержку GPIO и UART, а также цели для 87 отдельных конфигураций MCU. Также включены определения плат для двух недорогих отладочных плат EmbedFire, доступных на AliExpress.
Порт был предложен Павлом Бургром и принят через TinyGo pull request #5106 . Одним из мотивов было создание надёжной и простой в использовании платформы для прошивок небольших IoT-устройств, построенной вокруг сервиса Registry и энергоэффективного радиопротокола BleRiot (подробнее об этом в конце поста). Эти проекты не связаны с TinyGo, но они демонстрируют тип приложений с ограниченными ресурсами, для которых предназначены новые целевые платформы.
Широкий охват целевых платформ 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
Две небольшие отладочные платы 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.
От недорогого микроконтроллера до подключенного к реестру 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.
Оригинал статьи вы можете прочитать здесь.



