ARDUINO
, 13.01.2025 в 23:19 (311 Просмотров)
Из темы usdx. Попытка обобщить информацию о загрузчике. Чтобы изложить мысли более правильно не хватает времени. Пусть это будет первая часть сериала про то, как среда ардуино подключается к ардуинкам с загрузчиком. Понимание загрузчика не обязательно для ардуинщика, но с ним легче разобраться в некоторых загадочных проблемах.
У атмеги 328 на флэше зарезервировано несколько байт для служебных целей, три таких байта называются фьюзами. Это просто регистры в программной памяти, каждый бит в которых чем-то управляет. В одном из этих трех фьюзов есть бит "bootrst". В человеческом понимании он означает "когда включаешься запускай программу со специального адреса в конце флэша". Туда, в конец флэша, с заранее заданным отступом, и пишется загрузчик. В прошивке загрузчика содержится информация с какого адреса его нужно прошивать, это и есть тот самый отступ, и аврдуде запишет загрузчик именно туда. Когда загрузчик окажется на своем месте, и фьюз при включении питания скажет, что следует запускать с адреса загрузчика, тому не останется ничего другого, как запускаться и работать.
Загрузчик, по своей сути, это просто маленькая программа, которая в одну сторону разговаривает с внешним миром через usart (компорт), а в другую с флэшем микроконтроллера. Так как загрузчик находится в конце флэша, то от начала и до загрузчика место доступно для записи программы. Когда мы прошиваем блиньк, то загрузчик принимает этот блиньк в виде потока байт с ком-порта, и пишет их с самого начала флэша. Это если вкратце.
И, раз упомянули ком-порт (usart), то нельзя не упомянуть, что он работатет асинхронно. То есть имеется приемный провод, передающий провод и земля. Нет никакого провода для синхронизации приемника с передатчиком. За совпадение скоростей отвечают сами приемник и передатчик. Поверим, что со стороны компьютера с соблюдением точной скорости все в порядке. Для микроконтроллера же обеспечение заданной скорости означает настройку usart путем деления собственного тактового генератора, таким образом, чтобы получилась нужная скорость обмена через порт. Точно поделить тактовую частоту для получения необходимой скорости usart обычно не удается, и для этого существует допуск 3-5%, в который достаточно уложиться. При сборке загрузчика информации об отклонении от заданной скорости тоже выводится на экран, если будет интересно.
То есть когда мы собираем загрузчик, то явно указываем частоту кварца и скорость обмена. Допустим нам с кварцем 16 МГц нужна скорость 57600. Для нее и будет расчитан делитель загрузчика. Шить этот загрзучик в ардуинку с кварцем 10 или 20 МГц бесполезно, так как скорость usart изменится. Подключаться на другой скорости тоже вряд ли получится.
Как можно узнать нужную скорость usart? Её можно посмотреить в ардуинской программе. Для этого в опциях нужно отметить галочкой вывод процесса загрузки скетча на экран. При попытке прошить выбранную атмегу, программа в нижнем окне покажет, какой именно командой она пытается это сделать. Команду можно скопировать в блокнот и использовать как образец. Выглядит команда примерно так:
Видно, что среда ардуино пытается связаться с ардуинкой на скорости 57600. Теперь, когда точно знаем скорость и, какой будет кварц атмеги, собираем загрузчик и прошиваем.Код:avrdude -v -patmega328p -carduino -P/dev/ttyUSB0 -b57600 -D -Uflash:w:blink.hex:i
Есть еще два бита в атмеге, которые указывают, сколько флэша зарезервировать под загрузчик, чтобы больше места осталось под основную программу. Если самому собирать загрузчик, то он получится даже меньше минимального выделяемого размера, около 400 байт, и фьюз можно будет поправить. Поначалу это не важно, можно оставить маленький загрузчик в самом большом разделе, пока свободного места для программ на флэше достаточно.
Ещё один момнет. До сих пор шла речь о запуске загрузчика и соединении с компьютером, но в этом состоянии загрузчик находится столько времени, сколько нужно для ожидания команды от компьютера, а затем запускается основная программа с флэша. Это та самая задержка между подачей питания на микроконтроллер и началом выполнения программы.
Загрузчик можно найти готовый, если по какой-то причине не получится его собрать. Хотя, если на компьютере установлена среда ардуино, то все необходимое для сборки уже должно присутствовать. Не уверен лишь насчет команды make, ставится ли она с ардуиной, но остальное точно мелькает в окне сборки. В любом случае, процесс описан в документации с исходым кодом загрузчика. Проблем быть не должно.
Речь в данном сообщении шла о загрузчике optiboot. Это самый популярный загрузчик. Найти его можно в интернете на счет "раз". Скорее всего первой будет ссылка на гитхаб, где расположен исходный код проекта.
Для примера командная строка для сборки загрузчика. Это то, что нужно было набрать, находяс в исходной папке проекта, чтобы получить hex-файл нужного загрузчика.
Продолжение следует. Если появится необходимость.Код:make atmega328 AVR_FREQ=16000000 BAUD_RATE=57600 LED=B5 LED_START_FLASHES=1 LED_START_ON=1 TIMEOUT=1 $ avr-size optiboot_atmega328.hex text data bss dec hex filename 0 484 0 484 1e4 optiboot_atmega328.hex
- Категории
- Без категории