Hatred's Log Place

DON'T PANIC!

Dec 4, 2022 - 6 minute read - electronic

LGT8Fx / LGT8F328P

На правах заметки.

Intro

В народе этот чип называют “клоном” Atmega328P или “антикризисным Arduino” (ну не сам чип, а те платки, которые доступны на AliExpress).

Клоном оно не является. Это самобытная разработка, которая в некотором отношение по пинам (в некоторых режимах) совместима ATmega328P. При этом, если, к примеру, плату с Али зашить обычным примером я миганием светодиода, собранным для BSP Arduino Nano, то диод будет мигать неадекватно. Т.е. для этого контроллера нужно свой пакет BSP, как, к примеру, для совсем “левых” контроллеров, типа ESP32.

Т.е. из схожего:

  • система комманд и ассемблер, тулчейн
  • корпус и совместимость пинов, при этом, LGT8F328 может заменить 328 мегу, то обратная замена не всегда возможна (далее).

Основные особенности LGT8F328P:

  1. Питание от 1.8-5.5В для всех частот
  2. Максимальная частота на внутренней RC цепочке и внешнем кварце до 32Mhz
  3. Нет фьюзов, как следствие, все настройки периферии нужно делать в стартовом коде, аналогично “взрослым” контроллерам. Отсюда и необходимость в отдельном “ядре” (BSP - Board Support Package из “взрослой” терминологии) для Arduino IDE.
  4. Особенности BSP для Arduino IDE, что прошивается только на 57кбод.
  5. Дополнительный третий 16 битный таймер. И все таймеры существенно проапргейжены в плане максимальных частот PWM и числа ног с PWM.
  6. Появился ЦАП
  7. АЦП тут уже 12 битный, а не 10 битный. Хотя, по отзывам, реальная точность осталась в районе 10 бит
  8. Нет EEPROM. Но он может программно эмулироваться на внутреннем флеше. Т.е. - больше EEPROM - меньше на код.

Хорошее ревью с примерами кода: Обзор клона меги328 -LGT8F328P

В общем, контроллер новый, самобытный. Для домашнего использования очень интересен, но для промышленного использования я бы поостерёгся использовать.

Для домашнего использования хорош и тем, что можно купить на Али версю платы Нано за ~115 рублей с бесплатной доставкой против 250 рублей за аналогичный Nano v3. Плюс платы с односторонним расположением элементов, что позволяет монтировать на плату в виде модуля.

Поддержка в Arduino IDE

Теперь про интеграцию в Arduino IDE. Как я писал выше - нужен свой BSP. Как минимум настройки для PLL и EEPROM при старте.

Я нашёл более-менее работающих два:

  1. https://github.com/dbuezas/LGT8fx
  2. https://github.com/nulllaborg/arduino_nulllab (альтернативный репозиторий: https://gitee.com/nulllab/nulllab_arduino)

Оба ставятся через Board Manager в Arduino IDE. Для этого в File → Preference, Settings tab:

  1. Для первого, добавляем: https://raw.githubusercontent.com/dbuezas/lgt8fx/master/package_lgt8fx_index.json
  2. Для второго, добавляем: https://raw.githubusercontent.com/nulllaborg/arduino_nulllab/master/package_nulllab_boards_index.json

Причём публичная версия первого - 1.0.5, но есть неофициальная 1.0.6 (ака v1.0.7 pre release), которая:

  1. Работает с платами с внешним 16Mhz кварцем
  2. Реализуют классический 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. Я брал:

Полезные ссылки, обсуждения и документация

Табличка, где сравнивается скорость выполнения  в тактах некоторых ассемблерных команд в обычном 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, и так же страдает от резистора.