Arduino AVR: binario compilato (.hex) da riga di comando o strumenti grafici

Spread the love

Quando  Arduino  compila i tuoi sketch, produce un file di output chiamato  file esadecimale che è una struttura completa del micro controller con bootloader.

Arduino AVR compiled binary hex with command line and GUI tool
Arduino AVR compiled binary hex with command line and GUI tool

Un processo importante che semplifica la condivisione del firmware (ed è utilizzata dalla maggior parte dei produttori) è quella di generare file binari precompilati con solo la parte dello sketch.

Aggiungi un output dettagliato all’IDE di Arduino

Per comprendere meglio tutto il processo, abiliteremo l’output dettagliato sul nostro IDE Arduino. Puoi trovare queste opzioni su File -> Preferences e controlla Show verbose output.

Arduino IDE enable show verbose ouput
Arduino IDE enable show verbose ouput

Questo ci permette di prendere e riutilizzare i comandi della console.

Genera e carica il file HEX

Un  file HEX  è un  file  sorgente  esadecimale  tipicamente utilizzato da dispositivi logici programmabili, come microcontrollori in telecomandi, macchine per ufficio e sistemi di controllo dei motori delle automobili. Contiene impostazioni, informazioni di configurazione o altri dati salvati in formato esadecimale .

Ora andiamo a compilare lo sketch e a caricarlo dall’IDE, sulla console compaiono molti comandi, ma il più importante per noi è il comando upload.py, che carica l’esadecimale sul microcontrollore.

