flash_the_atmega
Differences
This shows you the differences between two versions of the page.
| Next revision | Previous revision | ||
| flash_the_atmega [2013/10/03 15:00] – created breaker27 | flash_the_atmega [2023/03/01 19:40] (current) – [Using flash scripts] breaker27 | ||
|---|---|---|---|
| Line 1: | Line 1: | ||
| - | ===== Get the firmware ===== | + | ====== Get the firmware |
| - | You can either take a pre-built firmware package from [[http:// | + | You can either take a pre-built firmware package from [[http:// |
| - | ===== Build your own firmware | + | ====== Three different storage areas ====== |
| - | Get a copy of the project, if you haven' | + | Every microcontroller has three parts that can be flashed |
| - | Go into the base station firmware directory, build the firmware | + | |
| - | < | + | * Three **fuse bytes** contains microcontroller specific configuration bits. These should only be set once. |
| - | pi@ninjablock ~/ | + | * The **flash memory** contains the firmware. |
| - | avr-gcc -c -gdwarf-2 -DF_CPU=20000000UL -DUART_BAUD_RATE=19200UL -DUART_RX=1UL -Os -mmcu=atmega328 -I. | + | * The **EEPROM memory** contains (firmware) configuration data. It is also written to by the device in normal operation. It can we overwritten about 100.000 times. |
| - | [...] | + | |
| - | avr-objdump -h -S build/ | + | |
| - | avr-nm -n build/ | + | |
| - | Fuses: | + | {{danger.gif}} **In general, it's a good idea to only flash what you need to, because of the limited amount of possible write cycles.** |
| - | LFUSE = 0xF7 | + | |
| - | HFUSE = 0xD1 | + | |
| - | EFUSE = 0x07 | + | |
| - | Image size: | + | ====== Programming fuses ====== |
| - | text data | + | |
| - | | + | ===== Using a make rule ===== |
| - | pi@ninjablock ~/ | + | |
| + | If you build your binaries by yourself with " | ||
| + | |||
| + | < | ||
| + | make program_fuses | ||
| </ | </ | ||
| - | ===== Flashing the controller | + | Be sure about the fuse settings you want to write in your microcontroller. With wrong fuse settings, your microcontroller might not be accessible anymore! |
| + | |||
| + | ===== Calling avrdude directly ===== | ||
| + | |||
| + | If you are creating a new or modified SHC device, you may want to write other than the default fuses. You can do so with: | ||
| + | |||
| + | < | ||
| + | avrdude -p ATMEGA328P -U lfuse: | ||
| + | </ | ||
| + | |||
| + | (replace ?? by the hex value for the needed fuse settings and use " | ||
| + | |||
| + | ===== Strange avrdude error messages ===== | ||
| + | |||
| + | Some fuses only use a part of their bits. If you set such a fuse, avrdude may complain at verification that it read out another value than it wrote. | ||
| + | |||
| + | Writing the EFuse of the ATMega168 or 328 returns a value of only the last 3 bits (upper 5 unused), so a value of xxxxxyyy is read out as 00000yyy. Example: | ||
| + | |||
| + | < | ||
| + | avrdude: verification error, first mismatch at byte 0x0000 | ||
| + | 0xfc != 0x04 | ||
| + | avrdude: verification error; content mismatch | ||
| + | </ | ||
| + | |||
| + | Don't worry. The warning is only returned because avrdude does not know that the upper 5 bits are always 1 (as per spec). | ||
| + | |||
| + | ====== Flashing the firmware / eeprom ====== | ||
| + | |||
| + | ===== Using flash scripts ===== | ||
| + | |||
| + | After setting up avrdude, you can flash the firmware by calling the flash scripts | ||
| + | |||
| + | * **flash.cmd** / **flash.sh** for flashing firmware, eeprom and fuses | ||
| + | * **flash_firmware.cmd** / **flash_firmware.sh** for flashing only the firmware | ||
| + | |||
| + | ===== Using a make rule ===== | ||
| + | |||
| + | If you have the source code on your machine, you can flash the firmware with the following command from the firmware subdirectory: | ||
| + | |||
| + | < | ||
| + | make program | ||
| + | </ | ||
| + | |||
| + | ===== Calling avrdude directly | ||
| + | |||
| + | If you want to call avrdude by hand you can flash everything with: | ||
| < | < | ||
| - | pi@ninjablock ~/ | + | avrdude -p m328p -U flash:w:shc_basestation.hex -U eeprom: |
| </ | </ | ||
| + | (leave one part "-U ..." out to flash only a part). | ||
flash_the_atmega.1380805231.txt.gz · Last modified: 2013/10/04 18:56 (external edit)