#1 2023-05-20 15:55:16

Honey
Учасник
З Київ
Зареєстрований: 2020-09-26
Повідомлень: 433

Як залити HEX в м/к під Windows. Інструкція.

Файл з розширенням .hex - це вже готова скомпільована прошивка для мікроконтролера, її залишається лише завантажити в флеш-память мікроконтролера і вона одразу почне працювати.

Розберемося, як це зробити під віндою найпростіше, як то кажуть "без SMS і реєстрації".

1. Єдина програма, яка нам для цього знадобиться - avrdude, вона портована під вінду, скачати її можна звідси (x64 - 64бітна версія).

2. Інсталювати нічого не потрібно, архів просто розпаковуєм в якийсь каталог, в ньому знаходиться лише три файли. Для прикладу, я розпакував в C:/Users/honey/Downloads/avrdude

3. Переходим в командний рядок. Натискаєм Win+R, в полі для вводу вводим "cmd" (три літери без лапок) і натискаєм Enter. Відкриється вікно, в якому можна вводити команди, це і є "командний рядок".

4. Потрібно перейти в каталог, в який ми розпакували avrdude в п.2 такою командою (тут і далі команди вводяться в командному рядку і натискається Enter):
cd C:/Users/honey/Downloads/avrdude
Середовище готове, в цей же каталог скачуєм або переносим файли .hex

5. Я розгляну найпростіший варіант з Arduino NANO, яка може прошиватися за допомогою бутлоадера через послідовний порт. При підключенні NANO в порт USB в системі створиться COM-порт (він відповідає USB-UART перетворювачу CH340, який напаяний на платі NANO). Необхідно визначити номер цього COM-порта і швидкість, на якій працює бутлоадер в NANO. Для цього пробуєм виконати команду:
avrdude -P COM3 -b 115200 -c arduino -p m328p -U sig:r:-:h
Замість COM3 пробуєм COM4, COM5, ... Замість 115200 пробуєм 57600. Запамятовуєм варіант, який спрацював.

6. Нарешті прошиваєм нашу прошивку (підставляєм правильний COM-порт і швидкість):
avrdude -P COM3 -b 115200 -c arduino -p m328p -U flash:w:example.hex:i

Неактивний

#2 2023-12-07 00:59:13

Honey
Учасник
З Київ
Зареєстрований: 2020-09-26
Повідомлень: 433

Re: Як залити HEX в м/к під Windows. Інструкція.

7. Якщо прошивка має щось виводити в послідовний порт, то вивід можна переглянути ось таким скриптом (підставляєм COM-порт із п.5 і швидкість, на якій виводить прошивка):
powershell "$p=new-Object System.IO.Ports.SerialPort COM3,9600;$p.Open();while($p.IsOpen){Write-Host -NoNewLine $p.ReadExisting();if([Console]::KeyAvailable){$p.Write([Console]::ReadKey($true).KeyChar)}}"
Вихід з цього режиму по Ctrl+C.

Оскільки не завжди доводиться прошивати лише NANO, тому потрібно розглянути і інший спосіб прошивки AVR мікроконтролерів - через ISP-інтерфейс. На фізичному рівні ISP-інтерфейс це SPI-інтерфейс, в якому сигнал CS підключається до входу RST мікроконтролера. Для цього знадобиться пристрій, який з одного боку підключається до ПК (наприклад по USB), а з іншого має виводи SPI-інтерфейса: CS,SCK,MISO,MOSI. Мікроконтролер, в який будемо заливати прошивку, називають target (ціль), а пристрій-посередник - programmer (програматор). Програматори можуть бути апаратними (наприклад на FT2232), але більшість з них програмні (наприклад USBasp). Я розгляну найбільш універсальний варіант, який відноситься до програмного типу.

Плата Arduino NANO в якості програматора для іншого мікроконтролера

Пункти 1-5 попередньої інструкції залишаються без змін, а далі так:

6. Прошиваєм в NANO прошивку, яка перетворить Arduino NANO в програматор (підставляєм COM-порт і швидкість із п.5):
avrdude -P COM3 -b 115200 -c arduino -p m328p -U flash:w:ArduinoISP.hex:i
Вже скомпільовану прошивку ArduinoISP.hex можна взяти звідси (а ось тут її вихідний код), зберігаєм в той же каталог, що був у п.2, а щоб не додавало додаткове розширення .txt, вибираєм Тип файла: Всі файли (*.*) і в Імені файла видаляєм .txt залишаючи лише .hex
Після використання NANO в якості програматора, в неї потім можна прошити будь-яку іншу прошивку.

7. Підключаємо ціль до програматора за схемою (призначення виводів цільового мікроконтролера можна знайти в його даташиті, а для готових плат в їх схемі):
spi.jpg

8. Нарешті прошиваєм нашу прошивку в ціль (підставляєм COM-порт із п.5 і швидкість 19200):
avrdude -P COM3 -b 19200 -c avrisp -p m328p -U flash:w:example.hex:i
якщо ціль, наприклад, ATtiny13A, тоді відповідно так:
avrdude -P COM3 -b 19200 -c avrisp -p t13a -U flash:w:example.hex:i
Корисні приклади:
а) Прошити в іншу Arduino NANO бутлоадер:
avrdude -P COM3 -b 19200 -c avrisp -p m328p -U flash:w:optiboot_atmega328.hex:i -U lfuse:w:0xff:m -U hfuse:w:0xde:m -U efuse:w:0xfd:m
Вже скомпільовану прошивку бутлоадера можна взяти звідси.
б) Відключити використання бутлоадера:
avrdude -P COM3 -b 19200 -c avrisp -p m328p -U lfuse:w:0xff:m -U hfuse:w:0xdf:m -U efuse:w:0xfd:m
в) Прочитати і змінити ф'юзи на ATtiny13A:
avrdude -P COM3 -b 19200 -c avrisp -p t13a -U lfuse:r:-:h -U hfuse:r:-:h
avrdude -P COM3 -b 19200 -c avrisp -p t13a -U lfuse:w:0x7a:m -U hfuse:w:0xff:m

