Микроконтроллер LGT8F328P: китайская ATmega328P по-русски
Общие сведения
05.02.25
От автора
Предлагаемый цикл заметок (см. ниже) посвящен китайскому микроконтроллеру LGT8F328P – улучшенному аналогу камня ATmega328P. Вообще говоря, линейка чипов LGT8Fx8P задумывалась как замена практически всех AVR-ок из подсемейства ATmegaX8, поэтому в документации упоминаются аж три варианта китайских МК – LGT8F88P, LGT8F168P и LGT8F328P. Однако, в реальности младшие модели хер где найдешь, да и сам производитель говорит, что
«LGT8FX8P系列微控制器目前主要包括LGT8F328P»,
т.е. линейка LGT8Fx8P в настоящее время представлена в основном старшим кирпичом. В связи с этим, было решено основное внимание сосредоточить на камне LGT8F328P, младшие же чипы будем упоминать лишь в исключительных случаях.
Разработка рассматриваемых микросхем, судя по документации, ведется как минимум с середины 2010-х годов, а до этого была еще экспериментальная линейка LGT8Fx8D (для нее исходники файлов-определений датируются вообще 2013-м годом). Однако, на отечественном рынке чипы LGT8F328P появились сравнительно недавно – во всяком случае, в рунете мне не удалось найти их упоминаний раньше 2020г. (если не считать рекламы, конечно). При этом применение данных камней, судя по всему, ограничивается лишь различными платами «Ардуино», вследствие чего многие пользователи отзываются о LGT8F328P как о «клоне» ATmega328P, хотя даже беглого взгляда на характеристики китайца достаточно, чтобы сказать: «Хера себе клон!». Возможность работы на 32МГц-ах при любом допустимом напряжении питания, увеличение производительности за счет более быстрого выполнения инструкций, присутствие на борту аппаратного 16-битного ускорителя вычислений (в частности, однотактного умножителя слов), увеличенная разрядность АЦП, наличие ЦАП, дополнительного таймера и еще одного компаратора – это только «общие» отличия LGT8F328P (да и то не все), а там еще внутри каждого узла есть немало приятных бонусов. Так что рассматриваемый кирпич скорее выглядит не клоном чипов AVR, а камнем, возможности которого принудительно урезали до 328-й Меги, дабы его можно было использовать в ардуинах. При этом китаец повыводно совместим с ATmega328P и после небольшой подготовки вполне может использоваться взамен нее. Только нужно учитывать, что для прошивки чипа LGT8F328P используются выводы #18 и #21, которые у Меги задействованы под питание АЦП (AVcc и AGND), поэтому печатную плату, возможно, придется немного переделать.
Таким образом, если вам для решения ваших задач до сих пор хватает ресурсов 328-й Меги (ну, или соответствующей ардуины), китайские кирпичи являются вполне себе перспективными, особенно, учитывая их текущую цену. Поэтому я был сильно удивлен, что по ним практически нет никакой информации на русском языке (да и на английском – тоже). Судя по всему, это результат того, что:
• для нашего рынка камни LGT8F328P являются относительной новинкой;
• найти их можно только на платах «Ардуино», где и железо, и софт допускают минимальное понимание пользователем сути процесса;
• рассматриваемые кирпичи являются истинно китайской разработкой, поэтому и даташыт на них есть только на китайском.
Причем, главной я считаю именно последнюю причину. Несмотря на то, что в настоящее время перевод иероглифов на русский язык осуществляется двумя кликами мыши, в случае с техническими текстами это почему-то почти всегда дает кривой результат. Применительно к LGT8F328P могу сказать, что если в кусках текста, которые разработчики тупо скопировали из Atmel-овских даташытов, всё более-менее понятно, то в описании чисто китайских фич зачастую хер разберешься даже с пятого раза. Добавьте сюда отличающиеся названия одних и тех же битов, регистров и целых узлов камня в разных местах документа, излишнюю лаконичность (местами – тупо недосказанность), элементарные ошибки (типа «доступно четыре модели камней», хотя на самом деле их всего три) – и вы получите всё то, за что я так люблю истинно китайскую документацию. Отмечу, что в рунете широко распространен машинный перевод на русский язык официального даташыта по линейке LGT8Fx8P1. Базару нет, работа автором проделана большая, но лично мне пользоваться данным документом крайне тяжело. Поэтому, руководствуясь принципом «хочешь, чтобы было сделано хорошо – сделай это сам», я и решил написать предлагаемый читателю цикл заметок.
1 – на просторах Интернета есть еще английский вариант машинного перевода. Так вот – он тоже (по большей части) состоит из набора слов, сложить которые в нормальное предложение получается раз через три. А еще в нем напрочь отсутствуют картинки, что делает его совсем уж нечитабельным.
Основные характеристики
Камень LGT8F328P (ра́вно как и ATmega328P) является высокопроизводительным 8-битным микроконтроллером с низким энергопотреблением. Ниже дана таблица с его основными характеристиками, причем, оные приводятся не «просто так», а в сравнении с AVR-кой. На мой взгляд, такое сравнение крайне полезно, ибо оно сразу дает представление о том, лучше ли китаец, чем Мега, и есть ли вообще смысл переезжать на данный кирпич . По мере освоения мною микроконтроллера LGT8F328P данная таблица, наверное, будет дополняться, но даже в таком виде сравнение явно не в пользу AVR, к тому же, китайский чип как минимум в полтора раза дешевле (по крайней мере, на момент написания заметки, т.е. на январь 2025 года). Кроме того, LGT8F328P доступен в трех разных корпусах, причем, все эти корпуса́ можно найти в продаже. И хотя «истинным» аналогом 328-й Меги является только чип в LQFP-32, сама по себе возможность выбора корпуса также будет аргументом в пользу китайца. Вот бы еще где-нибудь раздобыть электрические характеристики на рассматриваемый камень, но тут, видимо, нужен доступ к китайскому Интернету, ибо в яндыксе/гугле даже по запросу «LGT8F328P产品输出特性» и подобным ничего путного не ищется.
Характеристика |
LGT8F328P |
ATmega328P |
ЯДРО |
Общее количество инструкций ядра |
130 |
131 |
Количество инструкций, выполняемых за один машинный такт |
119 |
84 |
Количество/разрядность регистров общего назначения |
32шт. / 8 бит |
32шт. / 8 бит |
Количество/разрядность регистров ввода-вывода для работы с периферией |
175шт. / 8 бит |
87шт. / 8 бит |
Скорость выполнения инструкций на максимальной рабочей частоте МК |
32MIPS |
20MIPS |
Встроенный умножитель 8х8 бит |
Есть |
Есть |
Скорость выполнения операции умножения (8х8 бит) |
1 такт |
2 такта |
ПАМЯТЬ |
FLASH |
32/30/28/24/16КБ1 |
32КБ |
ОЗУ |
2КБ |
2КБ |
EEPROM |
0/1/2/4/8КБ1 |
1КБ |
Размер шины данных для доступа к EEPROM |
8 бит 32 бит |
8 бит |
Циклов записи/стирания FLASH: |
100000 |
10000 |
Циклов записи/стирания EEPROM: |
--- |
100000 |
1 – камень не имеет отдельной памяти EEPROM; для сохранения данных пользователя используется кусок памяти программ (FLASH). Пользователь может выбрать размер этого куска самостоятельно (1КБ, 2КБ, 4КБ или 8КБ), либо вовсе отказаться от работы с областью «EEPROM» (0КБ). Обратите внимание на то, что от флэша отожрется вдвое больший кусок, чем будет зарезервирован под данные пользователя.
|
ПРОГРАММИРОВАНИЕ |
Последовательный интерфейс |
SWD |
ISP |
Параллельный интерфейс |
Нет |
Есть |
Возможность прошивки программы при помощи загрузчика |
Есть |
Есть |
Необходимость прошивки фузов |
Нет2 |
Есть |
Защита программы от копирования |
Есть3 |
Есть (Lock Bits) |
2 – в связи с тем, что китайский камень не требует прошивки фузов, его нельзя залочить при помощи неправильной установки источника тактирования или превращения линии сброса в обычный порт ввода-вывода.
3 – в китайских камнях используется некий «новый алгоритм шифрования, обеспечивающий безопасность кода программы». Справедливости ради следует отметить, что про этот алгоритм, видимо, говорится только в «рекламном» описании чипа на первой странице документации. Во всяком случае, фразу «加密» (шифрование) больше нигде в даташыте обнаружить не удалось. Поэтому не могу сказать, что за мега-алгоритм придумали китайцы.
|
ТАЙМЕРЫ |
Количество 8-битных таймеров (независимый предделитель, 2 регистра сравнения) |
2 |
2 |
Кол-во 16-битных таймеров (независимый предделитель, 2 регистра сравнения, функция захвата) |
2 |
1 |
Возможность работы счетчика Т2 в асинхронном режиме |
Есть |
Есть |
Каналов ШИМ |
94 |
6 |
Возможность вставки дополнительных пауз («мертвого времени») в сигналы OCxA и OCxB |
Есть |
Нет |
Количество программируемых сторожевых таймеров (WDT) |
1 |
1 |
Минимальный/максимальный таймаут сторожевого таймера |
1мс / 32с |
16мс / 8с |
Количество источников тактирования сторожевого таймера |
2 (32кГц, 2МГц) |
1 (128кГц) |
4 – у камней в корпусах LQFP-32 и SSOP-20 в наличии только 8 каналов ШИМ (отсутствует канал OC3C).
|
АЦП |
Разрядность АЦП |
12 бит |
10 бит |
Каналов АЦП |
125 |
8 |
Возможность работы как с внутренним, так и с внешним опорным напряжением |
Есть |
Есть |
Доступные номиналы внутреннего источника опорного напряжения |
+1,024В ± 1% +2,048В ± 1% +4,096В ± 1% |
+1,1В ± 9% |
Встроенный дифференциальный усилитель с программируемым коэффициентом усиления |
Есть |
Нет |
Доступные коэффициенты усиления дифференциального усилителя |
1/8/16/32 |
--- |
Автоматический контроль выхода результата преобразования за рамки заданного диапазона |
Есть |
Нет |
Встроенный датчик температуры |
Нет |
Есть6 |
5 – у камней в корпусе LQFP-32 в наличии только 9 каналов АЦП, в корпусе SSOP-20 – 7 каналов.
6 – точность измерения температуры этим датчиком составляет ±10°С, да к тому же на результат влияет потребление тока и нагрев корпуса чипа. Поэтому использовать внутренний термодатчик AVR-ок лучше только в качестве аварийного (по крайней мере, в серийных изделиях, где различные калибровки необходимо свести к минимуму).
|
ЦАП |
Количество цифро-аналоговых преообразователей |
1 |
0 |
Разрядность ЦАП |
8 бит |
--- |
Возможность использования выхода ЦАП в качестве источника опорного напряжения АЦП |
Есть |
--- |
ПРОЧАЯ ПЕРИФЕРИЯ |
Количество программируемых синхронных/асинхронных последовательных интерфейсов USART |
1 |
1 |
Количество синхронных последовательных интерфейсов SPI с программируемым режимом работы |
1 |
1 |
Количество двухпроводных последовательных интерфейсов TWI, совместимых с шиной I2C |
1 |
1 |
Количество аналоговых компараторов |
2 |
1 |
Количество внешних прерываний типа «INT» |
2 |
2 |
Количество прерываний по изменению уровня сигнала на выводе («PCINT») |
407 |
23 |
7 – у камней в корпусе LQFP-32 в наличии только 30 независимых прерываний типа «PCINT», в корпусе SSOP-20 – 18 независимых прерываний.
|
ПРОЧИЕ ОСОБЕННОСТИ |
Схема сброса при включении питания (POR) |
Есть |
Есть |
Супервизор питания (Brown-Out Detector; BOD) |
Есть |
Есть |
Количество программируемых пороговых уровней срабатывания супервизора питания |
8 |
3 |
Количество встроенных калиброванных RC-генераторов |
2 |
1 |
Выходная частота встроенных RC-генераторов |
32МГц ± 1% 32кГц ± 1% |
8МГц ± 10% |
Возможность подключения внешнего кварцевого резонатора |
Есть |
Есть |
Допустимый диапазон частот внешнего кварцевого резонатора |
32кГц…32МГц |
400кГц…20МГц |
Возможность тактирования от внешнего сигнала синхронизации |
Есть |
Есть |
Допустимый диапазон частот внешнего сигнала синхронизации |
0Гц…32МГц |
0Гц…20МГц |
Количество режимов пониженного энергопотребления |
6 |
6 |
Поддержка сенсорных элементов управления |
Нет8 |
Есть8 |
8 – вообще говоря, аппаратного контроллера сенсорных элементов управления у камня ATmega328P нет (в отличие от ATmega328PB, в состав которого входит узел «Peripheral Touch Controller»). Работа с сенсорами осуществляется через обычные порты ввода-вывода при помощи библиотеки «Atmel QTouch», использующей технологии QTouch и QMatrix (заряд/разряд внешних емкостей и измерение длительности этих процессов). То есть, ничто не мешает вместо Меги здесь использовать китайский кирпич – судя по всему, софт этого просто не заметит, т.к. все требуемые регистры/биты у китайца в наличии и называются они так же, как у AVR-ки.
|
ВЫВОДЫ И КОРПУС |
Максимальное количество портов ввода-вывода |
30 |
239 |
Количество портов с повышенной нагрузочной способностью (80мА) |
610 |
0 |
Доступные корпуса |
LQFP-48 LQFP-32 SSOP-20 |
PDIP-28 TQFP-32 VQFN-28 MLF-32 |
9 – в 32-контактных корпусах есть еще два вывода ADC6 и ADC7, которые не могут использоваться как обычные GPIO и доступны лишь в качестве аналоговых входов АЦП.
10 – отметим, что все порты с повышенной нагрузочной способностью поддерживают аппаратное формирование ШИМ-сигнала.
|
ОСНОВНЫЕ ЭЛЕКТРИЧЕСКИЕ ХАРАКТЕРИСТИКИ |
Диапазон питающих напряжений (Vcc) |
+1,8В…+5,5В |
+1,8В…+5,5В |
Максимально возможная рабочая частота (в зависимости от напряжения питания) |
32МГц (при любом допустимом Vcc) |
4МГц (1,8В…5,5В) 10МГц (2,7В…5,5В) 20МГц (4,5В…5,5В) |
Минимально возможная рабочая частота |
0Гц |
0Гц |
Максимально допустимый ток через один порт МК |
30мА11 |
40мА |
Диапазон рабочих температур |
–40°C…+85°C |
–40°C…+85°C |
11 – при описании портов ввода-вывода говорится, что предельный рабочий ток для большинства из них составляет 30мА. Обратите внимание на то, что порты с повышенной нагрузочной способностью позволяют пропускать через себя до 80мА, однако, если данная возможность не используется, с одного порта можно снимать не более 12мА.
|
Внутренняя структура
Внутренняя структура микроконтроллеров LGT8FX8P показана на рисунке ниже (объем памяти FLASH у камней LGT8F328P составляет 16К х 16 бит, объем ОЗУ – 2К х 8 бит):
Перечень основных узлов приведен в следующей таблице:
Обратите внимание на то, что в корпусах LQFP-32 и SSOP-20 будут недоступны определенные порты ввода/вывода, входы АЦП, выходы таймеров и т.д. (см. следующий пункт).
Описание выводов
Краткое описание выводов камня LGT8F328P дано в таблице ниже (отметим, что она будет справедлива для всей линейки LGT8FX8P). Красным цветом в данной таблице обозначены выводы питания, темно-зеленым – порты с повышенной нагрузочной способностью. Звездочка в названии функции означает, что по умолчанию эта фича не подключена к указанному порту, и для ее подключения потребуется выполнить дополнительную настройку при помощи регистров PMX0...PMX21. От оригинала таблица отличается тем, что в нее включены все прерывания типа «PCINT», названия всех портов с повышенной нагрузочной способностью, добавлены функции TOSC1 и TOSC2, а также указана возможность формирования сигналов OC0A и SPSS на выводах PC0 и PB1 соответственно. Кроме того, напоминаю вам, что в камне LGT8F328P нет фузов, поэтому для вывода тактовой частоты ядра в порт PB0 и/или PE5 необходимо использовать биты «CLKOE0» и «CLKOE1» регистра CLKPR.
1 – например, чтобы переключить сигнал OC1A с порта PB1 (к которому он привязан по умолчанию) на порт PF5, нужно установить бит «C1AF5» в регистре PMX0.
Предлагаемая таблица охватывает все возможные корпуса, в которых могут поставляться китайские кирпичи, а именно:
• LQFP-32 (шаг выводов 0,8мм);
• LQFP-48 (шаг выводов 0,5мм);
• SSOP-20 (шаг выводов 0,65мм).
Обратите внимание на то, что во все эти корпуса устанавливаются абсолютно одинаковые кристаллы, поэтому, казалось бы, отличия между чипами должны состоять лишь в количестве выводов (ну и в геометрии, разумеется). Однако, на деле в корпусах LQFP-32 и SSOP-20 мы будем иметь некоторое урезание доступных функций, причем не из-за худших характеристик ядра/периферии, а из-за особенностей формирования сигналов на выводах китайского камня.
Для того чтобы лучше понять этот момент, будем (очень условно) считать, что кристалл кирпича LGT8F328P имеет ровно 48 выводов, по которым как-то раскиданы все его GPIO и сигналы от периферии. Очевидно, что при таких раскладах наилучшим корпусом для этого кристалла будет LQFP-48. Однако, одной из целей разработчиков было сделать чип, повыводно совместимый с камнем ATmega328P, а у того в наличии всего 32 ноги. И для выхода из этой ситуации китайцы не нашли ничего лучше, чем тупо объединить несколько выводов кристалла в одну точку, после чего подключить эту точку к какой-нибудь лапе корпуса. Чтобы было более понятно – вот есть у вас, например, камень ATtiny13 о восьми ногах:
И тут вам в голову пришла светлая мысль сократить количество его выводов до четырех. Для этого вы просто тупо замыкаете припоем все его порты справа, кроме питания, и все порты слева, кроме массы. Раз-два, вуаля – камень в новом корпусе готов, причем, формально функционал каждой цифровой ноги увеличился аж втрое. С одной стороны, конечно, решение довольно экономичное, т.к. не требует ни мультиплексоров, ни дополнительных линий управления ими. Но с другой-то стороны, теперь придется постоянно следить за тем, чтобы замкнутые порты не стали одновременно выходами, т.к. если на одном из них будет единица, а на другом нуль, то возникнет КЗ со всеми вытекающими, ибо никаких цепей защиты в данном случае не предусмотрено. Производитель, кстати, напрямую об этом предупреждает, ничуть не смущаясь:
«配置引脚方向时需特别注意。»
(мол, особое внимание следует уделять настройке направления портов на «объединенных» выводах МК). Так что теперь моя радость от невозможности залочить LGT8F328P фузами уравновесилась печалью от того, что можно спалить как минимум 20% китайского чипа, просто неправильно проинициализировав регистры DDRB…DDRF.
Справедливости ради следует отметить, что в случае с корпусом LQFP-32 на одной ноге всегда будет объединяться «классический» порт ATmega328P (PORTC…PORTD) и порт, который есть только у китайца (PORTE, PORTF)1. И в этой ситуации можно просто не использовать китайские бонусы – даже при таких раскладах LGT8F328P будет выгодно отличаться от AVR-ки за счет более высокой тактовой частоты и улучшенного функционала практически всех узлов кирпича. Но отказываться на ровном месте от таких вкусностей, как порты с повышенной нагрузочной способностью и выходы регистров сравнения таймера Т3, тоже вроде бы не хочется. Что же касается корпуса SSOP-20, то там даже такой подход не сработает, ибо в нем к одной ноге запросто могут подключаться два «классических» порта AVR-ки (см. контакты №3, №11 и №12). Так что, видимо, всё же придется приучать себя к мега-аккуратности при инициализации регистров МК, отвечающих за направление передачи данных.
1 – исключение составляют контакты №3 и №6 корпуса LQFP-32 (впрочем, у 328-й Меги они используются исключительно для питания чипа).
Номер вывода в корпусе |
Описание вывода |
SSOP-20 |
LQFP-32 |
LQFP-48 |
03 |
01 |
01 |
PD3 / INT1 / OC2B / PCINT19 |
PD3: порт ввода-вывода общего назначения
INT1: вход внешнего прерывания INT1
OC2B: выход регистра сравнения "В" таймера Т2
PCINT19: прерывание по изменению уровня сигнала на выводе (канал #19) |
02 |
02 |
PD4 / DAO / T0 / XCK / PCINT20 |
PD4: порт ввода-вывода общего назначения
DAO: выход цифро-аналогового преобразователя (ЦАП)
T0: вход для тактового сигнала счетчика T0
XCK: внешние тактовые импульсы интерфейса USART
PCINT20: прерывание по изменению уровня сигнала на выводе (канал #20) |
--- |
03 |
03 |
PE4 / OC0A* / PCINT28 |
PE4: порт ввода-вывода общего назначения
OC0A: выход регистра сравнения "A" таймера Т0
PCINT28: прерывание по изменению уровня сигнала на выводе (канал #28) |
--- |
--- |
04 |
PF3 / OC3C / OC0B* / PCINT35 |
PF3: порт ввода-вывода общего назначения
OC3C: выход регистра сравнения "C" таймера Т3
OC0B: выход регистра сравнения "B" таймера Т0
PCINT35: прерывание по изменению уровня сигнала на выводе (канал #35) |
03 |
03 |
05 |
PF4 / HDR4 / OC1B* / ICP3 / PCINT36 |
PF4: порт ввода-вывода общего назначения
HDR4: порт с повышенной нагрузочной способностью #4
OC1B: выход регистра сравнения "B" таймера Т1
ICP3: вход захвата таймера Т3
PCINT36: прерывание по изменению уровня сигнала на выводе (канал #36) |
04 |
04 |
06 |
VCC |
VCC: напряжение питания МК ("цифровое" питание) |
05 |
05 |
07 |
GND |
GND: общий ("цифровая" земля) |
--- |
06 |
08 |
PE5 / AC1O / CLKO / PCINT29 |
PE5: порт ввода-вывода общего назначения
AC1O: выход компаратора AC1
CLKO: выход тактовой частоты МК
PCINT29: прерывание по изменению уровня сигнала на выводе (канал #29) |
06 |
09 |
PF5 / HDR5 / OC1A* / PCINT37 |
PF5: порт ввода-вывода общего назначения
HDR5: порт с повышенной нагрузочной способностью #5
OC1A: выход регистра сравнения "A" таймера Т1
PCINT37: прерывание по изменению уровня сигнала на выводе (канал #37) |
--- |
--- |
10 |
PF6 / T3 / OC2A* / PCINT38 |
PF6: порт ввода-вывода общего назначения
T3: вход для тактового сигнала счетчика T3
OC2A: выход регистра сравнения "A" таймера Т2
PCINT38: прерывание по изменению уровня сигнала на выводе (канал #38) |
06 |
07 |
11 |
PB6 / XTALO / TOSC1 / PCINT6 |
PB6: порт ввода-вывода общего назначения
XTALO: выход встроенного осциллятора МК
TOSC1: вход для подключения внешнего резонатора к таймеру T2
PCINT6: прерывание по изменению уровня сигнала на выводе (канал #6) |
07 |
08 |
12 |
PB7 / XTALI / TOSC2 / PCINT7 |
PB7: порт ввода-вывода общего назначения
XTALI: вход встроенного осциллятора МК или внешнего тактового сигнала
TOSC2: вход для подключения внешнего 7резонатора к таймеру T2
PCINT7: прерывание по изменению уровня сигнала на выводе (канал #7) |
08 |
09 |
13 |
PD5 / HDR0 / RXD* / T1 / OC0B / PCINT21 |
PD5: порт ввода-вывода общего назначения
HDR0: порт с повышенной нагрузочной способностью #0
RXD: вход приемника модуля USART (опционально)
T1: вход для тактового сигнала счетчика T1
OC0B: выход регистра сравнения "B" таймера Т0
PCINT21: прерывание по изменению уровня сигнала на выводе (канал #21) |
09 |
10 |
14 |
PD6 / HDR1 / TXD* / OC0A / PCINT22 |
PD6: порт ввода-вывода общего назначения
HDR1: порт с повышенной нагрузочной способностью #1
TXD: выход передатчика модуля USART (опционально)
OC0A: выход регистра сравнения "A" таймера Т0
PCINT22: прерывание по изменению уровня сигнала на выводе (канал #22) |
15 |
AC0P / 0C3A* |
AC0P: неинвертирующий вход компаратора AC0
OC3A: выход регистра сравнения "A" таймера Т3 |
10 |
11 |
16 |
PD7 / ACXN / PCINT23 |
PD7: порт ввода-вывода общего назначения
ACXN: общий инвертирующий вход компараторов AC0 и AC1
PCINT23: прерывание по изменению уровня сигнала на выводе (канал #23) |
--- |
17 |
PF7 / OC2B* / PCINT39 |
PF7: порт ввода-вывода общего назначения
OC2B: выход регистра сравнения "B" таймера Т2
PCINT39: прерывание по изменению уровня сигнала на выводе (канал #39) |
11 |
12 |
18 |
PB0 / ICP1 / CLKO / PCINT0 |
PB0: порт ввода-вывода общего назначения
ICP1: вход захвата таймера Т1
CLKO: выход тактовой частоты МК
PCINT0: прерывание по изменению уровня сигнала на выводе (канал #0) |
13 |
19 |
PB1 / OC1A / SPSS* / PCINT1 |
PB1: порт ввода-вывода общего назначения
OC1A: выход регистра сравнения "A" таймера Т1
SPSS: линия "Выбор ведомого" интерфейса SPI
PCINT1: прерывание по изменению уровня сигнала на выводе (канал #1) |
12 |
14 |
20 |
PB2 / OC1B / SPSS / PCINT2 |
PB2: порт ввода-вывода общего назначения
OC1B: выход регистра сравнения "B" таймера Т1
SPSS: линия "Выбор ведомого" интерфейса SPI
PCINT2: прерывание по изменению уровня сигнала на выводе (канал #2) |
--- |
--- |
21 |
GND |
GND: общий ("цифровая" земля) |
--- |
--- |
22 |
VCC |
VCC: напряжение питания МК ("цифровое" питание) |
12 |
15 |
23 |
PB3 / MOSI / OC2A / PCINT3 |
PB3: порт ввода-вывода общего назначения
MOSI: линия "Master Out / Slave In" интерфейса SPI
OC2A: выход регистра сравнения "A" таймера Т2
PCINT3: прерывание по изменению уровня сигнала на выводе (канал #3) |
13 |
16 |
24 |
PB4 / MISO / PCINT4 |
PB4: порт ввода-вывода общего назначения
MISO: линия "Master In / Slave Out" интерфейса SPI
PCINT4: прерывание по изменению уровня сигнала на выводе (канал #4) |
14 |
17 |
25 |
PB5 / SPCK / AC1P / PCINT5 |
PB5: порт ввода-вывода общего назначения
SPCK: линия тактовых импульсов интерфейса SPI
AC1P: неинвертирующий вход компаратора AC1
PCINT5: прерывание по изменению уровня сигнала на выводе (канал #5) |
--- |
--- |
26 |
PE7 / ADC11 / PCINT31 |
PE7: порт ввода-вывода общего назначения
ADC11: вход АЦП (канал #11)
PCINT31: прерывание по изменению уровня сигнала на выводе (канал #31) |
--- |
--- |
27 |
AVCC |
AVCC: напряжение питания АЦП ("аналоговое" питание) |
15 |
18 |
28 |
PE0 / SWC / APN4 / PCINT24 |
PE0: порт ввода-вывода общего назначения
SWC: линия программирования МК "SWC" (тактовые импульсы)
APN4: инвертирующий вход дифференциального усилителя АЦП (канал #4)
PCINT24: прерывание по изменению уровня сигнала на выводе (канал #24) |
19 |
29 |
PE1 / ADC6 / ACXP / PCINT25 |
PE1: порт ввода-вывода общего назначения
ADC6: вход АЦП (канал #6)
ACXP: общий неинвертирующий вход компараторов AC0 и AC1
PCINT25: прерывание по изменению уровня сигнала на выводе (канал #25) |
16 |
20 |
30 |
PE6* / ADC10* / AVREF / PCINT30 |
PE6: порт ввода-вывода общего назначения
ADC10: вход АЦП (канал #10)
AVREF: вход для внешнего опорного напряжения АЦП
PCINT30: прерывание по изменению уровня сигнала на выводе (канал #30) |
--- |
--- |
31 |
CVREF |
CVREF: вход для подключения внешнего конденсатора 0,1мкФ (см. блок-схему АЦП) |
--- |
--- |
32 |
AGND |
AGND: общий ("аналоговая" земля) |
16 |
21 |
33 |
PE2 / SWD / PCINT26 |
PE2: порт ввода-вывода общего назначения
SWD: линия программирования МК "SWD" (данные)
PCINT26: прерывание по изменению уровня сигнала на выводе (канал #26) |
22 |
34 |
PE3 / ADC7 / AC1N / PCINT27 |
PE3: порт ввода-вывода общего назначения
ADC7: вход АЦП (канал #7)
AC1N: инвертирующий вход компаратора AC1
PCINT27: прерывание по изменению уровня сигнала на выводе (канал #27) |
17 |
23 |
35 |
PC0 / ADC0 / APP0 /OC0A* / PCINT8 |
PC0: порт ввода-вывода общего назначения
ADC0: вход АЦП (канал #0)
APP0: неинвертирующий вход дифференциального усилителя АЦП (канал #0)
OC0A: выход регистра сравнения "A" таймера Т0
PCINT8: прерывание по изменению уровня сигнала на выводе (канал #8) |
18 |
24 |
36 |
PC1 / ADC1 / APP1 / PCINT9 |
PC1: порт ввода-вывода общего назначения
ADC1: вход АЦП (канал #1)
APP1: неинвертирующий вход дифференциального усилителя АЦП (канал #1)
PCINT9: прерывание по изменению уровня сигнала на выводе (канал #9) |
--- |
25 |
37 |
PC2 / ADC2 / APN0 / PCINT10 |
PC2: порт ввода-вывода общего назначения
ADC2: вход АЦП (канал #2)
APN0: инвертирующий вход дифференциального усилителя АЦП (канал #0)
PCINT10: прерывание по изменению уровня сигнала на выводе (канал #10) |
--- |
26 |
38 |
PC3 / ADC3 / APN1 / PCINT11 |
PC3: порт ввода-вывода общего назначения
ADC3: вход АЦП (канал #3)
APN1: инвертирующий вход дифференциального усилителя АЦП (канал #1)
PCINT11: прерывание по изменению уровня сигнала на выводе (канал #11) |
19 |
27 |
39 |
PC4 / ADC4 / SDA / PCINT12 |
PC4: порт ввода-вывода общего назначения
ADC4: вход АЦП (канал #4)
SDA: линия данных интерфейса TWI (I2C)
PCINT12: прерывание по изменению уровня сигнала на выводе (канал #12) |
20 |
28 |
40 |
PC5 / ADC5 / SCL / PCINT13 |
PC5: порт ввода-вывода общего назначения
ADC5: вход АЦП (канал #5)
SCL: линия тактовых импульсов интерфейса TWI (I2C)
PCINT13: прерывание по изменению уровня сигнала на выводе (канал #13) |
01 |
29 |
41 |
PC6 / RSTN* / PCINT14 |
PC6: порт ввода-вывода общего назначения
RSTN: линия внешнего сброса МК
PCINT14: прерывание по изменению уровня сигнала на выводе (канал #14) |
--- |
--- |
42 |
PC7 / ADC8 / APN2 / PCINT15 |
PC7: порт ввода-вывода общего назначения
ADC8: вход АЦП (канал #8)
APN2: инвертирующий вход дифференциального усилителя АЦП (канал #2)
PCINT15: прерывание по изменению уровня сигнала на выводе (канал #15) |
--- |
--- |
43 |
PF0 / ADC9 / APN3 / PCINT32 |
PF0: порт ввода-вывода общего назначения
ADC9: вход АЦП (канал #9)
APN3: инвертирующий вход дифференциального усилителя АЦП (канал #3)
PCINT32: прерывание по изменению уровня сигнала на выводе (канал #32) |
--- |
30 |
44 |
PD0 / RXD / PCINT16 |
PD0: порт ввода-вывода общего назначения
RXD: вход приемника модуля USART
PCINT16: прерывание по изменению уровня сигнала на выводе (канал #16) |
--- |
31 |
45 |
PD1 / TXD / PCINT17 |
PD1: порт ввода-вывода общего назначения
TXD: выход передатчика модуля USART
PCINT17: прерывание по изменению уровня сигнала на выводе (канал #17) |
01 |
46 |
PF1 / HDR2 / OC3A / PCINT33 |
PF1: порт ввода-вывода общего назначения
HDR2: порт с повышенной нагрузочной способностью #2
OC3A: выход регистра сравнения "A" таймера Т3
PCINT33: прерывание по изменению уровня сигнала на выводе (канал #33) |
02 |
32 |
47 |
PD2 / INT0 / AC0O / PCINT18 |
PD2: порт ввода-вывода общего назначения
INT0: вход внешнего прерывания INT0
AC0O: выход компаратора AC0
PCINT18: прерывание по изменению уровня сигнала на выводе (канал #18) |
48 |
PF2 / HDR3 / OC3B / PCINT34 |
PF2: порт ввода-вывода общего назначения
HDR3: порт с повышенной нагрузочной способностью #3
OC3B: выход регистра сравнения "B" таймера Т3
PCINT34: прерывание по изменению уровня сигнала на выводе (канал #34) |
Обратите внимание: в корпусе LQFP-32 у китайца на выводе #7 расположен выход осциллятора, а у ATmega328P - вход. Соответственно, на 8-м выводе у LGT8F328P находится вход осциллятоа, а у меги - выход. Обычно к этим контактам подключается кварцевый резонатор, так что пользователю похер, где там вход, а где выход, но если вы тактируете чип от внешнего сигнала синхронизации, эту особенность следует учитывать.
Назначение выводов (цоколевка)
Назначение выводов микроконтроллера LGT8F328P в зависимости от типа корпуса показано на рисунках ниже. Красным цветом на них обозначены выводы питания, оранжевым – порты с повышенной нагрузочной способностью, а синим – «объединенные» ноги (т.е. контакты, к которым подведено сразу несколько выводов кристалла кирпича LGT8F328P, см. выше):
Обратите внимание – на приведенных рисунках отсутствует привязка прерываний типа «PCINT» к контактам кирпича. Я думаю, что китайцы сделали это намеренно, дабы не захламлять картинки длинными надписями – лично меня они в документации на AVR-ки люто раздражают. Правда, точно так же меня напрягает искать нужную информацию по всему даташыту, тем более – по китайскому. Поэтому соответствие номеров прерываний «PCINT» портам камня я тоже привел здесь, дабы всё лежало в одной куче:
Ну а теперь несколько слов по поводу отличий моих картинок от оригинала. Нетрудно видеть, что оных отличий довольно много, но это не потому, что я такой умный, а потому, что составители китайского даташыта то ли невнимательны, то ли просто похуисты. Основная претензия (именно претензия) у меня к ним следующая – если уж вы припаиваете несколько выводов кристалла к одной ноге корпуса, то будьте добры показать на картинке все соответствующие порты, а не только их функции (причем зачастую тоже выборочно). Поясню мысль. Возьмем, например, корпус LQFP-32 и присмотримся к контакту №3, который в обычной Меге должен был подключаться к земле:
Как видим, теперь он может использоваться в качестве обычного порта ввода-вывода PE4, да еще мы имеем возможность вывести на него сигнал OC1B. Это позволит, например, заюзать камень в качестве SPI-ведомого, не привлекая софтовую реализацию данного интерфейса, и при этом у нас не потеряется возможность полноценно ШИМить жирным 16-битным таймером Т1. Обратите внимание на то, что с ATmega328P такой фокус не пройдет, ибо там функции nSS и OC1B висят на одной ноге камня (PB2) и разделить их нельзя. Ну а при использовании китайца это вполне возможно – для этого нужно всего лишь установить бит «C1BF4» в регистре PMX0 (это перекинет сигнал OC1B с порта PB2 на альтернативный вывод кристалла), после чего традиционно объявить порт PE4 выходом, правильно настроить счетчик Т1 и вывести наружу ШИМ от регистра сравнения «B». Так вот, в результате данных действий хер вы получите требуемый сигнал на контакте №3 корпуса LQFP-32 – там будет присутствовать статический уровень (либо нуль, либо единица). И это вполне логично: как следует из таблицы с описанием выводов LGT8F328P, функция OC1B действительно выводится на третий контакт 32-пинового корпуса, но только привязана она не к порту PE4, а к порту PF4. Поэтому для получения искомого ШИМа на данном контакте нам требуется объявлять выходом именно PF4, а не PE4, однако, из картинки для корпуса LQFP-32 в оригинальном даташыте это никак не следует – там функция OC1B как будто бы привязана к порту PE4. Можно, конечно, сказать, что вся необходимая информация есть в таблице, но кто в здравом уме будет пролистывать эту портянку, если есть рисунки с цоколевкой, где указаны порты и их функции? Вот поэтому я и считаю, что на этих рисунках нужно либо приводить полную информацию по каждому «объединенному» выводу МК (как в моем варианте), либо вообще ничего не писать, кроме номеров контактов и расположения ключа на корпусе чипа.
Остальные отличия на моих картинках – это больше исправления мелких огрехов составителей китайской документации. Например, в оригинале ни для одного типа корпуса почему-то не указаны названия портов с повышенной токовой нагрузкой (HDRx), а также выводы с функциями TOSC1 и TOSC2. Кроме того, даже для чипов в LQPF-48, где «объединенных» контактов тупо нет, для выводов 18, 19 и 35 указан неполный перечень доступных фич (чего уж ждать от картинок для SSOP-20). Ну и разные названия одних и тех же функций тоже несколько напрягают (см. RESETN / RSTN и SPCK / SCK), хотя, для китайской документации это и является традицией. С одной стороны, конечно, на уровне интуиции любому разработчику понятно, что речь идет об одном и том же, но с другой стороны, при электронном поиске половина нужной информации запросто может пройти мимо.
А у меня на этом всё. Желаю удачи при работе с камнями LGT8F328P!
Обсудить эту заметку можно в
Телеге или в
ВК
Перечень заметок
Перечень статей про LGT8F328P, доступных на данный момент времени, приведен ниже. За исключением пункта "Введение", он в точности повторяет оглавление из официальной документации, что, собственно говоря, неудивительно. Первые четыре пункта (которые без номеров) – это просто содержание текущей статьи, и в общий перечень я их засунул чисто для удобства, чтобы все нужные ссылки были в одном месте. Замечу, что предлагаемые тексты не являются тупым пересказом даташыта, хотя бы потому, что в них я постарался исправить очевидные несоответствия и ошибки, а также добавить практической информации. Итак, вот тексты, которые я успел написать про китайца:
Содержание цикла заметок «Микроконтроллер LGT8F328P: китайская ATmega328P по-русски»:
Основные характеристики (в сравнении с ATmega328P).
Внутренняя структура МК.
Описание выводов.
Назначение выводов (цоколевка).
1. Введение (изготовление программатора и начало работы).
2. Ядро LGT8XM и особенности выполнения программы.
Приложение А. Список регистров микроконтроллера LGT8F328P.
Приложение B. Список инструкций микроконтроллера LGT8F328P.