Atmega328p + USART + Bootloader + Proteus. Часть 2

Автор: | 28.02.2021

Начало тут

Теперь будем разбираться как использовать в Atmega328p bootloader chip45boot2. Идем на сайт разработчика этого bootloader и начинаем изучать документацию.

Характеристики bootloader chip45boot2 (перевод от Google):

  • прямая поддержка файлов INTEL HEX
  • автоматическая установка скорости передачи для хоста, не зависит от настроек тактовой частоты процессора (!!!)
  • поддержка RS485!
  • простой интерфейс командной строки для работы с любой терминальной программой
  • программирование FLASH и EEPROM памяти
  • побайтовый доступ для чтения и записи к памяти SRAM и регистров МК
  • побайтовый доступ для чтения и записи в память EEPROM
  • Загрузочный блок 1k (2048 байт) для ATmegas / AT90CAN, 8k загрузочный блок фиксированного размера для Xmegas
  • распространяется в виде предварительно скомпилированных шестнадцатеричных HEX файлов
  • удобное программное обеспечение для ПК и Mac OS X, доступное для свободного использования в коммерческих и некоммерческих проектах без каких-либо гарантий.

Для экспериментов я решил использовать китайский клон Arduino UNO

Тем более тут уже есть и UART>USB преобразователь, на этой платке я и буду отрабатывать взаимодействие по UART в своем проекте.

Для прошивки bootloader chip45boot в Atmega328p будем использовать USBasp программатор

Для программирования bootloader chip45boot2 мне понадобится еще и файл прошивки под Atmega328p, на сайте chip45boot2 скачиваем архив с прошивками под разные МК, мне потребуется файлик

chip45boot2_atmega328p_uart0_v2.9Q.hex

Теперь смотрим, о чем гласит документация по вопросу прошивки загрузчика (перевод от Google):

Используйте свой ISP адаптер и программное обеспечение для ПК, чтобы загрузить шестнадцатеричный файл chip45boot2 в МК. Убедитесь, что этот файл прошивки соответствует типу МК, а также UART, необходимому для связи! Помимо шестнадцатеричного файла, также fusebits микроконтроллера AVR должны быть правильно настроены. Наиболее важными для правильной работы загрузчика являются биты BOOTSZ и BOOTRST. Некоторые общие замечания по настройке fusebits ниже:

Fusebits Функция
BOOTSZ Эти два бита выбирают размер области загрузочного блока флеш-памяти!

Выберите загрузочный блок размером 2 Кбайта, т.е. «Размер загрузочной флэш-памяти = 1024 слова», поскольку Atmel считает адреса флэш-памяти в 16-битных словах (2 байтов). Это также выбирает начальный адрес загрузочного блока.

BOOTRST Этот бит активирует загрузчик, т.е. после сброса МК запускает выполнение кода не с первого адреса для основного кода программы (0x0000), а с указанного выше адреса загрузочного блока.

Этот бит должен быть установлен, чтобы иметь возможность входить в загрузчик после каждого сброса МК.

WDTON Этот бит включает программный сторожевой таймер.

Если вашему приложению требуется сторожевой таймер для запуска, и вы должны установить этот бит, вы не можете использовать загрузчик без модификации кода. В настоящее время загрузчик не содержит кода для запуска сторожевого таймера, поэтому сторожевой таймер выполнит сброс после запуска загрузчика и таймаута сторожевого таймера.

Загрузчик пытается отключить сторожевой таймер после запуска. Если сторожевой таймер был включен в основном коде программы раньше (даже перед последним сбросом), он будет отключен и не должен прерывать загрузчик. Если вы перейдете к выполнению основного кода программы, загрузчик не восстановит предыдущее состояние сторожевого таймера. Ваше приложение должно позаботиться о включении сторожевого таймера на старте.

Примечание. Если сторожевой таймер включен с помощью fusebits, программно отключить его невозможно. Если вам нужен постоянно включенный сторожевой таймер, вам придется купить исходный код bootloader chip42boot2 и добавить код для запуска сторожевого таймера.

