На правах заметки.
Intro
В народе этот чип называют “клоном” Atmega328P или “антикризисным Arduino” (ну не сам чип, а те платки, которые доступны на AliExpress).
Клоном оно не является. Это самобытная разработка, которая в некотором отношение по пинам (в некоторых режимах) совместима ATmega328P. При этом, если, к примеру, плату с Али зашить обычным примером я миганием светодиода, собранным для BSP Arduino Nano, то диод будет мигать неадекватно. Т.е. для этого контроллера нужно свой пакет BSP, как, к примеру, для совсем “левых” контроллеров, типа ESP32.
Т.е. из схожего:
- система комманд и ассемблер, тулчейн
- корпус и совместимость пинов, при этом, LGT8F328 может заменить 328 мегу, то обратная замена не всегда возможна (далее).
Основные особенности LGT8F328P:
- Питание от 1.8-5.5В для всех частот
- Максимальная частота на внутренней RC цепочке и внешнем кварце до 32Mhz
- Нет фьюзов, как следствие, все настройки периферии нужно делать в стартовом коде, аналогично “взрослым” контроллерам. Отсюда и необходимость в отдельном “ядре” (BSP - Board Support Package из “взрослой” терминологии) для Arduino IDE.
- Особенности BSP для Arduino IDE, что прошивается только на 57кбод.
- Дополнительный третий 16 битный таймер. И все таймеры существенно проапргейжены в плане максимальных частот PWM и числа ног с PWM.
- Появился ЦАП
- АЦП тут уже 12 битный, а не 10 битный. Хотя, по отзывам, реальная точность осталась в районе 10 бит
- Нет EEPROM. Но он может программно эмулироваться на внутреннем флеше. Т.е. - больше EEPROM - меньше на код.
Хорошее ревью с примерами кода: Обзор клона меги328 -LGT8F328P
В общем, контроллер новый, самобытный. Для домашнего использования очень интересен, но для промышленного использования я бы поостерёгся использовать.
Для домашнего использования хорош и тем, что можно купить на Али версю платы Нано за ~115 рублей с бесплатной доставкой против 250 рублей за аналогичный Nano v3. Плюс платы с односторонним расположением элементов, что позволяет монтировать на плату в виде модуля.
Поддержка в Arduino IDE
Теперь про интеграцию в Arduino IDE. Как я писал выше - нужен свой BSP. Как минимум настройки для PLL и EEPROM при старте.
Я нашёл более-менее работающих два:
- https://github.com/dbuezas/LGT8fx
- https://github.com/nulllaborg/arduino_nulllab (альтернативный репозиторий: https://gitee.com/nulllab/nulllab_arduino)
Оба ставятся через Board Manager в Arduino IDE. Для этого в File → Preference, Settings tab:
- Для первого, добавляем:
https://raw.githubusercontent.com/dbuezas/lgt8fx/master/package_lgt8fx_index.json
- Для второго, добавляем:
https://raw.githubusercontent.com/nulllaborg/arduino_nulllab/master/package_nulllab_boards_index.json
Причём публичная версия первого - 1.0.5, но есть неофициальная 1.0.6 (ака v1.0.7 pre release), которая:
- Работает с платами с внешним 16Mhz кварцем
- Реализуют классический Arduino интерфейс для работы с EEPROM.
В общем, оригинальный BSP LGT8fx выглядит заброшенным. Поэтому, несмотря на то, что многие паблики ссылаются на него, я рекомендую ставить или неофициальную 1.0.6/1.0.7 pre release или остановиться на nulllab.
Nullab в Board Manager ищется по словам… nulllab :-) При выборе борды нужно выбрать:
- Tools → Board → Nulllab AVR Compatible Board → DIY Board
При этом станет доступен полный “тюниг” для всех борд:
- Tools → CPU Frequency: 16 Mhz
- Tools → Clock Source: External (16 Mhz)
- Tools → EEPROM size: от 0 до 8кБ с шагом x2
- Tools → Upload Speed: 57600 - это важно, иначе не будет шиться
Для BSP от dbuezas и его неофициальной версии всего этого нет.
Ну и стоит отдельно упомянуть, что оба два этих BSP - это развитие “официального” оного: https://github.com/LGTMCU/Larduino_HSP. Можете и его попробовать. В некоторых источниках есть и на него ссылка.
Рекомендую ознакомиться так же со ссылками на страницах обоих BSP. Можно найти полезного.
Покупка
Естественно - Aliexpress. Я брал:
- Nano + TypeC: https://aliexpress.ru/item/1005004234919226.html, на момент составлении заметки - ~118руб
- Pro Mini: https://aliexpress.ru/item/33003833124.html
- тут две версии под 3.3В и 5В, плюс отдельно сам контроллер
- цена на момент заметки: ~63 руб за 5В версию. 3.3В версия чуть дороже
- UNO: TBD пока сам ищу. Ниже варианты, не проверенные:
- https://aliexpress.ru/item/1005004833260461.html UNO R3 ~300руб плюс доставка примерно столько же.
- имхо, проще “оригинал” купить:
- https://aliexpress.ru/item/32556087234.html - 233+50 руб
- https://aliexpress.ru/item/32932088536.html - 207+55 руб
Полезные ссылки, обсуждения и документация
- Упомянутый выше: Обзор клона меги328 -LGT8F328P
- LGT8F328p. Начало работы, особенности
- Даташиты (лежат на Я.Д могут протухнуть в любой момент, поэтому пишу и имена файлов, что бы потом поискать на машине времени)
- Даташит, серия P (RU) - LGT8FxxxP.pdf
- Даташит, серия D (RU) - LGT8FxxxD.pdf
- Даташит 1.0.4 (EN) - Databook
- Даташит 1.0.5 (EN) - Databook
- Характеристики и отличия
- Видео обзор: https://www.youtube.com/watch?v=Mk8YXS1tkhI
- Даташиты (лежат на Я.Д могут протухнуть в любой момент, поэтому пишу и имена файлов, что бы потом поискать на машине времени)
- На Amperka.ru: https://amperka.ru/product/chip-lgt8f328p
- Даташит: https://storage.googleapis.com/media.amperka.com/products/chip-lgt8f328p/media/lgt8f328p-datasheet.pdf
- Рекомендует ставить оригинальный BSP, чего делать не нужно. Или использовать его для проектов вне среды Arduino.
- На странице BSP от dbuezas хорошая подборка документации:
- https://hallroad.org/lgt8f328p-lqfp32-minievb-alternative-arduino-nano-v3.0-atmega328p.html
- тоже рекомендуют оригинальный BSP.
Табличка, где сравнивается скорость выполнения в тактах некоторых ассемблерных команд в обычном AVR и в LGT8 (по данным по ссылке 1):
Instruction Function Cycle of AVR Cycle of LGT8XM
ADIW Add immediate to word 2 1
SBIW Subtract immediate to word 2 1
MUL/S/SU 8bit multiply 2 1
FMUL/S/SU Fractional multiply 2 1
RJMP/RCALL Relative jump/call 2/3 1
IJMP/ICALL Indirect jump/call 2/3 2
RET/IRET Return 4 2
CPSE Compare, skip if equal 1/2/3 1/2
SBIS/SBRS Skip if set 1/2/3 1/2
SBIC/SBRC Skip if cleared 1/2/3 1/2
LD/LDD Load indirect 2 1
ST/STD Store indirect 2 1
LPM Load program memory 3 2
PUSH/POP Stack access 2 1
Другие MCU от LGT в платах Arduino и их сравнения:
Pinout
Code snippets
Определение в коде, что строимся для LGT8
// TBD
GUID В каждом чипе прошит уникальный GUID (aka Serial Number). Может использоваться для расшифровки/кодирования чего-то
uint32_t guid = (uint32_t)&GUID0;
Вывод тактовой на ногу PB0
CLKPR = 1<<PMCE; //разрешить изменение
CLKPR = 1<<5 | 1<<0; //делитель =2 и вывод clk
Переключение тактирования на кварц
sysClock(EXT_OSC);
CLKPR = 1<<PMCE;//разрешить изменение
CLKPR = 1<<5; // вывод clk
Тактирование от внешнего генератора 32MHz
#include "lgtx8p.h"
int main(){
PMCR=1<<PMCE; //разрешить выбор источника тактирования
PMCR= 1<<2 | 1<<5; //External high frequency crystal
PMX2= 1<<WCE;//разрешить изменения
PMX2= 1<<XIEN;//разрешить вход тактовой частоты от кварц. генератора
CLKPR = 1<<PMCE;//разрешить изменение
CLKPR = 1<<5; //делитель =1 и вывод clk
}
ЦАП. Вывод пилы
#include "lgtx8p.h"
void setup() {
DACON= 1<<DACEN | 1<<DAOE ; // dac-on, включить пин
static uint8_t n=0;
cli();
while(1){ DAL0=n++; }
}
void loop() {}
Пример задействования ног SWC,SWD,ADC6,ADC7,AREF - их можно сделать выходами порта E
#include "lgtx8p.h"
void setup() {
PMX2= 1<<WCE;
PMX2= 1<<E6EN; //сделеть AREF ногой PE6
MCUSR&= ~(1<<7);
MCUSR|= 1<<7;// Освободить PE0,PE2 от SWD
//ноги SWC=PE0,ADC6=PE1,SWD=PE2, ADC7=PE3,AREF=PE6
DDRE= 1<<0 | 1<<1 | 1<<2 | 1<<3 | 1<<6 ;
Пример ногодрыга с переключением клоков на тактовую 32МГц
int main(){
CLKPR = 1<<PMCE;//разрешить изменение
CLKPR = 0; //делитель =1
DDRB = 1<<4; // 12 пин OUTPUT
while (1){ PINB=0x10; }
}
Тест на наличие таймера3 -при 16МГц тактовой светодиод Тх замигает с частотой примерно 5Герц
int main() {
*(uint8_t*)0x33 =0x2 ;// DDRF=1<<DDF1
*(uint8_t*)0x90 =0x40; // TCCR3A=1<<COM3A0;
*(uint8_t*)0x91 =0xD; // TCCR3B=1<<WGM32 | 1<<CS30 |1<<CS32;
*(uint8_t*)0x99 =0x5; // OCR3AH=0x5;
*(uint8_t*)0x98 =0xDC; // OCR3AL=0xDC;
Можно перенести Rx и Tx (оба одновременно или только какой то один ) на другие пины:
PMX0= 1<<7;//разрешить ремаппинг
PMX0= (1<<RXD5) |( 1<<TXD6) ;
Нужно, так как на этой плате неправильно разведён USART. Обмен данными возможен только между мк и usb-мостом. Какой-либо внешний сериальный сигнал подать нет возможности, он просто не прожмёт линию, которую каждый чип и светодиоды тянут вверх. Но выход есть, на помощь приходят регистры port multiplexing (PMX). Так что подключить bluetooth/GPS не проблема. Так же отремаппить можно и выход таймера OC3A, который сидит на пине Txd, и так же страдает от резистора.