Caricare bootloader e firmware su ATMEGA32A
Come accennato nell’articolo riguardante l’installazione di un bootloader per l’aggiornamento di un microcontrollore mi cimenterò nella suddetta operazione al fine di disporre di bootloader su un ATMEGA32A acquistato in versione completamente blank ossia privo di qualsiasi software pre installato.
Il microcontrollore da dotare di bootloader è l’ATMEGA32A-PU (trovate qui tutti i dettagli): un microcontrollore disponibile in diversi package (40 pin pdip nel mio caso) piuttosto noto ed usato in diverso ambiti tra i quali controller per tastiere meccaniche/custom.
Questa operazione richiede tipicamente l’uso di un programmatore ovvero di apposito dispositivo atto all’aggiornamento del firmware del microcontrollore. Per i microcontrollori della famiglia ATmel AVR di ATmel / Microchip si utilizza in genere USBASP (come questo o questo) quindi un dispositivo facilmente reperibile e poco costoso. In rete si trovano anche dei video tutorial (come questo) che mostrano tutte le operazioni da effettuare.
Documentandomi ho però scoperto che è possibile effettuare questa operazione anche senza acquistare un programmatore ma utilizzando semplicemente Arduino UNO R3 e pochi componenti elettronici aggiuntivi. In sostanza è possibile impostare Arduino in modalità ISP ovvero trasformarlo in un programmatore per microcontrollori della serie AVR. In rete sono disponibili diversi tutorial che parlano di questo argomento (questo uno dei più famosi) ma sembra sia possibile anche effettuare l’operazione usando solamente Arduino e nessun altro componente esterno! Questo mi ha incuriosito molto ed è poco documentato : nei forum viene blandamente descritto come fattibile e tanto è bastato per destare la mia curiosità.
Disclaimer
ATTENZIONE! Le operazione descritte in seguito vengono effettuate sotto vostra, e solo vostra, specifica responsabilità! Quindi, se danneggiate qualcosa o vi esplode la casa non ritenetemi responsabile di nulla. Scherzi a parte: le operazioni non sono dannose per nessuno dei componenti usati se fatte con precisione. Mi raccomando attenzione nell’usare l’esatta tipologia di materiale descritto. Nel dubbio meglio controllare i collegamenti più una volta in più.
Materiale richiesto
- – Arduino UNO R3 o compatibile
- – ATMEGA32A in una delle sue molteplici varianti (PU, PN). Se trovate la versione base (ATMEGA32) ricordate che supporta solo i 5V
- – breadboard e cavetti per le connessioni. Consiglio l’acquisto di kit completi.
- – Arduino IDE V2.0.3
Impostare Arduino in modalità ISP
La prima operazione consiste nell’impostare Arduino in modalità ISP in modo da predisporlo per l’utilizzo come interfaccia di programmazione:
- Collegare Arduino al PC
- Attivare Arduino IDE e verificare dal menu Tools > Board che la scheda impostata sia Arduino UNO.
- Da Tools > Port verificare che sia settata una porta di comunicazione : questa parte dipende dal sistema operativo, in genere viene identificata automaticamente e proposta quindi basta selezionarla.
- Da File > Examples caricare lo sketch ArduinoISP e trasferirlo ad Arduino col tasto Upload
ultimata l’operazione si può disconnettere Arduino dal PC e chiudere l’IDE.
Predisporre Arduino IDE per l’utilizzo con ATMEGA32A
Lo scopo dell’operazione è rendere visibile ATMEGA32A come scheda utilizzabile in Arduino IDE v.2.0.3. Per fare questo si può utilizzare il core esterno MightyCore che comprende buona parte dei microcontrollori della famiglia ATMEGA. Da File > Preferences cliccare sul tasto alla fine di Additional Boards Manager URLs ed aggiungere
https://mcudude.github.io/MightyCore/package_MCUdude_MightyCore_index.json
poi da Tools > Board > Boards manager… cercare ed installare il pacchetto MightyCore. Completata l’operazione nel menu Tools > Board dovrebbe comparire il sotto menu MightyCore con l’ATMEGA32.
Collegare Arduino con ATMEGA32A
Le connessioni tra Arduino e l’ATMEGA32A sono le seguenti:
- – pin 10 e 30 di ATMEGA32A a 5V di Arduino
- – pin 11 e 31 di ATMEGA32A a GND di Arduino
- – pin 6 (MOSI) di ATMEGA32A al pin 11 di Arduino
- – pin 7 (MISO) di ATMEGA32A al pin 12 di Arduino
- – pin 8 (SCK) di ATMEGA32A al pin 13 di Arduino
- – pin 9 (RESET) di ATMEGA32A al pin 10 di Arduino