CKDIV8 Этот бит делит источник тактовой частоты на восемь перед синхронизацией ядра МК.

Поскольку chip45boot2 автоматически настраивает параметры предварительного делителя скорости передачи для принятой последовательности символов 19200 бод, но есть проблемы с некоторыми слишком низкими настройками тактирования. Если используется внутренний RC-генератор 8 МГц, бит CKDIV8 должен быть отключен, так как результирующая тактовая частота 1 МГц не подходит для связи со скоростью 19200 бод. chip45boot2 работает правильно примерно с частотой тактирования 4 МГц и выше. Это не относится к тактовым частотам, подходящим для скорости передачи данных, например, внешний кристалл 1,8432 МГц работает нормально и, следовательно, внешний кристалл 14,7456 МГц также работает нормально, даже с включенным CKDIV8, так как это приводит к тактовой частоте микроконтроллера 1,8432 МГц.

SUT_CKSEL Эти биты в комбинации выбирают источник тактовой частоты для ядра МК и времени запуска после сброса.

Большинство новых контроллеров AVR поставляются с внутренним RC-генератором 8 МГц, выбранным в качестве источника синхронизации, и имеют CKDIV8.

Используемые и старые контроллеры AVR поставляются с выбранным внутренним RC-генератором 1 МГц. chip45boot2 правильно работает с внутренним RC-генератором при условии, что частота составляет не менее 4 МГц (предпочтительно 8 МГц).

В качестве альтернативы можно использовать внешние источники синхронизации, например, нечетные частоты, 14,7456 МГц, для достижения безошибочной скорости передачи данных.

Имейте в виду, что “external clock” выбирают при внешнем тактовом сигнале, а не внешним кристаллом! Если вы используете кристалл, обязательно выберите «external crystal», а не «external clock», иначе дальнейший доступ по ISP будет невозможным до тех пор, пока вы не подключите внешний тактовый сигнал к XTAL1 МК! Это подходящее решение для реанимации неправильно настроенных микроконтроллеров.

После того, как fusebits установлены правильно и шестнадцатеричный файл запрограммирован, вы можете работать с загрузчиком.

Ну что ж, будем пробовать….

Для начала подключим платку Arduino UNO к USBAsp программатору и попробуем прочитать Atmega328p установленную в ардуинке

Тут все Ок!

Далее читаем fuses

Тут тоже все Ок!

Сохраняем на всякий случай flash в файлик

Тоже все ОК!

Теперь перед прошивкой загрузчика нам надо правильно выставить fusebits, в авердудке переходим на вкладку fusebits и еще раз считываем биты конфигурации МК

Теоретически нам достаточно правильно выставить биты BOOTSZ0, BOOTSZ1. Бит BOOTRST уже выставлен, остальные биты тоже выставлены для используемого в ардунке кристалла на 16мгц.

Согласно документации на загрузчик, нужно сконфигурировать биты BOOTSZ0 и BOOTSZ1 на 1024 слова, смотрим даташит на нашу атмегу

Т.е. нам надо бит BOOTSZ1 выставить в 0, а бит BOOTSZ0 в 1, так как в авердутке отображение состояния битов выбрано как инверсное, то делам все на оборот!

Остальные биты не трогаем и пробуем прошить конфигурацию битов в МК

Успешно, теперь заливаем сам загрузчик, в области Flash авердудки выбираем необходимый файлик прошивки и давим на кнопку «Программирование»….

Так как в ардуинке был свой загрузчик и программка blink, после наших действий там видимо, что то пошло не так и моргающий светик замер во включенном состоянии.

Теперь посмотрим, что у нас получилось.

Первым делом подключаем нашу модифицированную ардуинку к ПК по USB

Ардуинка села на порт COM4, открываем программу от Chip45, выставляем нужный нам COM порт и нажимаем на кнопку “Connect to Bootloader”