C:\Program Files (x86)\Arduino\arduino-builder -dump-prefs -logger=machine -hardware C:\Program Files (x86)\Arduino\hardware -hardware C:\Users\renzo\AppData\Local\Arduino15\packages -tools C:\Program Files (x86)\Arduino\tools-builder -tools C:\Program Files (x86)\Arduino\hardware\tools\avr -tools C:\Users\renzo\AppData\Local\Arduino15\packages -built-in-libraries C:\Program Files (x86)\Arduino\libraries -libraries C:\Users\renzo\OneDrive\Documenti\Arduino\libraries -fqbn=arduino:avr:uno -vid-pid=2341_0043 -ide-version=10813 -build-path C:\Users\renzo\AppData\Local\Temp\arduino_build_887351 -warnings=all -build-cache C:\Users\renzo\AppData\Local\Temp\arduino_cache_251846 -prefs=build.warn_data_percentage=75 -prefs=runtime.tools.arduinoOTA.path=C:\Program Files (x86)\Arduino\hardware\tools\avr -prefs=runtime.tools.arduinoOTA-1.3.0.path=C:\Program Files (x86)\Arduino\hardware\tools\avr -prefs=runtime.tools.avrdude.path=C:\Program Files (x86)\Arduino\hardware\tools\avr -prefs=runtime.tools.avrdude-6.3.0-arduino17.path=C:\Program Files (x86)\Arduino\hardware\tools\avr -prefs=runtime.tools.avr-gcc.path=C:\Program Files (x86)\Arduino\hardware\tools\avr -prefs=runtime.tools.avr-gcc-7.3.0-atmel3.6.1-arduino7.path=C:\Program Files (x86)\Arduino\hardware\tools\avr -verbose C:\Program Files (x86)\Arduino\examples\01.Basics\Blink\Blink.ino
C:\Program Files (x86)\Arduino\arduino-builder -compile -logger=machine -hardware C:\Program Files (x86)\Arduino\hardware -hardware C:\Users\renzo\AppData\Local\Arduino15\packages -tools C:\Program Files (x86)\Arduino\tools-builder -tools C:\Program Files (x86)\Arduino\hardware\tools\avr -tools C:\Users\renzo\AppData\Local\Arduino15\packages -built-in-libraries C:\Program Files (x86)\Arduino\libraries -libraries C:\Users\renzo\OneDrive\Documenti\Arduino\libraries -fqbn=arduino:avr:uno -vid-pid=2341_0043 -ide-version=10813 -build-path C:\Users\renzo\AppData\Local\Temp\arduino_build_887351 -warnings=all -build-cache C:\Users\renzo\AppData\Local\Temp\arduino_cache_251846 -prefs=build.warn_data_percentage=75 -prefs=runtime.tools.arduinoOTA.path=C:\Program Files (x86)\Arduino\hardware\tools\avr -prefs=runtime.tools.arduinoOTA-1.3.0.path=C:\Program Files (x86)\Arduino\hardware\tools\avr -prefs=runtime.tools.avrdude.path=C:\Program Files (x86)\Arduino\hardware\tools\avr -prefs=runtime.tools.avrdude-6.3.0-arduino17.path=C:\Program Files (x86)\Arduino\hardware\tools\avr -prefs=runtime.tools.avr-gcc.path=C:\Program Files (x86)\Arduino\hardware\tools\avr -prefs=runtime.tools.avr-gcc-7.3.0-atmel3.6.1-arduino7.path=C:\Program Files (x86)\Arduino\hardware\tools\avr -verbose C:\Program Files (x86)\Arduino\examples\01.Basics\Blink\Blink.ino
Using board 'uno' from platform in folder: C:\Program Files (x86)\Arduino\hardware\arduino\avr
Using core 'arduino' from platform in folder: C:\Program Files (x86)\Arduino\hardware\arduino\avr
Detecting libraries used...
"C:\\Program Files (x86)\\Arduino\\hardware\\tools\\avr/bin/avr-g++" -c -g -Os -w -std=gnu++11 -fpermissive -fno-exceptions -ffunction-sections -fdata-sections -fno-threadsafe-statics -Wno-error=narrowing -flto -w -x c++ -E -CC -mmcu=atmega328p -DF_CPU=16000000L -DARDUINO=10813 -DARDUINO_AVR_UNO -DARDUINO_ARCH_AVR "-IC:\\Program Files (x86)\\Arduino\\hardware\\arduino\\avr\\cores\\arduino" "-IC:\\Program Files (x86)\\Arduino\\hardware\\arduino\\avr\\variants\\standard" "C:\\Users\\renzo\\AppData\\Local\\Temp\\arduino_build_887351\\sketch\\Blink.ino.cpp" -o nul -DARDUINO_LIB_DISCOVERY_PHASE
Generating function prototypes...
"C:\\Program Files (x86)\\Arduino\\hardware\\tools\\avr/bin/avr-g++" -c -g -Os -w -std=gnu++11 -fpermissive -fno-exceptions -ffunction-sections -fdata-sections -fno-threadsafe-statics -Wno-error=narrowing -flto -w -x c++ -E -CC -mmcu=atmega328p -DF_CPU=16000000L -DARDUINO=10813 -DARDUINO_AVR_UNO -DARDUINO_ARCH_AVR "-IC:\\Program Files (x86)\\Arduino\\hardware\\arduino\\avr\\cores\\arduino" "-IC:\\Program Files (x86)\\Arduino\\hardware\\arduino\\avr\\variants\\standard" "C:\\Users\\renzo\\AppData\\Local\\Temp\\arduino_build_887351\\sketch\\Blink.ino.cpp" -o "C:\\Users\\renzo\\AppData\\Local\\Temp\\arduino_build_887351\\preproc\\ctags_target_for_gcc_minus_e.cpp" -DARDUINO_LIB_DISCOVERY_PHASE
"C:\\Program Files (x86)\\Arduino\\tools-builder\\ctags\\5.8-arduino11/ctags" -u --language-force=c++ -f - --c++-kinds=svpf --fields=KSTtzns --line-directives "C:\\Users\\renzo\\AppData\\Local\\Temp\\arduino_build_887351\\preproc\\ctags_target_for_gcc_minus_e.cpp"
Compiling sketch...
"C:\\Program Files (x86)\\Arduino\\hardware\\tools\\avr/bin/avr-g++" -c -g -Os -Wall -Wextra -std=gnu++11 -fpermissive -fno-exceptions -ffunction-sections -fdata-sections -fno-threadsafe-statics -Wno-error=narrowing -MMD -flto -mmcu=atmega328p -DF_CPU=16000000L -DARDUINO=10813 -DARDUINO_AVR_UNO -DARDUINO_ARCH_AVR "-IC:\\Program Files (x86)\\Arduino\\hardware\\arduino\\avr\\cores\\arduino" "-IC:\\Program Files (x86)\\Arduino\\hardware\\arduino\\avr\\variants\\standard" "C:\\Users\\renzo\\AppData\\Local\\Temp\\arduino_build_887351\\sketch\\Blink.ino.cpp" -o "C:\\Users\\renzo\\AppData\\Local\\Temp\\arduino_build_887351\\sketch\\Blink.ino.cpp.o"
Compiling libraries...
Compiling core...
Using precompiled core: C:\Users\renzo\AppData\Local\Temp\arduino_cache_251846\core\core_arduino_avr_uno_0c812875ac70eb4a9b385d8fb077f54c.a
Linking everything together...
"C:\\Program Files (x86)\\Arduino\\hardware\\tools\\avr/bin/avr-gcc" -Wall -Wextra -Os -g -flto -fuse-linker-plugin -Wl,--gc-sections -mmcu=atmega328p -o "C:\\Users\\renzo\\AppData\\Local\\Temp\\arduino_build_887351/Blink.ino.elf" "C:\\Users\\renzo\\AppData\\Local\\Temp\\arduino_build_887351\\sketch\\Blink.ino.cpp.o" "C:\\Users\\renzo\\AppData\\Local\\Temp\\arduino_build_887351/..\\arduino_cache_251846\\core\\core_arduino_avr_uno_0c812875ac70eb4a9b385d8fb077f54c.a" "-LC:\\Users\\renzo\\AppData\\Local\\Temp\\arduino_build_887351" -lm
"C:\\Program Files (x86)\\Arduino\\hardware\\tools\\avr/bin/avr-objcopy" -O ihex -j .eeprom --set-section-flags=.eeprom=alloc,load --no-change-warnings --change-section-lma .eeprom=0 "C:\\Users\\renzo\\AppData\\Local\\Temp\\arduino_build_887351/Blink.ino.elf" "C:\\Users\\renzo\\AppData\\Local\\Temp\\arduino_build_887351/Blink.ino.eep"
"C:\\Program Files (x86)\\Arduino\\hardware\\tools\\avr/bin/avr-objcopy" -O ihex -R .eeprom "C:\\Users\\renzo\\AppData\\Local\\Temp\\arduino_build_887351/Blink.ino.elf" "C:\\Users\\renzo\\AppData\\Local\\Temp\\arduino_build_887351/Blink.ino.hex"
"C:\\Program Files (x86)\\Arduino\\hardware\\tools\\avr/bin/avr-size" -A "C:\\Users\\renzo\\AppData\\Local\\Temp\\arduino_build_887351/Blink.ino.elf"
Sketch uses 924 bytes (2%) of program storage space. Maximum is 32256 bytes.
Global variables use 9 bytes (0%) of dynamic memory, leaving 2039 bytes for local variables. Maximum is 2048 bytes.
C:\Program Files (x86)\Arduino\hardware\tools\avr/bin/avrdude -CC:\Program Files (x86)\Arduino\hardware\tools\avr/etc/avrdude.conf -v -patmega328p -carduino -PCOM5 -b115200 -D -Uflash:w:C:\Users\renzo\AppData\Local\Temp\arduino_build_887351/Blink.ino.hex:i 