Caricare il bootloader su ATMEGA32A
Collegare Arduino al PC con l’apposito caso. Dal menu Tools > Port selezionate la porta che vi viene proposta. Da menu Tools > Board > MightyCore selezionare ATMEGA32. Impostate Tools > Programmer a “Arduino as ISP”. Impostate Tools > Clock a Internal 1 Mhz ed infine fate partire l’upload da Tools > Burn Bootloader. Se tutto va come deve nella console di Output di Arduino Ide dovrebbe comparire quanto segue:
avrdude: Version 7.1-arduino.1
Copyright the AVRDUDE authors;
see https://github.com/avrdudes/avrdude/blob/main/AUTHORS
System wide configuration file is /home/pinguino/.arduino15/packages/MightyCore/hardware/avr/2.2.1/avrdude.conf
User configuration file is /home/pinguino/.avrduderc
User configuration file does not exist or is not a regular file, skipping
Using Port : /dev/ttyACM0
Using Programmer : stk500v1
Overriding Baud Rate : 19200
AVR Part : ATmega32
Chip Erase delay : 9000 us
PAGEL : PD7
BS2 : PA0
RESET disposition : possible i/o
RETRY pulse : SCK
Serial program mode : yes
Parallel program mode : yes
Timeout : 200
StabDelay : 100
CmdexeDelay : 25
SyncLoops : 32
PollIndex : 3
PollValue : 0x53
Memory Detail :
Block Poll Page Polled
Memory Type Alias Mode Delay Size Indx Paged Size Size #Pages MinW MaxW ReadBack
----------- -------- ---- ----- ----- ---- ------ ------ ---- ------ ----- ----- ---------
eeprom 4 10 64 0 no 1024 4 0 9000 9000 0xff 0xff
flash 33 6 64 0 yes 32768 128 256 4500 4500 0xff 0xff
lfuse 0 0 0 0 no 1 1 0 2000 2000 0x00 0x00
hfuse 0 0 0 0 no 1 1 0 2000 2000 0x00 0x00
lock 0 0 0 0 no 1 1 0 2000 2000 0x00 0x00
signature 0 0 0 0 no 3 1 0 0 0 0x00 0x00
calibration 0 0 0 0 no 4 1 0 0 0 0x00 0x00
Programmer Type : STK500
Description : Atmel STK500 version 1.x firmware
Hardware Version: 2
Firmware Version: 1.18
Topcard : Unknown
Vtarget : 0.0 V
Varef : 0.0 V
Oscillator : Off
SCK period : 0.1 us
avrdude: AVR device initialized and ready to accept instructions
avrdude: device signature = 0x1e9502 (probably m32)
avrdude: erasing chip
avrdude: reading input file 0xff for lock
with 1 byte in 1 section within [0, 0]
avrdude: writing 1 byte lock ...
avrdude: 1 byte of lock written
avrdude: verifying lock memory against 0xff
avrdude: 1 byte of lock verified
avrdude do_op() warning: skipping -U efuse:... as memory not defined for part ATmega32
avrdude: reading input file 0b11010110 for hfuse
with 1 byte in 1 section within [0, 0]
avrdude: writing 1 byte hfuse ...
avrdude: 1 byte of hfuse written
avrdude: verifying hfuse memory against 0b11010110
avrdude: 1 byte of hfuse verified
avrdude: reading input file 0b10100001 for lfuse
with 1 byte in 1 section within [0, 0]
avrdude: writing 1 byte lfuse ...
avrdude: 1 byte of lfuse written
avrdude: verifying lfuse memory against 0b10100001
avrdude: 1 byte of lfuse verified
avrdude done. Thank you.
avrdude: Version 7.1-arduino.1
Copyright the AVRDUDE authors;
see https://github.com/avrdudes/avrdude/blob/main/AUTHORS
System wide configuration file is /home/pinguino/.arduino15/packages/MightyCore/hardware/avr/2.2.1/avrdude.conf
User configuration file is /home/pinguino/.avrduderc
User configuration file does not exist or is not a regular file, skipping
Using Port : /dev/ttyACM0
Using Programmer : stk500v1
Overriding Baud Rate : 19200
AVR Part : ATmega32
Chip Erase delay : 9000 us
PAGEL : PD7
BS2 : PA0
RESET disposition : possible i/o
RETRY pulse : SCK
Serial program mode : yes
Parallel program mode : yes
Timeout : 200
StabDelay : 100
CmdexeDelay : 25
SyncLoops : 32
PollIndex : 3
PollValue : 0x53
Memory Detail :
Block Poll Page Polled
Memory Type Alias Mode Delay Size Indx Paged Size Size #Pages MinW MaxW ReadBack
----------- -------- ---- ----- ----- ---- ------ ------ ---- ------ ----- ----- ---------
eeprom 4 10 64 0 no 1024 4 0 9000 9000 0xff 0xff
flash 33 6 64 0 yes 32768 128 256 4500 4500 0xff 0xff
lfuse 0 0 0 0 no 1 1 0 2000 2000 0x00 0x00
hfuse 0 0 0 0 no 1 1 0 2000 2000 0x00 0x00
lock 0 0 0 0 no 1 1 0 2000 2000 0x00 0x00
signature 0 0 0 0 no 3 1 0 0 0 0x00 0x00
calibration 0 0 0 0 no 4 1 0 0 0 0x00 0x00
Programmer Type : STK500
Description : Atmel STK500 version 1.x firmware
Hardware Version: 2
Firmware Version: 1.18
Topcard : Unknown
Vtarget : 0.0 V
Varef : 0.0 V
Oscillator : Off
SCK period : 0.1 us
avrdude: AVR device initialized and ready to accept instructions
avrdude: device signature = 0x1e9502 (probably m32)
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 /home/pinguino/.arduino15/packages/MightyCore/hardware/avr/2.2.1/bootloaders/optiboot_flash/bootloaders/atmega32/1000000L/optiboot_flash_atmega32_UART0_9600_1000000L_B0.hex for flash
with 454 bytes in 2 sections within [0x7e00, 0x7fff]
using 4 pages and 58 pad bytes
avrdude: writing 454 bytes flash ...
Writing | ################################################## | 100% 0.08s
avrdude: 454 bytes of flash written
avrdude: verifying flash memory against /home/pinguino/.arduino15/packages/MightyCore/hardware/avr/2.2.1/bootloaders/optiboot_flash/bootloaders/atmega32/1000000L/optiboot_flash_atmega32_UART0_9600_1000000L_B0.hex
Reading | ################################################## | 100% 0.00s
avrdude: 454 bytes of flash verified
avrdude: reading input file 0xcf for lock
with 1 byte in 1 section within [0, 0]
avrdude: writing 1 byte lock ...
avrdude: 1 byte of lock written
avrdude: verifying lock memory against 0xcf
avrdude: 1 byte of lock verified
avrdude done. Thank you.
Testare il funzionamento
La presenza del bootloader sull’ATMEGA32A implica che è ora possibile aggiornare il firmware tramite l’interfaccia USB predisponendo il dispositivo in modalità DFU. La versione in oggetto non dispone dell’interfaccia USB onboard ma in genere questo controllore viene montato su PCB che ne dispongono (es. una dei tanti kit DIY per tastiere meccaniche/custom come questa ). Non avendo sottomano uno di questi kit e volendo simulare l’operazione è teoricamente possibile dotare di un’interfaccia USB il nostro ATMEGA32A mediante V-USB e quindi usare un semplice FTDI ovvero un’interfaccia seriale USB to UART che potete facilmente procuravi sui vari store (come ad esempio questo). Quest’ultima modalità non è affatto banale da implementare e non è neanche detto che funzioni : potrebbe essere un esperimento interessante su cui scrivere in futuro.