Завантажувач для avr мікроконтролерів
STM32F030F4P6

Якось длубаючись з STM32 я в черговий раз заливаючи програму за допомогою вбудованого завантажувача, задумався про такою ж цікавою штуці але для AVR. В принципі Arduino це і є AVR зі своїм загрузчиком. Далі блукаючи по всесвітній мережі, я нарвався на два проекти. Один з них це chip45boot2. а другий AVRPROG compatible bootloader. Обидва варіанти безкоштовні і навіть у першого номенклатура підтримуваних мікроконтролерів більше, але. Перший варіант має свою власну програму для зв'язку з МК і навіть підтримує RS-485, але при цьому початкових кодів немає. Другий варіант навпаки має вихідні, але працює тільки з програмою AVRProg яка йде в комплекті з AVR Studio. І звичайно ж остання не підтримує RS-485. Але ж хочеться і те і те. Загалом я вирішив вийти з положення наступним чином. У вихідні завантажувача дописати підтримку RS-485, а щоб не бути прив'язаним до AVRProg просто написати свою программуліна під Win7. Що з цього вийшло.
Почнемо з завантажувача. Можна звичайно завантажити його з офсайта і допив самому, можна скачати у мене исходник і просто внести невеликі поправки, а можна скачати під ATMega8 два HEX файлу і просто залити їх в МК. Який варіант це вирішувати вам.
Варіант з допив прошивки або завантаження готових Хекса розглядати не будемо, а ось варіант з допіліной прошивкою розглянемо докладно. Скачайте проект з ісходником і запустіть в AVRStudio. У мене версія 4.19. Далі в блокноті відкрийте makefile файл. На самому початку потрібно вибрати потрібний МК.

Зокрема у мене це восьма мега. Забіжу вперед, я в своїй програмі використовував підтримку тільки меги 8, 16, 32 і 64. Якщо потрібні інші МК, то вже через AVRProg або пишіть, додам в свою програму. І так, після вибору МК переходимо до основної програми. Все що потрібно налаштувати я підкреслив червоною рискою.

Якщо програма не хоче запускатися, то необхідно встановити Microsoft .NET Framework 4. Завантажити його можна на офіційному сайті Microsoft за цим посиланням.
Качаємо архів і разархивируем його в будь-який зручний місце на диску. Програма просто екзешник і не вимагає ніяких бібліотек. Далі запускаємо програму.

Насамперед необхідно вибрати швидкість і порт. У мене перехідник USB RS-485 сидить на дев'ятому порту. Вибравши швидкість і порт можна підключаться. Рестартуем МК кнопкою ресет і тиснемо на кнопку Старт. Якщо все було зроблено вірно, то програма повинна прийняти такий вигляд.

Кнопка Старт стане неактивною і забарвиться в зелений колір. Це буде означати що програма зв'язалася з завантажувачем в МК. Так само з'явиться інформація про микроконтроллере, його сигнатура, тип і обсяг Flash пам'яті. У самому низу є панель стану в якій так само про дублюється написом Підключений. Наступним дією потрібно вибрати прошивку для МК. Для цього натискаємо на кнопку вибору шляху до завантаження і у вікні вибираємо HEX файл.

Тут є невеликий нюанс. Якщо подивитися на рядок стану внизу програми, то можна побачити размет прошивки в байтах. У мене це 1296 байт. У чому заковика. Справа в тому, що завантажувач не може висіти в повітрі і для нього виділяється пам'ять. Для даного завантажувача виділена пам'ять розмірів 512 сторінок. Цю пам'ять виділяли фьюз BOOTSZ0, BOOTSZ1. А так як слово це два байта, то звідси видно що завантажувачу виділена пам'ять в 1024 байта від основної Flash пам'яті. За хороше життя, потрібно платити)) Звідси випливає наступна проблема. Розмір основної програми не повинен перевищувати розміру Flash мінус 1024 байти. Для восьмий меги це 8Кб - 1Кб = 7Кб або 7168 байт. Тому якщо раптом програма виявиться більше допустимого розміру, а це можливо так як компілятор в душі не чує про якісь там завантажувачі і оперує всією пам'яттю МК, то дана програма перевіривши обсяг HEX файлу не пропустить його для завантаження попередивши про це. Якщо цей захист зняти, то завантажувач заллє програму, але при цьому витре і частково себе. І після вже працювати не буде. Ось що станеться якщо спробувати залити прошивку більшого розміру.