avrdude: Version 6.3-20190619
         Copyright (c) 2000-2005 Brian Dean, http://www.bdmicro.com/
         Copyright (c) 2007-2014 Joerg Wunsch

         System wide configuration file is "C:\Program Files (x86)\Arduino\hardware\tools\avr/etc/avrdude.conf"

         Using Port                    : COM5
         Using Programmer              : arduino
         Overriding Baud Rate          : 115200
         AVR Part                      : ATmega328P
         Chip Erase delay              : 9000 us
         PAGEL                         : PD7
         BS2                           : PC2
         RESET disposition             : dedicated
         RETRY pulse                   : SCK
         serial program mode           : yes
         parallel program mode         : yes
         Timeout                       : 200
         StabDelay                     : 100
         CmdexeDelay                   : 25
         SyncLoops                     : 32
         ByteDelay                     : 0
         PollIndex                     : 3
         PollValue                     : 0x53
         Memory Detail                 :

                                  Block Poll               Page                       Polled
           Memory Type Mode Delay Size  Indx Paged  Size   Size #Pages MinW  MaxW   ReadBack
           ----------- ---- ----- ----- ---- ------ ------ ---- ------ ----- ----- ---------
           eeprom        65    20     4    0 no       1024    4      0  3600  3600 0xff 0xff
           flash         65     6   128    0 yes     32768  128    256  4500  4500 0xff 0xff
           lfuse          0     0     0    0 no          1    0      0  4500  4500 0x00 0x00
           hfuse          0     0     0    0 no          1    0      0  4500  4500 0x00 0x00
           efuse          0     0     0    0 no          1    0      0  4500  4500 0x00 0x00
           lock           0     0     0    0 no          1    0      0  4500  4500 0x00 0x00
           calibration    0     0     0    0 no          1    0      0     0     0 0x00 0x00
           signature      0     0     0    0 no          3    0      0     0     0 0x00 0x00

         Programmer Type : Arduino
         Description     : Arduino
         Hardware Version: 3
         Firmware Version: 4.4
         Vtarget         : 0.3 V
         Varef           : 0.3 V
         Oscillator      : 28.800 kHz
         SCK period      : 3.3 us