Зеленый индикатор сигнализирует об успешном подключении к bootloader. Теперь осталось дело за малым, выбрать файл прошивки от нашего проекта и попробовать прошить нажатием на кнопку «Program Flash»

Немного подумав, прогресс бар пробежался и рядом с зеленым индикатором появилась обнадеживающая надпись «Done!»

Закрываем программку для прошивки, сбрасываем платку ардуинки, открываем терминал и видим приходящие байты с МК, отправляя байты на МК, видим, как на платке ардуинки перемигиваются светики сигнализирующие работу UART

Значит все получилось! Теперь можно дальше мучать новый проект, заливая новые прошивки по USB.

73!

Atmega328p + USART + Bootloader + Proteus. Часть 2: 10 комментариев

  1. Геннадий

    Добрый день!
    У меня снова вопросы… 🙂
    Извините если надоел, но больше не к кому обратиться.
    Вчера весь вечер проигрался с прошивкой 1.05h
    Пробовал на нескольких контролерах (платах) с разной конфигурацией дисплеев и 1602 i2c и OLED i2c, но при включении плата определяется конфигуратором но на дисплеях ничего нет, пробовал при подключенной Si5351 и без нее результат один и тот же. И да иноформация в память не пишется, хотя конфигуратор говорит что все нормально
    Попробовал прошить 1.05e тут повеселей, на дисплее 1602 i2c появляется информация, но когда латиница то вроде все нормально, но потом появляются кракозябры, предполагаю что возможно там присутсвует кирилица. И да, с записью в в память в этой прошивке все в порядке.
    Ну и пока использовал это все без часов, только заказал когда приедут то тогда буду по полной программе пробовать.
    Спасибо Вам за проделанную работу и за интересную конструкцию. Надеюсь что мои замечания помогут Вам улучшить проект. Заранее благодарен за ответ!

    1. Геннадий

      Забыл уточнить, что это все ипытания проводились на Arduino Nano.

    2. Radio9OFG Автор записи

      Добрый день! С набегу могу предположить, что программа ждет ответ от часов, и пока не получит ответ в правильном формате, дальше не двигается. Попробуйте в конфигураторе выставить источник времени GPS, в таком случае на дисплейчике должна быть информация о том, что ожидаются данные от GPS, при использовании OLED вроде писать будет “GPS wait”. Будет время, воспроизведу у себя подобную ситуацию. Недавно, для проверить антенну, доставал свой, на UNO, включился, записал новый позывной свой, проверил, ошибок не обнаружено. По идее в последней прошивке все отработано уже. Возможно из за отсутствия часов… Наличие подключенной si5351 обязательно.
      Если с часами получаться не будет, пишите, разберемся, где и что не так!

      1. Геннадий

        Ок. Понял Вас! Но это уже через недельку…
        Надо по делам уехать. Приеду смоделирую все по Вашим инструкциям, возможно к тому времени и часи подъедут. Догда и отпишусь.
        Возможно Вам не совсем удобно здесь перепысываться то можно переписку перенести в е-мейл?
        Спасибо за ответы!

  2. Геннадий

    Спасибо за ссылку!
    Хочу попробовать на Ардуино Нано это повторить. В принципе контроллер тот же то проблем вроде не должно быть.

    1. Radio9OFG Автор записи

      Доброго времени суток! Проверенно, работает, посмотрите FAQ https://r0aek.me/wspr_beacon_3-faq/ тут постарался все нюансы описать. Там кстати есть и как прошить без замены бутлоадера, а с родным ардуиновским

      1. Геннадий

        Спасибо за ответы! Будем читать и пробовать!!! 🙂

  3. Геннадий

    Добрый день! Подскажите а где можно скачать chip45boot2_atmega328p_uart0_v2.9Q.hex, что-то на указаннм Вами сайте не могу такой найти.

    1. Radio9OFG Автор записи

      Добрый день! Да, поменяли там много. В конце статьи добавил ссылку на загрузку.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *