ATmega4809 через Nano Every помечен как 20 МГц, но на самом ли деле он находится на 16 МГц?

Если вы перейдете на официальную страницу Arduino Nano Every и перейдете на вкладку Tech Specs, вы увидите, что он работает на частоте 20 МГц.

arduino nano every 20mhz

Включите детальную компиляцию

Однако, если вы зайдете в Arduino IDE и перейдете к файлу...Предпочтения... и включите Show Verbose Output во время: compilation, тогда вы сможете проверить, как на самом деле устанавливается плата при загрузке программы.

show verbose output

Изучение выходных данных

Когда вы посмотрите на этот выход, вы увидите, что он, похоже, настраивает плату на работу на частоте 16 МГц.

snapshot of compilation output

Правильно ли я на это смотрю?

Мне кажется, что плата действительно настроена на работу на частоте 16 МГц, не так ли? Правильно ли я на это смотрю?

Лишний вопрос

Я пытаюсь подтвердить это, потому что я :

  1. написание кода в Arduino IDE
  2. Компиляция в Arduino IDE (для генерации шестнадцатеричного файла).
  3. Загрузка в автономный 40-контактный ATmega4809

В спецификации ATmega4809 указано следующее:

16/20mhz datasheet

Если я загружу этот скетч на 40-контактный чип ATmega4809, это означает, что он будет работать на частоте 16 МГц, верно?

Установить предохранители?

Будет ли 40-контактный чип установлен на 16 МГц шестнадцатеричным файлом или мне нужно будет установить предохранители на чипе, чтобы гарантировать, что чип работает на частоте 16 МГц?

К вашему сведению - Составлено для правильной платы

Кроме того, вы можете задаться вопросом, не была ли выбрана неправильная плата при компиляции, но здесь вы можете видеть, что я выбрал Nano Every.

board set to nano every

, 👍2


1 ответ


5

С Nano Every они изо всех сил старались сделать его похожим на оригинальный Nano, вплоть до предоставления функции "эмуляции регистров", чтобы казалось, что он имеет более старый стиль регистров GPIO 328P. Работа на частоте 16 МГц просто имеет смысл, если вы хотите вести себя как обычный Nano как можно больше.

Если вы хотите убедить себя, что он работает на частоте 16 МГц, вы можете мигнуть светодиодом с причинами __builtin_avr_delay_cycles(16000000); между ними. Это занято-ждет запрошенного количества циклов. Если он работает на частоте 20 МГц вместо 16, вы увидите что-то быстрее, чем задержка в 1 секунду.

Они хранят значения предохранителя конфигурации в файле fuses_4809.bin. При дальнейшем исследовании не совсем ясно, для чего предназначен этот файл, несмотря на то, что он содержит правильные значения. Фактическое используемое значение OSCCFG (которое совпадает с файлом) определяется там непосредственно в файле boards.txt:

nona4809.bootloader.OSCCFG=0x01

OSCCFG documentation from datasheet.

Таким образом, вы можете видеть, что он настроен на 16 МГц на Nano Every. Значение -DF_CPU в командной строке происходит из строки в boards.txt для Nano Every:

nona4809.build.f_cpu=16000000L

и прокладывает себе путь в командные строки компиляции через строку в platfrom.txt:

recipe.cpp.o.pattern="{compiler.path}{compiler.cpp.cmd}" {compiler.cpp.flags} -mmcu={build.mcu} -DF_CPU={build.f_cpu} -DARDUINO={runtime.ide.version} -DARDUINO_{build.board} -DARDUINO_ARCH_{build.arch} {compiler.cpp.extra_flags} {build.extra_flags} "-I{build.core.path}/api/deprecated" {includes} "{source_file}" -o "{object_file}"

Макрос D_CPU существует для того, чтобы сообщить скомпилированному коду, с какой частотой он будет работать. OSCCFG контролирует фактическую частоту, важно, чтобы они согласились на любой код, связанный с синхронизацией.

Когда вы загружаете это "-Ufuse2:w:{загрузчик.OSCCFG}:m" это становится "-Ufuse2:w:0x01:m" в командной строке avrdude, сгенерированной из рецепта загрузки в platform.txt это имеет фактический эффект настройки чипа на 16 МГц.

Если вы действительно хотите работать на частоте 20 МГц, вы можете попробовать настроить их определения, но, вероятно, имеет смысл посмотреть на что-то вроде MCUdude MegaCoreX, который, по-видимому, имеет определение платы для ATmega4809 на частоте 20 МГц.

,

Спасибо за информацию и идею. Я попробую это сделать и посмотрю, что у меня получится., @raddevus

Огромное спасибо за дополнительную информацию о FREQSEL. Я читал таблицу данных и пытался понять, как все это устроено. Очень помогает. , @raddevus

Я просто обновился, потому что заметил, что файл bin на самом деле не используется в avrdude. Они берут ценности непосредственно из boards.txt свойства, которые в любом случае имеют тот же OSCCFG. Но я изменил его для точности., @timemage

Предпоследний абзац более подробно рассказывает о том, как чип становится запрограммированным на 16 МГц, то есть запрограммированным на значение oscal 16 МГц. Кое-что, о чем я должен был упомянуть раньше, более ясно. Это та же командная строка, тот же экземпляр запущенного avrdude, который выдает `-U:flash:file.hex:i-это вводит ваш скомпилированный код скетча в чип. Я интегрирую это позже, если у меня будет причина редактировать снова., @timemage

Так много полезной информации. Еще раз спасибо, что добавили так много. Это помогает мне перенести мой код на чип, чтобы я мог его протестировать. Действительно здорово., @raddevus

Он работает на частоте 16 МГц, потому что весь код синхронизации в библиотеке Arduino предполагает 16 МГц - запуск на частоте 20 МГц приведет к тому, что весь код синхронизации (sleep () и т. Д.) Не будет работать так, как вам может понадобиться. Поскольку Arduino ориентирован на всех, от начинающих до продвинутых пользователей, и стремится иметь совместимость "plug-n-play" почти со всеми чипами, совместимыми с ATmega Arduino... поддержание последовательности-вот путь, по которому нужно идти. Продвинутые пользователи могут переопределять вещи с помощью предохранителей и собственной логики синхронизации, а новички могут иметь вещи, которые "просто работают" из коробки., @SnakeDoc