avrdude: AVR device initialized and ready to accept instructions

Reading | ################################################## | 100% 0.00s

avrdude: Device signature = 0x1e950f (probably m328p)
avrdude: reading input file "C:\Users\renzo\AppData\Local\Temp\arduino_build_887351/Blink.ino.hex"
avrdude: writing flash (924 bytes):

Writing | ################################################## | 100% 0.16s

avrdude: 924 bytes of flash written
avrdude: verifying flash memory against C:\Users\renzo\AppData\Local\Temp\arduino_build_887351/Blink.ino.hex:
avrdude: load data flash data from input file C:\Users\renzo\AppData\Local\Temp\arduino_build_887351/Blink.ino.hex:
avrdude: input file C:\Users\renzo\AppData\Local\Temp\arduino_build_887351/Blink.ino.hex contains 924 bytes
avrdude: reading on-chip flash data:

Reading | ################################################## | 100% 0.13s

avrdude: verifying ...
avrdude: 924 bytes of flash verified

avrdude done.  Thank you.


In questo output puoi trovare la cartella del file HEX

C:\Users\renzo\AppData\Local\Temp\arduino_build_887351/Blink.ino.hex

e puoi rubare il comando per caricare il file HEX

C:\Program Files (x86)\Arduino\hardware\tools\avr/bin/avrdude -CC:\Program Files (x86)\Arduino\hardware\tools\avr/etc/avrdude.conf -v -patmega328p -carduino -PCOM5 -b115200 -D -Uflash:w:C:\Users\renzo\AppData\Local\Temp\arduino_build_887351/Blink.ino.hex:i 

Avrdude

AVRDUDE (AVR Downloader Uploader) è un programma per scaricare e caricare le memorie dei chip dei microcontrollori AVR di Atmel. Può programmare Flash ed EEPROM e, ove supportato dal protocollo di programmazione seriale, può programmare fusibili e bit di blocco. AVRDUDE fornisce anche una modalità di istruzione diretta che consente di inviare qualsiasi istruzione di programmazione al chip AVR indipendentemente dal fatto che AVRDUDE implementi quella caratteristica specifica di un particolare chip. cit. )

Questo è distribuito con l’Arduino IDE ed è lo strumento predefinito per caricare il codice sulla scheda Atmel.

Download

Ma puoi scaricarlo separatamente, per MacOS per Windows e per Linux (con gestore di pacchetti predefinito).

avrdude.conf

Per usare avrdude nel modo più semplice serve un avrdude.conf dove si possono trovare le specifiche di ogni microcontrollore, selezionato con il parametro della chiamata.

  • -patmega328p: seleziona il processore;
  • -carduino: selezionare il programmatore.

Poi abbiamo bisogno di sapere

  • -PCOM5: seleziona la porta del microcontrollore;
  • -b115200: imposta la velocità di caricamento.

Generare file HEX

Naturalmente non è necessario esaminare la console per ottenere questo file, è possibile generarlo facendo clic su Sketch -> Export compiled Binary. Quindi facendo clic su Sketch -> Show Sketch Folder puoi guardare cosa è successo.

esp8266 esp32 Arduino Export compiled binary IDE menu
esp8266 esp32 Arduino Export compiled binary IDE menu

Qui puoi trovare 3 file (qui l’esempio per lo sketch di Blink.ino):

  • Blink.ino.standard.hex
  • Blink.ino.with_bootloader.standard.hex

Come puoi capire il primo è il precompilato senza bootloader (solo sketch con librerie), il secondo il precompilato con bootloader.

Quindi il comando che puoi usare per l’upload è postato in alto.

Flash da riga di comando

Ricordati di scaricare avrdude, ho già pubblicato il link per il download per MacOS per Windows , con Linux puoi usare il gestore di pacchetti.

E per Windows ricordati di spuntare il flag Aggiungi directory a PATH .

WinAVR add directory to path
WinAVR add directory to path

