GYVERCORE – ARDUINO НА МАКСИМАЛКАХ

Быстрое и лёгкое ядро для Arduino IDE с расширенной конфигурацией.
Основано на оригинальном ядре Arduino версии 1.8.9, большинство функций заменены на более быстрые и лёгкие аналоги, убрано всё лишнее и не относящееся к микроконтроллеру ATmega328p, убран почти весь Wiring-мусор, код упрощён и причёсан. Добавлено несколько функций и интересных вариантов компиляции: поддержка внутреннего тактового генератора, новая версия загрузчика, вшита новая версия компилятора и многое другое!
Разработано by Александр AlexGyver и Egor ‘Nich1con’ Zaharov
Текущая версия 1.10.2 от 05.11.2019
Установка
Автоматическая
- Открой the Arduino IDE
- Зайди в Файл > Настройки
- Вставь этот адрес в Дополнительные ссылки для менеджера плат:
https://alexgyver.github.io/package_GyverCore_index.json
- Открой Инструменты > Плата > Менеджер плат…
- Подожди загрузку списка
- Листай в самый низ, пока не увидишь GyverCore
- Жми Установка
- Закрой окно
- Выбери плату в Инструменты > Плата > GyverCore > ATmega328 based
- Готово!
- Примечание: файлы ядра находятся по пути C:\Users\Username\AppData\Local\Arduino15\packages\GyverCore\hardware\avr\1.9.0\
Ручная
- Файлы из папки GyverCore в этом репозитории положить по пути C:\Users\Username\AppData\Local\Arduino15\packages\GyverCore\hardware\avr\1.9.0\
Изменения
Облегчено и ускорено
Время выполнения функций, мкс
Функция | Arduino | GyverCore | Быстрее в |
---|---|---|---|
millis | 0.69 us | 0.69 us | – |
micros | 0.81 us | 0.81 us | – |
pinMode | 2.56 us | 0.125 us | 20.5 |
digitalWrite | 2.40 us | 0.43 us | 5.6 |
digitalRead | 2.06 us | 0.063 us | 33 |
analogWrite | 5.9 us | 0.63 us | 9.3 |
analogRead | 107.2 us | 5.94 us | 18 |
analogReference | 0.19 us | 0.19 us | – |
attachInterrupt | 1.06 us | 1.0 us | – |
detachInterrupt | 0.5 us | 0.13 us | 3.8 |
tone | 9.0 us | 2.25 us | 4 |
Занимаемое место, Flash, байт
Функция | Arduino | GyverCore | Разница, Flash |
---|---|---|---|
millis | 26 | 24 | 2 |
micros | 24 | 20 | 4 |
pinMode | 114 | 24 | 90 |
digitalWrite | 200 | 24 | 176 |
digitalRead | 190 | 24 | 166 |
analogWrite | 406 | 48 | 358 |
analogRead | 32 | 72 | -40 |
analogReference | 0 | 22 | -22 |
attachInterrupt | 212 | 180 | 32 |
detachInterrupt | 198 | 150 | 48 |
tone | 1410 | 740 | 670 |
Serial begin | 1028 | 166 | 862 |
print long | 1094 | 326 | 768 |
print string | 2100 | 1484 | 616 |
print float | 2021 | 446 | 1575 |
parseInt | 1030 | 214 | 816 |
readString | 2334 | 1594 | 740 |
parseFloat | 1070 | 246 | 824 |
Примечание: analogRead и analogReference имеют расширенную функциональность и весят чуть больше
Скетч, состоящий из однократного вызова перечисленных выше функций, занимает
- Ядро Arduino: 3446 байт (11%) Flash / 217 байт (10%) SRAM
- Ядро GyverCore: 1436 байт (4%) Flash / 94 байт (4%) SRAM
Пустой скетч:
- Ядро Arduino: 444 байт (1%) Flash / 9 байт (0%) SRAM
- Ядро GyverCore: 202 байт (0%) Flash / 0 байт (0%) SRAM
Все библиотеки, работа которых зависит от стандартных функций (время, I/O), работают быстрее:
- SPI: отправка байта данных по адресу (опустить latch, отправить адрес, отправить байт, поднять latch) занимает:
- Стандартное ядро: 14 мкс (71 кГц)
- GyverCore: 6 мкс (164 кГц)
uart является практически полным аналогом Serial, но весит в разы меньше и работает быстрее. Список функций смотри ниже в Добавлено.
Добавлено
- Расширена подсветка синтаксиса (вплоть до названий регистров и битов)
- Макрос bitToggle(value, bit), инвертирует состояние бита bit в байте value
- Быстрая функция digitalToggle(pin), инвертирует состояние пина
- Расширенная работа с АЦП
- analogStartConvert(byte pin) – начать преобразование с выбранного пина
- analogGet() – получить преобразованное значение (между analogStartConvert и analogGet можно выполнять действия, в отличие от ожидания в analogRead())
- analogPrescaler(uint8_t prescl) – установить предделитель для АЦП (2, 4, 8, 16, 32, 64, 128) – управляет скоростью работы АЦП (скоростью оцифровки). Prescaler:
- 2: 3.04 мкс (частота оцифровки 329 000 кГц)
- 4: 4.72 мкс (частота оцифровки 210 000 кГц)
- 8: 8.04 мкс (частота оцифровки 125 000 кГц)
- 16: 15.12 мкс (частота оцифровки 66 100 кГц)
- 32: 28.04 мкс (частота оцифровки 35 600 кГц)
- 64: 56.04 мкс (частота оцифровки 17 800 кГц)
- 128: 112 мкс (частота оцифровки 8 900 Гц)
- В функции analogRead(pin) вместо пина можно указать INTERNAL (получить значение внутреннего опорного напряжения) или THERMOMETR (получить приблизительную температуру МК). Примечание: нужно установить предделитель 128
- Добавлен очень быстрый и лёгкий uart (аналог классу Serial)
- uart.begin() – запустить соединение по последовательному порту со скоростью 9600
- uart.begin(baudrate) – запустить соединение по последовательному порту со скоростью baudrate
- uart.end() – выключить сериал
- uart.peek() – вернуть крайний байт из буфера, не убирая его оттуда
- uart.flush() – ждать принятия данных
- uart.clear() – очистить буфер
- uart.read() – вернуть крайний байт из буфера, убрав его оттуда
- uart.write(val) – запись в порт
- uart.print(val) – печать в порт (числа, строки, char array)
- uart.println(val) – печать в порт с переводом строки
- uart.available() – возвразает true, если в буфере что-то есть
- uart.setTimeout(val) – установить таймаут для функций парсинга (по умолчанию 100 мс)
- uart.parseInt() – принять целочисленное число
- uart.readString() – принять строку
- uart.readStringUntil() – принять строку по терминатору
- uart.parseFloat() – принять число float
- uart.parsePacket(dataArray) – принять пакет вида $50 60 70; в массив dataArray (смотри пример)
- Добавлены расширенные настройки платы из меню платы
- Выбор загрузчика
- Выбор источника тактирования (внешний, внутренний)
- Сохранять или очищать EEPROM
- Вывод тактирования на ногу МК
- Возможность отключить системный таймер 0 и освободить для себя вектор прерывания ovf
- Замена Serial быстрым uart
- Настройка или отключение B.O.D.
- Возможность отключить стандартную инициализацию периферии
- Выбор версии компилятора
Убрано
Убраны всякие сервисные файлы и прочий хлам, не относящийся к ATmega328 (wifi, USB), почищен код. Ядро полностью совместимо с остальными библиотеками, ничего из стандартных функций не вырезано.
Настройки платы
⇨ Bootloader – выбор загрузчика (требует перезаписи загрузчика):
-
- old bootloader – cтарый загрузчик (стоит на большинстве китайских плат)
- Новый с optiBoot, киатйцы тоже потихоньку начинают продавать платы с ним
- optiBoot v8 – optiboot самой свежей версии
- Вариант without bootloader для прошивки скетча во всю доступную (32 кБ) память МК
⇨ Clock – выбор частоты и источника тактирования (требует перезаписи загрузчика):
-
- External 16 MHz (стандартный вариант для платы Nano 16 МГц)
- External 8 MHz (стандартный вариант для платы Nano 8 МГц)
- Internal 8 MHz (внутренний генератор: можно работать с голым камнем без кварца)
- Internal 1 MHz (внутренний генератор)
- Internal 128 kHz (внутренний генератор) – загрузчик будет стёрт! Используйте without bootloader!
- Примечания:
- Функции времени (delay/millis) скорректированы под выбранную частоту
- После прошивки на частоту 128 кГц дальнейшая загрузка по ISP возможна только с понижением частоты ISP на стороне программатора!
⇨ Save EEPROM – сохранять EEPROM после перепрошивки (очистки) камня (требует перезаписи загрузчика):
-
- enable – включить
- disable – выключить
⇨ Clock Out – на пине D8 (NANO/Mini) будет продублировано тактирование с частотой источника (требует перезаписи загрузчика):
-
- disable – выключить
- enable – включить
⇨ System timer – преднастройка таймера 0:
-
- enable – таймер 0 настроен по умолчанию, работают функции времени delay/millis
- disable – вектор прерываний OVF таймера 0 освобождён для пользователя, delay/delayMicroseconds работают, millis/micros – нет
- Примечание: при отключенном таймере 0 функции delay и delayMicroseconds автоматически заменяются на _delay_ms и _delay_us из avr/util.h, а millis и micros заменены на 0
⇨ Serial – работа с Serial:
-
- default Serial – при работе с Serial работает стандартная библиотека Serial
- GyverUART – все обращения к Serial в коде автоматически заменяются на uart из библиотеки GyverUART – код становится быстрее и легче!
- Примечание: в GyverUART нет функций find, findUntil, readBytes и readBytesUntil!
⇨ B.O.D. (Brown-out detector) – reset при падении напряжения (требует перезаписи загрузчика):
-
- disable – отключен
- 1.8V – сброс при напряжении питания ниже 1.7-2.0V
- 2.7V (default) – сброс при напряжении питания ниже 2.5-2.9V
- 4.3V – сброс при напряжении питания ниже 4.1-4.5V
⇨ Initialization – инициализация периферии (таймеры, ацп) в начале скетча:
-
- enable – стандартная инициализация
- disable – инициализация отключена
⇨ Compiler version – версия компилятора
-
- default v5.4.0 – встроенная в IDE версия компилятора
- avr-gcc v8.3.0 – новая версия компилятора: компилирует быстрее, скетчи весят меньше!
Больше контроля!
Для большего контроля за периферией микроконтроллера рекомендую попробовать следующие наши библиотеки:
- directTimers – полный контроль над таймерами/счётчиками ATmega328
- directADC – полный контроль над АЦП и компаратором ATmega328
- GyverPWM – расширенная генерация ШИМ сигнала со всеми настройками и режимами
- GyverTimer012 – очень простая и лёгкая библиотека для контроля прерываний по таймерам 0/1/2
- GyverWDT – полный контроль за WDT (прерывания, перезагрузка)
Скачать все библиотеки можно из репозитория