Є три рішення даної проблеми. Перша, оптимізація коду для зменшення його розміру, друга, видалення завантажувача і заливка простим программатором і третя, використовувати МК з більшою пам'яттю. Поїхали далі. Для роботи з Flash пам'яттю у програми є чотири кнопки. Записати, Порівняти, Прочитати, Очистити Flash. Останню пояснювати не треба, вона просто стирає всі дані в Flash за винятком самого завантажувача. Записати ця кнопка записує дані з HEX файлу в Flash. При цьому потрібно запам'ятати, що перед записом програми Flash автоматично очищається і якщо перервати запис, то програму що стерлася, відтворити вже не вийде. Тому якщо поточна прошивка потрібна, то її необхідно спочатку прочитати. Для цього є кнопка Прочитати. Натиснувши на неї, спочатку програма виведе попередження про те що поточна прошивка запишеться в обраний файл. Якщо цього не потрібно, то необхідно заздалегідь створити порожній HEX файл і записати поточну прошивку в нього. Кнопка Порівняти. просто порівнює записану прошивку в МК з даними в обраному на даний момент файлі. При записи перевірка відбувається автоматично. Всі дії програми детально дублюються в рядку стану. А тепер давайте спочатку прочитаємо поточну прошивку, потім очистимо Flash, потім заллємо нову прошивку і порівняємо з HEX файлом. Перед тим як прочитати поточну прошивку ньому необхідно створити порожній HEX файл. Робиться це дуже просто. Відкриваємо блокнот. Далі Файл -> Зберегти як .. У вікні вибираємо Тип файлу: Усі файли. Кодування: UTF-8. а ім'я файлу будь-але з розширенням .hex, у мене flash.hex.

Тепер створивши файл вибираємо його з програми. Відповідно розмір його 0 байт.

Тепер натискаємо кнопку Прочитати і погоджуємося з попередженням.

Читання досить тривалий процес і лякатися цього не треба. Пов'язано це з тим, що програма поняття не має якого розміру прошивка в МК. Тому читання йде всієї пам'яті Flash. Давайте тепер поглянемо що нам записала програма в файл. Відкриваємо в блокноті наш створений раніше HEX файл.

Власне нічого нового. Вичитана прошивка за винятком купи FF. Це якраз та частина Flash в якій нічого немає, але так як ми прочитали всю пам'ять, то і в файл записали цю порожнечу. Так, саме порожнечу, для МК 0xFF це чиста осередок. Тепер давайте запишемо прошивку в МК. Вибираємо потрібну прошивку на диску. У мене це тестова для роботи із зовнішньою EEPROM AT24Cx і тиснемо на кнопку Записати. По закінченню заливки в статусі з'явиться напис Запис виконана.

Все, МК прошитий))) А тепер тиснемо на Порівняння і через деякий час в статусі знову з'явиться напис Порівняння виконано. Це говорить про те що прошивка в МК збігається з даними в HEX файлі.

А тепер про помилки. Якщо при відкритті HEX файлу в будь-якої рядку не співпаде контрольна сума, то програма про це попередить вказавши в який саме рядку сталася ця оказія. Таке можливо якщо випадково при вивченні HEX файлу якийсь символ був видалений. Ну або самі чого вирішили поправити для краси, а про існування контрольної суми не знали. Ось як це виглядає. Я спеціально в файлі, який ми створили і записали в нього прошивку, зіпсував один символ.

Вся справа в тому, що програма не просто Новомосковскет HEX файл, а й ще паралельно перевіряє контрольну суму кожного рядка, щоб уникнути записи в МК битою прошивки. Якщо не збігається прошивка в МК з обраним файлом, то в рядку стану так і буде написано. Пов'язано це з тим, що порівнювати можна ні з поточним файлом, а наприклад є у нас МК і ми думає що в ньому залита саме ось ця прошивка. Підключаємося до завантажувача, довантажувати HEX і просимо порівняти. Програма Новомосковскет прошивку з МК, а потім порівнює з файлом і якщо вони різні, то просто напише про це. А ось якщо виводити в якому рядку що не співпало, то це може бути довгим списком. Ось що буде якщо прошивка не збіглася з файлом.

АНОНІМ 25.02.16 23:34
Для пк писалося в віжуал студії або на С #? А то проблема з framework, поки запустити не виходить.