Значення ф'юзів можна підставити і обчислити нові на калькуляторі ф'юзів.

Розгляну ще один цікавий приклад програматора. Уявіть, що в попередній схемі програматора SPI-інтерфейс є окремою фізичною частиною програматора, якою Arduino NANO може керувати, і цю частину можна розмістити десь далеко. Це могло б, наприклад, спростити процес розробки і відлагодження ПЗ, "не відходячи від ПК".

Віддалена прошивка і віддалений монітор порта

Пункти 1-5 попередньої інструкції залишаються без змін, а далі так:

6. Прошиваєм в NANO прошивку, яка перетворить Arduino NANO в віддалений програматор (підставляєм COM-порт і швидкість із п.5):
avrdude -P COM3 -b 115200 -c arduino -p m328p -U flash:w:ArduinoOWISP.hex:i
Вже скомпільовану прошивку ArduinoOWISP.hex можна взяти звідси (а ось тут її вихідний код).

7. Підключаємо ціль до програматора за схемою:
spi.jpg

7а. Оскільки транспортом для SPI в даному випадку буде 1-wire шина і таких slave-пристроїв на шині може бути багато, то потрібно програматору повідомити адресу slave-пристрою, це можна зробити такими командами (підставляєм COM-порт із п.5):
mode COM3 baud=19200 data=8 parity=n dtr=off rts=off
set /p x="[2044420F" <nul >\\.\COM3
set /p x="484E59A2]" <nul >\\.\COM3

Тут 2044420F484E59A2 - розбита на дві частини адреса slave-пристрою (ціла чомусь не проходить), а ідея, як передати дані, щоб не додавався символ нового рядка, взята звідси.
Є й інший, інтерактивний спосіб. Запускаєм такий скрипт (підставляєм COM-порт із п.5):
powershell "$p=new-Object System.IO.Ports.SerialPort COM3,19200;$p.Open();$p.Write('0 0 ');while($p.IsOpen){Write-Host -NoNewLine $p.ReadExisting();if([Console]::KeyAvailable){$p.Write([Console]::ReadKey($true).KeyChar)}}"
В запущеному скрипті доступні такі команди (повний список з прикладами і поясненнями знаходиться тут):
[2044420F484E59A2] (1-wire адреса в квадратних дужках, Enter не натискаємо) - встановити поточну адресу slave-пристрою;
? (знак питання, Enter не натискаємо) - отримати список адрес доступних slave-пристроїв на шині 1-wire і показати поточну адресу;
Ctrl+C - вихід.

8. Доступні всі ті ж самі команди avrdude, що і в п.8 попередньої інструкції.

9. Якщо прошивка має щось виводити в OWSerial (віртуальний послідовний порт для такого типу підключення), то вивід можна переглянути, запустивши скрипт із п.7а і натиснувши при його роботі Enter.

Остання редакція Honey (2023-12-07 09:05:12)

Неактивний

#3 2024-01-02 19:52:57

Honey
Учасник
З Київ
Зареєстрований: 2020-09-26
Повідомлень: 433

Re: Як залити HEX в м/к під Windows. Інструкція.

josbrod96 пише:

А якщо у мене виникнуть проблеми з драйверами або я не зможу знайти правильний COM-порт, що мені робити? Чи є якісь утиліти, які можуть допомогти мені в цьому?

Ось так за допомогою командного рядка можна отримати список COM-портів, підключених через USB:
powershell "Get-PnPDevice | Where-Object{$_.DeviceID -cmatch '^USB'} | Where-Object{$_.Name -cmatch 'COM\d+'} | Where-Object{$_.Present -in 'True'} | Select-Object Name,Description,Manufacturer,PNPClass,Service,Present,Status,DeviceID | Sort-Object Name"
Приклад виводу:

Name         : USB-SERIAL CH340 (COM4)
Description  : USB-SERIAL CH340
Manufacturer : wch.cn
PNPClass     : Ports
Service      : CH341SER_A64
Present      : True
Status       : OK
DeviceID     : USB\VID_1A86&PID_7523\5&202ECBB1&0&1

Неактивний

#4 2024-02-22 17:09:05

igor211
Учасник
Зареєстрований: 2023-11-20
Повідомлень: 2

Re: Як залити HEX в м/к під Windows. Інструкція.

Добрий день. Скажіть  чи працює avrdude на windows 10?

Неактивний

#5 2024-02-22 17:44:48

Honey
Учасник
З Київ
Зареєстрований: 2020-09-26
Повідомлень: 433

Re: Як залити HEX в м/к під Windows. Інструкція.

igor211 пише:

Добрий день. Скажіть  чи працює avrdude на windows 10?

У мене віндовс 10 і на ній працює. Драйвер USB-UART CH340 версії 3.5.2019.1
Можливо знадобиться такий лайфхак, коли будете використовувати avrdude з ключиком "-c avrisp"

Honey пише:

Конденсатор (між RST і GND, або RST і VCC) чи перемичка (між RST і VCC) використовуються як лайфхак, якщо драйвер USB-UART (CH340) неправильно керує сигналом DTR, в мене в віндовс 10 з цим проблем немає, в лінуксі пробема зникла коли перейшов на ядро 5.4.х (на 4.х ще була така проблема).

Неактивний

Швидке повідомлення

Введіть повідомлення і натисніть Надіслати

Підвал форуму