Введение
Микроконтроллеры AVR имеют возможность самопрограммирования, то есть могут самостоятельно изменять содержимое своей flash памяти. В практическом плане это означает, что, написав для микроконтроллера специальную программу-загрузчик (так называемый бутлоадер), мы можем обновлять его прошивку, не используя программатор. Причем интерфейс, по которому в микроконтроллер будет передаваться код программы, может быть совершенно произвольным. Обычно для этих целей используется один из аппаратно поддерживаемых интерфейсов, например,
SPI, I2C или RS-232. Однако существуют и загрузчики, основанные на программной реализации таких интерфейсов как USB и
1-Wire.
Для микроконтроллеров AVR существует несметное количество готовых бутлоадеров, и в большинстве случае мы можем спокойно использовать их в своих устройствах, не утруждая себя написанием собственного загрузчика. В этой статье мы рассмотрим один из таких бутлоадеров, который разработан и свободно распространяется фирмой Chip45, и разберемся как его использовать.
Загрузчик (bootloader). Теория
Память программ микроконтроллеров AVR разделена на две секции – секцию прикладной программы и секцию загрузочной. Загрузчик (или бутлоадер) – это просто программа, которая хранится в одноименной секции и может осуществлять запись/чтение обоих секций памяти микроконтроллера. Эта особенность позволяет загрузчику модифицировать и даже удалять самого себя! То есть совершать своего рода программный суицид.
Для того чтобы мы могли воспользоваться удобствами загрузчика, его нужно с помощью программатора записать в память микроконтроллера. Область памяти, в которую будет записываться загрузчик, указывается в конфигурационном файле линкера перед компиляцией исходного кода загрузчика. Эта тема выходит за рамки данной статьи и здесь мы ее рассматривать не будет. Для нас важно другое, если у нас есть готовый hex файл загрузчика, нам не нужно ни о чем думать, мы просто прошиваем его в микроконтроллер точно так же, как и самую обычную программу!
Размер секции загрузчика и секции прикладной программы задается с помощью конфигурационных битов BOOTSZ1, BOOTSZ0. Для микроконтроллера ATmega16 размеры секций памяти в зависимости от значений конфигурационных битов будут выглядеть так.
Максимально возможный размер загрузочной секции для ATmega16 составляет 1024 16-ти разрядных слова, что соответствует 2 Кб его flash памяти. Если загрузчик не используется, прикладная программа может занимать весь доступный объем flash памяти микроконтроллера.
Значение конфигурационных битов зависит от требований конкретного загрузчика. Например, для бутлоадера фирмы Chip45 требуется загрузочная секция размером в 1024 слова (2 Кб), но можно написать и более компактный загрузчик. Все зависит от закладываемой в него функциональности и вашего умения кодить.
Допустим, мы записали в микроконтроллер бутлоадер, как им воспользоваться? Чтобы загрузчик заработал, его нужно активировать (запустить). Сделать это можно двумя способами:
- переместить вектор сброса в начало загрузочной секции,
- осуществить переход на начало загрузочной секции.
Реализация первого способа требует установки конфигурационного бита BOOTRST. Все мы знаем, что после подачи питания или события сброса, микроконтроллер начинает выполнять свою программу с нулевого адреса памяти программ, то есть с вектора сброса. По этому адресу, как правило, размещается ассемблерная команда безусловного перехода на прикладную программу. Установка бита BOOTRST переносит вектор сброса микроконтроллера AVR на начало его загрузочной секции (например, на адрес 0x1C00, если наш микроконтроллер ATmega16 и оба бита BOOTSZ1, BOOTSZ0 равны нулю), соответственно при старте он сразу начинает выполнять код загрузчика.
Реализация второго способа подразумевает, что микроконтроллер содержит и загрузчик, и пользовательскую программу, которая будет осуществлять переход в загрузочную область при наступлении какого-нибудь события.
Для реализации такого перехода нужно: создать указатель на функцию, присвоить ему адрес начала загрузочной секции и осуществить вызов функции с помощью этого указателя. Например, так:
//адрес начала загрузочной секции ATmega16
#define BOOT_SECTION 0x1C00
//объявление указателя на функцию
void(*pBootloader)(void) ;
…
//если нажата кнопка, запустить загрузчик
if (Button()){
//инициализация указателя
pBootloader = (void(*)())BOOT_SECTION;
//переход на начало секции загрузчика
pBootloader ();
}
где (void(*)()) – это выражение для приведения типа данных
Когда микроконтроллер переходит в секцию загрузчика, он, если так можно выразиться, “бросает все свои дела”, даже если они не закончены. В некоторых приложениях такое поведение может быть не допустимо (простейший пример – устройство управления нагревательным элементом), поэтому перед запуском загрузчика потребуется привести микроконтроллер или устройство в какое-то нейтральное положение. Помните про это!
Что происходит, когда загрузчик записал в память микроконтроллера прошивку? Он или запускает прикладную программу сам или ожидает какой-то команды от управляющей программы на компьютере. Это уже зависит от реализации конкретного бутлоадера.
И последний момент, если вы по привычке зашьете пользовательскую программу в микроконтроллер с помощью программатора, загрузчик будет удален.
Бутлоадер фирмы Chip45
Перейдем к рассмотрению загрузчика фирмы Chip45. В чем его особенность?
1. Наличие готовых прошивок загрузчика под большую номенклатуру AVR микроконтроллеров, а также микроконтроллеров XMEGA. Не нужно компилировать прошивку самому!
2. Простая и удобная графическая оболочка для работы с загрузчиком, а также наличие ее портов под несколько операционных систем (Windows, Linux, Mac OS X).
3. Простой командный интерфейс для работы через терминальные программы.
4. Использование для обмена данными UART модуля, что позволяет загружать прошивку в микроконтроллер по RS-232 или USB, в случае использования USB-UART преобразователя.
5. Поддержка интерфейса RS-485.
6. Возможность чтения/записи EEPROM памяти.
7. Автоматическая установка скорости обмена UART`a с хостом независимо от тактовой частоты микроконтроллера.
8. Дополнительные возможности по активации загрузчика, путем отправки произвольной строки.
9. Требуемый размер загрузочной секции – 1024 слова (2 Kб flash памяти)
Запись загрузчика в микроконтроллер состоит из следующих шагов:
- устанавливаем размер загрузочной секции равной 1024-м словам,
- устанавливаем конфигурационный бит BOOTRST,
- запрещаем деление тактовой частоты, если есть бит CLKDIV8,
- запрещаем работу сторожевого таймера, если он включен битом WDTON,
- выбираем подходящую под наш микроконтроллер прошивку,
- записываем ее в микроконтроллер с помощью любого программатора.
Основную сложность у новичков здесь может вызвать правильная установка конфигурационных битов. С ними часто происходит путаница, потому что некоторые программаторы воспринимают 1 в конфигурационном бите, как незапрограммированное состояние, 0 – как запрограммированное, а некоторые наоборот. Первый вариант соответствует datasheet`ам микроконтроллеров AVR (смотрите картинку выше).
Единственно, могу вас успокоить - неправильная установка этих битов не заблокирует возможность программирования микроконтроллера обычным программатором.
Программирование микроконтроллера с помощью загрузчика осуществляется так:
- запускаем программу Chip45boot2 GUI (она должна быть установлена),
- устанавливаем нужный COM порт и скорость обмена,
- выбираем hex файл для загрузки в микроконтроллер,
- нажимаем кнопку “Connect to Bootloader”,
- сбрасываем микроконтроллер,
- если в программе загорелся индикатор успешного коннекта, записываем в микроконтроллер прошивку, нажав на кнопку “Program Flash”,
- запускаем приложение, нажав кнопку “Start Application”
Программа Chip45boot2 GUI также позволяет активировать загрузчик путем отправки произвольной строки. Конечно, для этого в микроконтроллере уже должна быть прошивка, поддерживающая такую возможность.
Это может быть удобно, если устройство на микроконтроллере не имеет доступной кнопки сброса, ну, например, оно намертво закрыто в корпусе.
Остальную информацию найдете в техническом описании на этот бутлоадер, хотя большую часть я вам рассказал.
Ссылки
скачать загрузчик (bootloader) для AVR
Comments
Ваш портал меня многому научил. Эта стаття тоже супер.
Смотрите, т.е. я просто подключаю к примеру через ft232rl комп к AVR и спокойно по UART шью? Линии SPI я не использую?
Подскажите-я занимаюсь торговыми автоматами
там есть функция обновления прошивки автомата при помощи карты sd
ВСТАВЛЯЕШЬ ее в разъем появляется надпись загрузка и прошивка аппарата меняется
как я понимаю как раз используется работа с загрузчиком?
Quote: Невнимательно читаете...
этого чтоли...
Тока-что успешно прошил свой девайс на АТМЕГА8. Вот фузы реальные. Внутренняя генерация - 8Мгц. 4800 - скорость конэкта с бутлоадером.
CKSEL0=0
CKSEL1=0
CKSEL2=0
CKSEL3=0
SUT0=0
SUT1=0
BODEN=0
BODLEVEL=0
BOOTRST=0
BOOTSZ0=0
BOOTSZ1=0
EESAVE=0
CKOPT=0
WDTON=0
RSTDISBL=0
А теперь мой вопрос: можно как-то сделать идентификацию, что б в Атмегу только "своя" прошивка заливалась через лоадер, а не любая?
Спасибо!
А исходника к chip45 ни у кого нет?
Я б не дорого купил (баксов 5). 30 евро, как у них на сайте - для меня дорого, для исследовательск их целей.
Спасибо!
CKSEL0=1
CKSEL1=0
CKSEL2=0
CKSEL3=0
SUT0=0
SUT1=1
BODEN=1
BODLEVEL=1
BOOTRST=0
BOOTSZ0=0
BOOTSZ1=0
EESAVE=1
CKOPT=1
WDTON=1
RSTDISBL=1
0 - значит галочка УСТАЕНОВЛЕНА. Это с КОДЕВИЖИН пример.
Цитирую АВТОРА: "Программа Chip45boot2 GUI также позволяет активировать загрузчик путем отправки произвольной строки. Конечно, для этого в микроконтроллер е уже должна быть прошивка, поддерживающая такую возможность. "
КАК получить прошивку поддерживающую ЭТУ возможность.
Опять ж таки нужен исходник.
Я прав?
Chip45boot2 GUI (фьюзы зашиты, Chip45boot2 GUI законнектился с контроллером сразу)контролле р больше не коннктится с Chip45boot2 GUI. Подскажите в чем дело?
Кто нибудь пробовал Chip45boot2 GUI прошивать мк через RS485?
Значит так, делюсь опытом. Попытался я использовать этот лоадер для Atmega328p. При этом для заливки лоадера использовался программатор WizardProg87. Перепробовал несколько версий загрузчика. Ни один HEX файл не пошёл: при попытке открытия файла в программе WizardProg выдавалась ошибка: "Ошибка файла.6". Путём совершенно нетривиальных версий я нашёл ошибку: нужно открыть hex в любом текстовом редакторе и удалить предпоследнюю строчку. Совсем. Как только я это сделал, всё тут же заработало с первого раза. Для информации: использовал внешний кварц на 16 МГц, скорость соединения по COM-порту я выставил 19200. Связь стабильная. Всем удачи!
Code:
.org 0x1C00
array: .db 1,2,3,4
А как подобное на СИ сотворить? Пишу в проге AtmelStudio 6.1
Плата Crumb128-Can V5.1, MK AT90CAN12
Спасибо
Почему после перезаписи загрузчика он соединяется медленнее, не могу сказать. Возможно там использовался другой немного другой загрузчик, изначально работающий с более высокой скоростью обмена.
//адрес начала загрузочной секции ATmega16
#define BOOT_SECTION 0x1C00
//объявление указателя на функцию
void(*pBootload er)(void) ;
…
//если нажата кнопка, запустить загрузчик
if (Button()){
//инициализация указателя
pBootloader = (void(*)())BOOT _SECTION;
//переход на начало секции загрузчика
pBootloader ();
}
USB загрузчик рассматривал вот с этого места http://habrahabr.ru/post/98248/
заработал, но остались определенные вопросы
а если я захочу потом прошивку залить, бутлоадер ведь затрётся?
Затем, если шить прошивку через этот бутлоадер, то он не будет затираться, ведь прошивка (сама программа) ложится в память с нулевого адреса, а сам бутлоудер расположен в памяти "выше", т.е. "над программой". Если же шить с помощью программатора, то он, конечно, затрётся.
но вот вопросик опять у меня возник, например я залил бутлоадер, а так как я его заливал как обычную прошивку то он и ляжет с нулевого адреса, как и обычная прошивка, или в бутлоадере как то забито что он должен лечь не с нулевого адреса, а "выше"?
Good day. I’m Alexey Noskov from Russia use bootloader chip45boot2_atm ega128_uart1_v2 .9Q.hex for ATMEGA128A-AU. Bootloader work whith GUI chip45boot2 v1.13 and program Flash(*.hex), EEPROM(*.eep) generation CVAVR compiler but program in device not work after push buton “Start Application” or restart controler. Bootloader chip45boot2_atm ega128rfa1_uart 1_v2.9Q.hex not connects whith GUI chip45boot2. What me to do?
еще сделал снимки с экрана конфигурации компилятора, установленных FuseBit, и т.д.
ссылка на яндекс диск
https://yadi.sk/d/rFblm3kzqFFgd
помогите разобраться
https://yadi.sk/d/rFblm3kzqFFgd
Code:
void (*Goto_Boot)(void); #define Boot_Address 0x0C00
Code:
//ïðèåì ñèìâîëà ïî usart`ó â áóôåð #pragma vector=USART_RXC_vect __interrupt void usart_rxc_my(void) { usartRxBuf = UDR; if ( usartRxBuf == 'b') { //èíèöèàëèçàöèÿ óêàçàòåëÿ Goto_Boot = (void(*)())Boot_Address; Goto_Boot(); } Resiver(usartRxBuf); }
Выдает в логах chip45boot2:
Trying to connect to bootloader at COM6 with 9600 baud...
Wrong bootloader found: Adres.
Для прошивки микроконтроллер а использовал AVRDUDE с оболочкой.
Поигрался с chip45bootloade r/ все было замечательно.
В какойто момент попробовал переустановить программу - не получилось . не могу программу деинсталировать . Вручную удалил - но переустановить не дает. Как быть кто знает ?
RSS feed for comments to this post