Наверное многие давно заметили в продаже на aliexpress и в местных магазинах радиодеталей arduino-совместимые платы на базе микроконтроллера LGT8F328, в народе их даже уже успели прозвать "зелёнкой" за цвет паяльной маски на ранних версиях.
Одни из первых упоминаний на форумах об этой плате датируются аж 2014 годом. Но лично для меня эти платы стали актуальными только в последнее время, так как цена на микроконтроллеры atmega328 выросла до неадекватных значений (даже в китайских интернет магазинах). Раньше от покупки этих плат меня останавливало то, что они программируются в основном в среде Arduino IDE, которая мне не особо интересна (не буду перечислять достоинства и недостатки данной среды). А других IDE для данных микроконтроллеров с ходу "нагуглить" не так то и просто. Второе, что меня останавливало - это метод заливки прошивок: из среды arduino прошивка заливается через UART с помощью уже прошитого bootloader-a, а вот с программаторами есть проблема, так как данные МК программируются по интерфейсу SWD, как их более "взрослые" товарищи, но об этом - позже. Зато, подкупало то, что микроконтроллер LGT8 пин в пин совместимый с atmega328, включая альтернативные функции, но при этом является более навороченным (выше тактовая частота, больше таймеров, больше разрядность АЦП, есть ЦАП и др.), не буду подробно расписывать все преимущества, этой информации полно в сети.
И вот, в очередной раз, увидев цены на данные платы (2$ за полноценную плату с USB-UART с МК в корпусе TQFP32, 2.5$ за аналогичную плату в корпусе TQFP48 и 0,9$ за плату только с МК и LDO), я решил углубиться в изучение вопроса опять. За несколько минут "гугления" в яндексе я обнаружил datasheet на русском языке на микроконтроллеры LGT8F8/168/328, а также необходимый софт на сайте производителя.
При изучении даташита, первое, что мне бросилось в глаза - это уж очень подозрительное стопроцентное совпадение мнемоник ассемблерных команд с аналогичными у AVR. Также очень подозрительно совпадают названия регистров периферических модулей. Позже мои подозрения подтвердились, почему, объясню дальше при разборе среды программирования.
Производитель, кроме инструментов для Arduino IDE предлагает нам для работы на чистом Си некое подобие среды разработки под названием "LGTSDK Builder". По сути это не совсем среда разработки (так как не имеет собственных SDK и средств отладки), а просто генератор кода с наличием текстового редактора. Данный софт не требует установки, достаточно просто распаковать архив и запустить *.exe файл и нам откроется стартовая страница.
Дальше я покажу, как создать проект на Си с помощью данного инструмента. Запускаем LGTSDK Builder:
Как видите, здесь всё минималистично, интуитивно понятно, и, что очень важно, на английском языке! На стартовом экране присутствуют всего три кнопки: "New", "Open" и "Help". Кнопка "Open" открывает уже существующий проект, кнопке "New" создаёт новый. Рассмотрим создание нового проекта, нажимаем кнопку "New".
Здесь у нас уже появляются первые настройки проекта. В чек-боксе "Device Type" выбираем модель микроконтроллера, в "Pakage Type" выбираем тип корпуса. Теперь, внимание! В чек-боксе "SDK Type" выбираем SDK (т.е. набор инструментов, под которые создаётся проект). И тут у нас WinAvr, AvrStudio 4 (что по сути одно и то же) и IAR. Вспоминаем мои подозрения по поводу подозрительно одинаковых мнемоник ассемблерных команд, о чём я писал выше, то есть это знакомый нам AVRGCC. В данном чек-боксе я предлагаю выбирать WinAVR как самый легковесный вариант (Atmel Studio версии выше четвёртой работать не будут, но, если он у Вас установлен, то сгенерируется файл проекта под студию). Далее в строчке, обведённой прямоугольничком необходимо указать название проекта и полный путь к нему (иначе проект создастся в папке с "LGTSDK Builder"), например, "D:\LGT_Projects\test1". Остальное оставляем по умолчанию. И жмём "Apply".
И тут нашему взору открывается самое классное, на мой взгляд - генератор кода, наподобие CubeIDE для STM32. Здесь, в принципе , всё очень понятно на уровне интуиции. Я остановлюсь только на важных моментах.
В первую очередь заходим во вкладку "System settings", здесь находятся настройки источника тактирования. Можно выбирать внешний кварц или генератор и два внутренних генератора (HSI и LSI). Также здесь настраивается делитель частоты источника тактирования, вывод частоты на пин микроконтроллера, отключение интерфейса SWD и ещё некоторые плюшки. Смотрите фото ниже:
Ещё для примера приведу вкладку настройки модуля USART:
Как видите, здесь можно изменить все настройки модуля, расставляя галочки и выбирая нужные пункты чек-боксов.
Если пролистать вкладку ниже, то мы увидим, что также можно включить необходимые прерывания модуля (обработчики сгенерируются в отдельный файл, но их можно перенести в другое место, например, в main.c). А еще можно добавить функции работы с модулем (в данном случае - передача байта, строки по USART, получение байта), это доступно для всех модулей. Смотрите фото ниже:
Когда у нас настроены все периферические модули, переходим во вкладку "Demos", где выбираем пункт "EmptyProject" (если выбрать пункт "simpleUART", то сгенерируется демонстрационный проект). И переходим во вкладку "Settings".
Здесь есть варианты. Если Вы генерируете проект под AtmelStudio 4 или IAR, то можно ничего не трогать. Если же Вы решили не устанавливать данные довольно немолодые IDE, то необходимо немного отвлечься от настройки проекта, скачать и установить WinAVR (если Вы этого не сделали раньше), которая свободно распространяется на страничке разработчика (если у Вас Win10 или 64-битная версия более старых Windows, то необходимо также скачать и установить патч для WinAVR, иначе будут ошибки компиляции). После проделанных манипуляций возвращаемся на вкладку "Settings" и прописываем путь к корневой папке WinAVR в строке "WinAVR root path". Всё остальное оставляем без изменений.
На этом настройки проекта закончены, нажимаем кнопку "Build" на левой боковой панели. И у нас появится редактор кода и новая вкладка "SDK View" на верхнем меню.
Здесь как в любом редакторе кода есть дерево проекта со всеми сгенерированными файлами и окно текстового редактора.
В дереве проекта можно добавлять и убавлять существующие файлы, создавать свои как и в любой IDE.
На данном этапе все файлы проекта (header и source) сгенерированы и можно полазить и посмотреть на их содержимое. Отмечу, что сгенерированный код (инициализации периферических модулей и функции работы сними) довольно лаконичный и не перегружен различными структурами, непонятными ссылками, указателями и макросами (в отличие, например, от индийско-китайских "произведений" CubeMX для STM32, которые отнимают приличное количество CODE сегмента). Всё, что Вы считаете лишним или неподходящим для Вашего проекта можно удалить или подредактировать.
Теперь осталось только скомпилировать проект. На этом этапе тоже есть варианты:
1) Если Вы решили использовать WinAVR, то сохраняем проект кнопкой "Save" на боковой панели и нажимаем кнопку "Build" там же. Если всё сделано правильно, проект должен собраться и Вы получите HEX файл в корневой папке проекта. У данного способа есть свои недостатки: редактор кода здесь не самый удобный (хотя, если сравнивать с Keil и IAR, то можно поспорить); нет подсветки ошибок в тексте; WinAVR на Win10 периодически выдаёт ошибку (описана в материале по ссылке для скачивания патча для WinAVR), которая лечится перезагрузкой компьютера.
2) Если у Вас установлена AtmelStudio 4, то сохраняете проект и нажимаете кнопку "AVRStudio", тогда сгенерируется файл проекта для студии и можно работать дальше там. Этот вариант я не пробовал, так как студия у меня очень более свежая. Вариант с проектом под IAR я также не проверял за ненадобностью.
При необходимости внести изменения в проекте, запускаем LGTSDK Builder, открываем свой проект (кнопкой "Open" на стартовой странице), переходим на вкладку "Device View" в верхнем меню, вносим изменения как при начальной настройке проекта и нажимаем кнопку "Build", в появившемся диалоговом окне нажимаем "Да". Проект пересобирётся. При внесении изменений могут изменяться некоторые файлы, например, если Вы переносили обработчик прерывания из файла "isr_auto.c" в другое место, то пустой обработчик там появится снова, так что нужно проверять содержимое пересобранных файлов.
Далее можно добавлять свой код как для обычного AVR микроконтроллера. Синтаксис ничем не отличается, даже название многих регистров периферии такие же (например, GPIO - один в один, USART, SPI, I2C - многие совпадают). И компилируем выбранным Вами способом.
Со средой разработки всё более-менее понятно. Теперь поговорим о не менее важной проблеме - каким образом можно "прошить" сгенерированный HEX файл в память микроконтроллера?
"Погуглив" данный вопрос и поколупав файлы Arduino IDE для LGT8 я заметил, что через встроенный bootloader они программируются с помощью дуды (avrdude), причём в качестве целевого МК указывается atmega328, а в качестве программатора - stk500. Но это, что касается прошивки через встроенный bootloader. А что же с программаторами? Тут в отличие от AVR всё очень печально. Есть заводской USB программатор SWDICE MKII PRO, которого в продаже я не нашёл вообще, даже на aliexpress. Есть ещё программатор LarduinoISP на том же aliexpress по цене около 9$ с учётом доставки, который по сути является заводским исполнением открытого проекта LarduinoISP (метод прошивки bootloader-а в плату LGT8 с помощью другой платы arduino). Так вот данный заводской LarduinoISP, судя по фото в отзывах покупателей является ничем иным как упрощённой платой Arduino nano (сделан на USB-UART конвертере и atmega168), стоимость которой на том же Ali с Atmega168 на борту не превышает 2$. Про метод прошивки bootloader-а можно почитать в сети, например, вот. Основная проблема в том, что последними двумя методами прошиваются bootloader и HEX файлы, скомпилированные из среды Arduino IDE, но не сторонние HEX файлы. Но проблема решаема (как и для плат Arduino). Об этом далее.
Опишу проверенные мной варианты прошивки:
1) Первый и самый простой метод прошивки - это залить свой HEX файл через программу-загрузчики для плат Arduino типа XLoader или ArduinoUploader и им подобных, так как в Arduino IDE платы LGT8 прошиваются через avrdude как STK500, аналогично микроконтроллерам AVR (так как bootloader у них также - optiboot). В настройках выбираем плату arduino uno или nano и скорость UART 57600. Всё очень удобно шьётся через USB. Но! Прошить можно только один раз. Так как затирается bootloader. Увы. Такой вариант подходит только если в прошиваемый HEX добавлен optiboot. А это не так просто сделать.
2) Второй вариант - заливать HEX с помощью другой платы Arduino, методом, описанным по ссылке абзацем выше. Только вместо среды Arduino использовать программы загрузчики (лучше всего подходит ArduinoUploader, так как имеет более гибкие настройки). В программе выбираем плату Nano или Uno и скорость 19200. Всё шьётся отлично. Только не очень удобно цеплять кучу проводов к обеим платам, навешивать резистор с конденсатором на соплях.
3) Третий вариант наиболее удобный и достаточно бюджетный (к слову, мой вариант) сделать свой LarduinoISP программатор и заливать HEX файлы предыдущим способом, но в более удобном виде. Для сборки программатора понадобится микроконтроллер atmega8/168/328 (как вариант ещё atmega88), любой USB-UART конвертер (CH340, FT232, CP210x, PL2303 и т.д.), кварц на 16MHz несколько резисторов, конденсаторов, USB разъём, кнопка и прямые руки. Также нужен любой программатор для AVR (да хоть - "шесть проводков" или плата Arduino в качестве AS-ISP программатора). Схема достаточно проста:
Возможно, дополнительно надо будет подтянуть линию SWD к плюсу питания через резистор 4,7КОм, но автор проекта утверждает, что в последней версии прошивки можно и без подтяжки. На схеме я этот резистор не рисовал, но на плате место под него есть и я его установил на всякий случай.
Прошивку для атмеги можно скомпилировать в Arduino IDE (инструкция есть по ссылке выше про LarduinoISP). А чтобы получить HEX для прошивки программатором можно в среде Arduino в меню "скетч" нажать "экспорт бинарного файла". А для совсем ленивых я скомпилировал готовые хексы (прикреплю в конце статьи) для atmega8/168/328 как с bootloader-ом так и без.
Для себя я нарисовал достаточно компактную платку размерами 22х40 мм:
Работает отлично, очень удобно. Что мне очень понравилось, это - что не надо отключать провод "Reset" от программируемой платы после прошивки для запуска программы, в отличие от, например, NuLink при прошивке 1Т8051 МК или ST-Link при прошивке STM8.
Самые внимательные могли заметить, что в LGTSDK Builder в боковом меню есть кнопка "Program", она также запускает avrdude, но к сожалению там совсем другие настройки, скорее всего для заводского программатора SWDICE MKII (который, судя по всему, является AVR Dragon MKII, только с протоколом SWD вместо SPI, так как к нему даже драйвер идёт от AVR Dragon), так что увы, с этой кнопки процесс прошивки не запускается. Зато из среды AVRStudio 4 при выборе STK500, по идее, LarduinoISP должен работать при правильной настройке скорости (так как он и есть STK500 только с SWD на выходе).
Лично для себя я набросал небольшую утилиту для прошивки. Она аналогична прошивальщикам (XLoader, ArduinoUploader), просто собирает строку для avrdude и отправляет её в консоль. Только в моей утилите сразу прописаны настройки для прошивки LGT8 через программатор, через bootloader и настройки для плат arduino на atmega328.
Какой загрузчик хексов использовать - дело вкуса. Мне нравится мой, он удобный, да и "своим" всегда приятнее пользоваться.
В заключение хочу рассказать о скорости работы LGT8 в сравнении с его прототипом ATMEGA328. Возможно, кто-то читал мою статью, в конце которой я проводил сравнение скорости чтения 1-Мегабайтной SPI Flash на различных микроконтроллерах (AVR, STM8, STM32, 1T-8051). Я по своей традиции решил скомпилировать этот же проект и для LGT8. Из периферии там задействован USART с прерыванием по приёму и SPI. Напомню, что Atmega в этом проекте на своей максимальной частоте в 16 MHz смогла стабильно обрабатывать пакеты UART на скорости 57600 бод и чтение одного Мегабайта у неё заняло 3 минуты 4 секунды. LGT8 на своих 32MHz спокойно обрабатывает пакеты UART на стандартной скорости 115200 (больше не пробовал) и чтение одного Мегабайта у него заняло 1 минуту 59 секунд. Не совсем честно? Не равные условия (частота ядра, скорость UART)? Ну, кто как может. Микроконтроллеры одного класса и с одинаковым набором команд.
Какие можно сделать выводы из всего сказанного? У китайцев получился вполне достойный 8-битный микроконтроллер, способный конкурировать в своей нише с именитыми конкурентами даже без учёта более низкой стоимости. Я бы даже сказал, что он превзошёл свой прототип (ATMEGA328). Единственное, что омрачает такую радужную картину, это отсутствие нормальных инструментов для разработки и отладки, например, на базе того же Eclipse, как делают многие, в том числе и китайские производители (WCH, Artery и др). А использовать эти микроконтроллеры только в среде Arduino по моему мнению - просто расточительно.
На этом - всё. Надеюсь, данный материал будет полезен.
PS: выше по тексту я упоминал IDE Eclipse, так вот в нём также можно работать с данными микроконтроллерами. Нужна версия Eclipse for C/C++ developers. Здесь также есть варианты.
Первый - самый простой, собираем проект под winawr с помощью LGTSDK Builder и открываем полученный проект в Eclipse, как makefile проект. В этом случае проект без проблем будет компилироваться кнопкой "build" из Eclipse. Но у этого метода есть много недостатков: во первых не будет корректно работать проверка синтаксиса (будет очень много подчёркнутого правильного кода), во вторых - нельзя пользоваться встроенными инструментами загрузки файла в микроконтроллер.
Второй метод немного сложнее, есть некоторые костыли, но он лишён недостатков первого метода. Для этого в уже скачанный Eclipse необходимо установить плагин для работы с AVR и настроить его (в сети полно инструкций, например вот). Только настройка программатора (в отличии от описанной в инструкции) немного другая, вместо usb-asp выбираем stk500 v1, скорость выбираем 19200 и прописываем правильно COM порт, на который настроен программатор:
Далее собираем проект с помощью LGTSDK Builder под winavr, выкидываем из проекта все ненужные файлы (всё, кроме *.с, *.h и *.s файлов), открываем Eclipse и создаём новый проект для Atmega328p, название проекта указываем любое, а расположение проекта - указываем нашу папку с ранее собранным и почищенным проектом для LGT8, частоту кварца указываем соответственно настройкам в LGTSDK Builder. Жмём "Finish". Готово. Единственное, возможно потребуется в настройках проекта "C++/Path and Simbols/Include" прописать путь к *.h файлам, но это стандартная процедура для тех, кто работает в Eclipse. Далее можно работать как с AVR, включая стандартные библиотеки, а также прошивать микроконтроллер через программатор встроенной в Eclipse кнопкой "AVR" со стрелочкой.
Второй метод немного костыльный, но зато работать таким образом с проектом намного удобнее.
Также на досуге я переписал скетч программатора LarduinoISP на "человеческий" Си. Благодаря этому удалось поднять скорость UART до 57600. Если будет интересно, пишите в комментариях, поделюсь проектом. Его можно адаптировать под многие другие микроконтроллеры.
Список радиоэлементов
Обозначение | Тип | Номинал | Количество | Примечание | Магазин | Мой блокнот | |
---|---|---|---|---|---|---|---|
Плата программатора | |||||||
U1 | Микросхема | CH340E | 1 | CH340G, CH340C, FT232 и др | Поиск в магазине Отрон | ||
U2 | МК AVR 8-бит | ATmega8 | 1 | ATmega8/168/328 | Поиск в магазине Отрон | ||
D1 | Диод Шоттки | 1N5819 | 1 | Любой диод шоттки | Поиск в магазине Отрон | ||
R1 | Резистор | 560 Ом | 1 | Поиск в магазине Отрон | |||
R2 | Резистор | 10 кОм | 1 | Поиск в магазине Отрон | |||
R3-R5 | Резистор | 1 кОм | 1 | Поиск в магазине Отрон | |||
C1, C4 | Конденсатор | 0.1 мкФ | 1 | Поиск в магазине Отрон | |||
C2, C3 | Конденсатор | 16 пФ | 1 | Поиск в магазине Отрон | |||
Led1-Led4 | Светодиод | любой | 1 | Поиск в магазине Отрон | |||
Кварцевый резонатор | 16MHz | 1 | Поиск в магазине Отрон | ||||
Скачать список элементов (PDF)
Прикрепленные файлы:
- Firmware.rar (36 Кб)
- LGT8_SWD_BOARD.rar (26 Кб)
- LGT8_Loader.rar (379 Кб)
Комментарии (21)
|
Я собрал (0) |
Подписаться
Для добавления Вашей сборки необходима регистрация
[Автор]
[Автор]
[Автор]
[Автор]
[Автор]
[Автор]
[Автор]
Если будут ещё вопросы, пишите в личку.
[Автор]
[Автор]