Это краткое руководство для начинающих, которое направлено на то, чтобы показать, как установить инструменты, скомпилировать код с помощью avr-gcc и отправить его в микроконтроллер с помощью avrdude.
Оно также знакомит с основами автоматизации этой задачи, помещая все инструкции в Makefile. Файлы примера ( main.c, main.bin, main.hex, Makefile) упакованы в архив который можно скачать по ссылке в конце данной статьи.

1. Установка avr-gcc и инструментов
Для компиляции исходного кода вашей прошивки на C и/или C ++ вам понадобится компилятор gcc-avr, библиотека C avr-libc и avrdude. Что очень полезно, существуют полные и простые в установке пакеты для всех основных платформ.
Linux, Ubuntu
Ubuntu предоставляет пакеты, поэтому вы можете просто установить их с помощью этой команды:
$ sudo apt-get install gcc-avr avr-libc avrdude
Mac OSX
Загрузите AVR MacPack. В образе диска MacPack есть установщик, который все сделает за вас.
Windows
Загрузите WinAVR, который включает в себя все необходимое и имеет хороший установщик.
2. Компиляция и запись кода

Теперь, когда у вас установлен компилятор, следующий шаг — скомпилировать простой исходный код в файл .BIN, затем сгенерировать файл Intel .HEX и, наконец, записать этот файл .HEX на микросхему AVR с помощью программатора для AVR.
Пример кода
Вот пример содержимого файла main.c. Код ничего не делает, кроме зацикливания в бесконечном цикле, но это для примера.
int main(void) { while (1); }
Компиляция
Приведенная ниже команда скомпилирует ваш код. Это GCC, поэтому я полагаю, что он вам знаком, и никакой дополнительной информации не требуется. Если вы хотите выполнить компиляцию для другого MCU, вам нужно указать соответствующую опцию -mmcu.
avr-gcc -Wall -g -Os -mmcu=attiny13 -o main.bin main.c
После успешной компиляции вы можете проверить размер памяти программы и данных с помощью этой команды:
avr-size -C main.bin
AVR Memory Usage
—————-
Device: Unknown
Program: 40 bytes
(.text + .data + .bootloader)
Data: 0 bytes
(.data + .bss + .noinit)
Создание .HEX
Большинство программаторов не принимают в качестве входного файла исполняемый файл GNU. Поэтому нам нужно проделать некоторую работу.
Итак, следующий шаг — преобразование информационной формы .BIN в файл .HEX. Утилита GNU, которая делает это, называется avr-objcopy.
avr-objcopy -j .text -j .data -O ihex main.bin main.hex
Программирование
Утилита под названием avrdude может программировать микропроцессоры, используя содержимое файлов .HEX, указанных в командной строке.
С помощью приведенной ниже команды файл main.hex будет записан во флэш-память. Параметр -p attiny13 позволяет avrdude узнать, что мы работаем с микроконтроллером ATtiny13. Другими словами — эта опция определяет устройство.
Полный список поддерживаемых чипов можно найти здесь. Обратите внимание, что также допустимо использовать и полные имена (т. е. t13 равно attiny13).
avrdude -p attiny13 -c usbasp -U flash:w:main.hex:i -F -P usb
И вуаля! Чип запрограммирован.
3. Make и makefiles
Теперь мы можем автоматизировать этот процесс, создав Makefile и поместив туда наши команды. Структура Makefile очень проста, и дополнительную информацию о ней можно найти здесь . Утилита make автоматически считывает файл Makefile в папке, в которой вы ее запускаете. Взгляните на готовый пример:
MCU=attiny13 F_CPU=1200000 CC=avr-gcc OBJCOPY=avr-objcopy CFLAGS=-std=c99 -Wall -g -Os -mmcu=${MCU} -DF_CPU=${F_CPU} -I. TARGET=main SRCS=main.c all: ${CC} ${CFLAGS} -o ${TARGET}.bin ${SRCS} ${OBJCOPY} -j .text -j .data -O ihex ${TARGET}.bin ${TARGET}.hex flash: avrdude -p ${MCU} -c usbasp -U flash:w:${TARGET}.hex:i -F -P usb clean: rm -f *.bin *.hex
Если вы запустите в терминале простую команду make , будет выполнена только метка «all». При запуске (sudo) make flash будет выполнена метка «flash» и так далее.
make
avr-gcc -std=c99 -Wall -g -Os -mmcu=attiny13 -DF_CPU=1200000 -I. -o main.bin main.c
avr-objcopy -j .text -j .data -O ihex main.bin main.hex
make flash
avrdude -p attiny13 -c usbasp -U flash:w:main.hex:i -F -P usb
avrdude: warning: cannot set sck period. please check for usbasp firmware update.
avrdude: AVR device initialized and ready to accept instructions
Reading | ################################################## | 100% 0.00s
avrdude: Device signature = 0x1e9007
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: warning: cannot set sck period. please check for usbasp firmware update.
avrdude: reading input file «main.hex»
avrdude: writing flash (40 bytes):
Writing | ################################################## | 100% 0.05s
avrdude: 40 bytes of flash written
avrdude: verifying flash memory against main.hex:
avrdude: load data flash data from input file main.hex:
avrdude: input file main.hex contains 40 bytes
avrdude: reading on-chip flash data:
Reading | ################################################## | 100% 0.03s
avrdude: verifying …
avrdude: 40 bytes of flash verified
avrdude: safemode: Fuses OK (H:FF, E:FF, L:6A)
avrdude done. Thank you.
Резюме
По сути, если предположить, что наша программа находится в main.c , только эти три вещи необходимы для компиляции и записи кода на чип AVR.
- $ avr-gcc -Wall -g -Os -mmcu=attiny13 -o main.bin main.c
- $ avr-objcopy -j .text -j .data -O ihex main.bin main.hex
- $ avrdude -p attiny13 -c usbasp -U flash:w:main.hex:i -F -P usb
Важно подчеркнуть, что мы можем легко автоматизировать весь процесс с помощью Makefiles. Рано или поздно она вам понадобится!
Скачать файлы примера (2,1 KiB, скачано: 65)