In alternativa puoi aggiungere al percorso l’avrdude del tuo IDE Arduino, puoi prendere il percorso dalla console di output precedente.

C:\Users\renzo>avrdude -v -patmega328p -carduino -PCOM5 -b115200 -D -Uflash:w:D:\tmp\testBlink\Blink\Blink.ino.standard.hex:i

avrdude: Version 5.10, compiled on Jan 19 2010 at 10:45:23
         Copyright (c) 2000-2005 Brian Dean, http://www.bdmicro.com/
         Copyright (c) 2007-2009 Joerg Wunsch

         System wide configuration file is "C:\WinAVR-20100110\bin\avrdude.conf"

         Using Port                    : COM5
         Using Programmer              : arduino
         Overriding Baud Rate          : 115200
         AVR Part                      : ATMEGA328P
         Chip Erase delay              : 9000 us
         PAGEL                         : PD7
         BS2                           : PC2
         RESET disposition             : dedicated
         RETRY pulse                   : SCK
         serial program mode           : yes
         parallel program mode         : yes
         Timeout                       : 200
         StabDelay                     : 100
         CmdexeDelay                   : 25
         SyncLoops                     : 32
         ByteDelay                     : 0
         PollIndex                     : 3
         PollValue                     : 0x53
         Memory Detail                 :

                                  Block Poll               Page                       Polled
           Memory Type Mode Delay Size  Indx Paged  Size   Size #Pages MinW  MaxW   ReadBack
           ----------- ---- ----- ----- ---- ------ ------ ---- ------ ----- ----- ---------
           eeprom        65     5     4    0 no       1024    4      0  3600  3600 0xff 0xff
           flash         65     6   128    0 yes     32768  128    256  4500  4500 0xff 0xff
           lfuse          0     0     0    0 no          1    0      0  4500  4500 0x00 0x00
           hfuse          0     0     0    0 no          1    0      0  4500  4500 0x00 0x00
           efuse          0     0     0    0 no          1    0      0  4500  4500 0x00 0x00
           lock           0     0     0    0 no          1    0      0  4500  4500 0x00 0x00
           calibration    0     0     0    0 no          1    0      0     0     0 0x00 0x00
           signature      0     0     0    0 no          3    0      0     0     0 0x00 0x00

         Programmer Type : Arduino
         Description     : Arduino
         Hardware Version: 3
         Firmware Version: 4.4
         Vtarget         : 0.3 V
         Varef           : 0.3 V
         Oscillator      : 28.800 kHz
         SCK period      : 3.3 us

avrdude: AVR device initialized and ready to accept instructions

Reading | ################################################## | 100% 0.01s

avrdude: Device signature = 0x1e950f
avrdude: safemode: lfuse reads as 0
avrdude: safemode: hfuse reads as 0
avrdude: safemode: efuse reads as 0
avrdude: reading input file "D:\tmp\testBlink\Blink\Blink.ino.standard.hex"
avrdude: writing flash (924 bytes):

Writing | ################################################## | 100% 0.19s

avrdude: 924 bytes of flash written
avrdude: verifying flash memory against D:\tmp\testBlink\Blink\Blink.ino.standard.hex:
avrdude: load data flash data from input file D:\tmp\testBlink\Blink\Blink.ino.standard.hex:
avrdude: input file D:\tmp\testBlink\Blink\Blink.ino.standard.hex contains 924 bytes
avrdude: reading on-chip flash data:

Reading | ################################################## | 100% 0.15s

avrdude: verifying ...
avrdude: 924 bytes of flash verified

avrdude: safemode: lfuse reads as 0
avrdude: safemode: hfuse reads as 0
avrdude: safemode: efuse reads as 0
avrdude: safemode: Fuses OK

avrdude done.  Thank you.

Come spiegato prima, imposteremo il chip, la velocità, la porta e il file, e Avrdude farà il lavoro.

Flash con strumento grafico

Esiste uno strumento grafico molto semplice per Windows per eseguire la stessa operazione, avrdudeGUI e puoi scaricarlo da qui .

È necessario copiare lo stesso parametro nell’interfaccia grafica, il programmatore e la porta:

Arduino UNO avrdudeGUI set programmer and port
Arduino UNO avrdudeGUI set programmer and port

e il chip e il file HEX.

Arduino UNO avrdude gui set device firmware and flash
Arduino UNO avrdude gui set device firmware and flash

Grazie


Spread the love

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *