Arduino – Firmware I/O met AVRdude
In dit voorbeeld laten we zien hoe je de Arduino code vanaf een arduino kan halen en op een ander arduino board kan zetten met behulp van AVRdude, je kan dus bijvoorbeeld een code van een arduino UNO ook 1-op-1 overzetten op een Arduino NANO.
Hoe werkt het eigenlijk?
De C++ code die je programmeert in de Arduino IDE wordt bij het uploaden van de code naar de Arduino omgezet naar Assembler (via avr-gcc) en daarna omgezet naar een HEX bestand en dan geupload (via avrdude) naar de Arduino.
Meer informatie hierover is te vinden hier.
Je kan dus ook de code via AVRdude van de arduino afhalen en naar een (HEX) bestand wegschrijven.
Wat heb je nodig?
1) AVRdude
Firmware van de arduino afhalen:
Maak een folder aan /var/arduino, commando: sudo mkdir /var/arduino
Voorbeeld van een Arduino UNO op /dev/ttyACM0:
sudo avrdude -v -c arduino -p ATMEGA328P -P /dev/ttyACM0 -U flash:r:/var/arduino/blink.hex:i
Toelichting:
-v = uitgebreide informatie
-c = geselecteerde programmer
-P = connectiepoort ttyACM* of ttyUSB*
-U = flash=geheugentype:[r=read/w=write/v=verifieer]:bestandsnaam:i=intel HEX formaat
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 |
avrdude: Version 5.11.1, compiled on May 23 2012 at 11:08:25 Copyright (c) 2000-2005 Brian Dean, http://www.bdmicro.com/ Copyright (c) 2007-2009 Joerg Wunsch System wide configuration file is "/etc/avrdude.conf" User configuration file is "/root/.avrduderc" User configuration file does not exist or is not a regular file, skipping Using Port : /dev/ttyACM0 Using Programmer : arduino 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 avrdude: safemode: lfuse reads as 0 avrdude: safemode: hfuse reads as 0 avrdude: safemode: efuse reads as 0 avrdude: reading flash memory: Reading | ################################################## | 100% 4.95s avrdude: writing output file "/var/arduino/backup.hex" 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. |
Dat was het, er is nu een bestandje aangemaakt, je kan de inhoud van het bestand bekijken met het commando: cat /var/arduino/blink.hex
Firmware naar de arduino schrijven:
Voorbeeld van een Arduino UNO op /dev/ttyACM0:
sudo avrdude -v -c arduino -p ATMEGA328P -P /dev/ttyACM0 -U flash:w:/var/arduino/blink.hex
Toelichting:
-v = uitgebreide informatie
-c = geselecteerde programmer
-P = connectiepoort ttyACM* of ttyUSB*
-U = flash=geheugentype:[r=read/w=write/v=verifieer]:bestandsnaam:i=intel HEX formaat
Arduino UNO voorbeeld:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 |
avrdude: Version 5.11.1, compiled on May 23 2012 at 11:08:25 Copyright (c) 2000-2005 Brian Dean, http://www.bdmicro.com/ Copyright (c) 2007-2009 Joerg Wunsch System wide configuration file is "/etc/avrdude.conf" User configuration file is "/root/.avrduderc" User configuration file does not exist or is not a regular file, skipping Using Port : /dev/ttyACM0 Using Programmer : arduino 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: 3.3 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: NOTE: FLASH memory has been specified, an erase cycle will be performed To disable this feature, specify the -D option. avrdude: erasing chip avrdude: reading input file "/var/arduino/backup.hex" avrdude: input file /var/arduino/backup.hex auto detected as Intel Hex avrdude: writing flash (32768 bytes): Writing | ################################################## | 100% 0.92s avrdude: 32768 bytes of flash written avrdude: verifying flash memory against /var/arduino/backup.hex: avrdude: load data flash data from input file /var/arduino/backup.hex: avrdude: input file /var/arduino/backup.hex auto detected as Intel Hex avrdude: input file /var/arduino/backup.hex contains 32768 bytes avrdude: reading on-chip flash data: Reading | ################################################## | 100% 4.97s avrdude: verifying ... avrdude: verification error, first mismatch at byte 0x1080 0xff != 0x54 avrdude: verification error; content mismatch 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. |
Nu staat het “blink” programma er weer op!
Voor de Arduino NANO moet je de juiste baudrate opgeven -b 57600 en om te schrijven de -F parameter opgeven, anders werkt het niet!, hier volgt een samenvatting (voorbeelden):
Arduino MEGA voorbeeld:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 |
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:\Arduino\hardware\tools\avr\bin\avrdude.conf" Using Port : COM7 Using Programmer : wiring Overriding Baud Rate : 115200 AVR Part : ATmega2560 Chip Erase delay : 9000 us PAGEL : PD7 BS2 : PA0 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 10 8 0 no 4096 8 0 9000 9000 0x00 0x00 flash 65 10 256 0 yes 262144 256 1024 4500 4500 0x00 0x00 lfuse 0 0 0 0 no 1 0 0 9000 9000 0x00 0x00 hfuse 0 0 0 0 no 1 0 0 9000 9000 0x00 0x00 efuse 0 0 0 0 no 1 0 0 9000 9000 0x00 0x00 lock 0 0 0 0 no 1 0 0 9000 9000 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 : Wiring Description : Wiring Programmer Model: AVRISP Hardware Version: 15 Firmware Version Master : 2.10 Vtarget : 0.0 V SCK period : 0.1 us avrdude: AVR device initialized and ready to accept instructions Reading | ################################################## | 100% 0.02s avrdude: Device signature = 0x1e9801 (probably m2560) avrdude: safemode: lfuse reads as FF avrdude: safemode: hfuse reads as D8 avrdude: safemode: efuse reads as FF avrdude: reading flash memory: Reading | ################################################## | 100% 30.00s avrdude: writing output file "blink2.hex" avrdude: safemode: lfuse reads as FF avrdude: safemode: hfuse reads as D8 avrdude: safemode: efuse reads as FF avrdude: safemode: Fuses OK (E:FF, H:D8, L:FF) avrdude done. Thank you. |
Linux
Arduino UNO R3 (hardware version 3 / firmware version 3.3):
FIRMWARE > BESTAND:
sudo avrdude -v -c arduino -p ATMEGA328P -P /dev/ttyACM0 -U flash:r:/var/arduino/blink.hex:i
BESTAND > FIRMWARE:
sudo avrdude -v -c arduino -p ATMEGA328P -P /dev/ttyACM0 -U flash:w:/var/arduino/blink.hex
Arduino UNO (funduino) (hardware version 3 / firmware version 4.4):
FIRMWARE > BESTAND:
sudo avrdude -v -c arduino -p ATMEGA328P -P /dev/ttyACM0 -U flash:r:/var/arduino/blink.hex:i
BESTAND > FIRMWARE:
sudo avrdude -v -c arduino -p ATMEGA328P -P /dev/ttyACM0 -U flash:w:/var/arduino/blink.hex
Arduino NANO v3.0 (hardware version 2 / firmware version 1.16)
FIRMWARE > BESTAND:
sudo avrdude -v -c arduino -p ATMEGA328P -P /dev/ttyUSB0 -b 57600 -U flash:r:/var/arduino/blink.hex:i
BESTAND > FIRMWARE:
sudo avrdude -F -v -c arduino -p ATMEGA328P -P /dev/ttyUSB0 -b 57600 -U flash:w:/var/arduino/blink.hex
Windows
FIRMWARE > BESTAND:
avrdude -v -c arduino -p ATMEGA328P -P COM12 -U flash:r:c:\blink.hex:i
BESTAND > FIRMWARE:
avrdude -v -c arduino -p ATMEGA328P -P COM12 -U flash:w:c:\blink.hex
Arduino UNO
FIRMWARE > BESTAND:
avrdude -v -c arduino -p ATMEGA328P -P COM12 -U flash:r:c:\blink.hex:i
BESTAND > FIRMWARE:
avrdude -v -c arduino -p ATMEGA328P -P COM12 -U flash:w:c:\blink.hex
Arduino NANO v3.0
FIRMWARE > BESTAND:
avrdude -v -c arduino -p ATMEGA328P -P COM12 -b 57600 -U flash:r:c:\blink.hex:i
BESTAND > FIRMWARE:
avrdude -F -v -c arduino -p ATMEGA328P -P COM12 -b 57600 -U flash:w:c:\blink.hex
Arduino MEGA 2650
FIRMWARE > BESTAND:
avrdude -v -c wiring -p ATMEGA2560 -P COM12 -b 115200 -U flash:r:c:\blink.hex:i
BESTAND > FIRMWARE:
avrdude -F -v -c wiring -p ATMEGA2560 -P COM12 -b 115200 -D -U flash:w:c:\blink.hex
Bestandsgrootte
Arduino UNO NANO HEX bestandsgrootte: 78626 bytes.
Arduino UNO HEX bestandsgrootte: 78861 bytes.
Bij problemen
Mocht je een stk500_recv() error krijgen bij het uploaden, dan kan de bootloader roet in het eten gooien, je kan met een andere Aruduino UNO de bootloader terug zetten volgens deze handleiding.
Ps. je kan voor Arduino UNO deze -c commando’s gebruiken, het maakt niet uit welke: “-c avrisp” “-c arduino”, “-c stk500v1”