AVR - Как программировать чип AVR в Linux

22

Недавно я получил программатор AVRISmkII AVR, и у меня есть ATtiny85 и ATmega328. Мне было интересно, как я могу программировать эти чипы (с программистом), но когда я пытаюсь получить Atmel Studio 6, это только для Windows. Есть ли способ, которым я мог бы использовать в Linux (в частности, в Ubuntu)? Муравьиные предложения? Благодарность!

user151324
источник

Ответы:

36

У меня нет времени на полное объяснение, но я могу дать вам в стиле поваренной книги команды, которые я использую на своем компьютере с Linux для программирования AVR:

Препараты

  • В Ubuntu убедитесь, что установлено несколько необходимых пакетов: sudo apt-get install avr-libc avrdude binutils-avr gcc-avr srecordопционально добавьте gdb-avr simulavrдля отладки и симуляции.
  • Я начал создавать каталог, в котором все мои проекты ATtiny находят дом: mkdir ~/attiny: cd ~/attiny
  • Для каждого проекта я создаю отдельную подпапку (и я не против длинных имен): mkdir waveShare4digit8segmentDisplay; cd waveShare4digit8segmentDisplay

Создать источник

  • Отредактируйте исходный файл в вашем любимом текстовом редакторе: vi project.cpp

настройки

Приведенные ниже команды в значительной степени зависят от переменных среды, что упрощает обслуживание.

  • Базовое имя используемых / созданных файлов: src=project
  • Общие флаги компилятора: cflags="-g -DF_CPU=${avrFreq} -Wall -Os - Werror -Wextra"

Переменные ниже могут потребоваться изменить в зависимости от того, какой именно программист вы используете. Обратитесь к manстраницам для деталей.

  • baud=19200 Скорость передачи данных, с которой ваш программист взаимодействует с ПК:
  • programmerDev=/dev/ttyUSB003Имя устройства, где находится ваш программист. Проверьте dmesgвыходные данные для деталей.
  • programmerType=avrisp Это может отличаться для вашего точного программиста.

Переменные ниже зависят от того, какой именно контроллер вы хотите запрограммировать:

  • avrType=attiny2313Проверьте avrdude -c $programmerTypeподдерживаемые устройства.
  • avrFreq=1000000 Проверьте таблицу данных контроллера для часов по умолчанию.

Compile

  • Первый шаг - создать объектный файл: avr-gcc ${cflags) -mmcu=${avrType) -Wa,-ahlmns=${src).lst -c -o ${src).o ${src).cpp
  • Второй шаг - создать файл ELF: avr-gcc ${cflags) -mmcu=${avrType) -o ${src).elf ${src).o
  • Третий шаг - создать файл Intel Hex, это файл, который фактически отправляется программисту: avr-objcopy -j .text -j .data -O ihex ${src).elf ${src).flash.hex

программирование

  • Последний шаг - запрограммировать устройство: avrdude -p${avrType} -c${programmerType} -P${programmerDev} -b${baud} -v -U flash:w:${src}.flash.hex

Makefile

В качестве альтернативы запоминанию команд я приготовил make-файл по своему вкусу, вы можете сохранить его под именем Makefile(обратите внимание на столицу M). Это работает следующим образом:

  • make makefile Отредактируйте make-файл;
  • make edit Редактировать исходный файл;
  • make flash Запрограммируйте флэш-память устройства;
  • make help Список других команд.

Вот make-файл:

baud=19200
src=project
avrType=attiny2313
avrFreq=4000000 # 4MHz for accurate baudrate timing
programmerDev=/dev/ttyUSB003
programmerType=arduino

cflags=-g -DF_CPU=$(avrFreq) -Wall -Os -Werror -Wextra

memoryTypes=calibration eeprom efuse flash fuse hfuse lfuse lock signature application apptable boot prodsig usersig

.PHONY: backup clean disassemble dumpelf edit eeprom elf flash fuses help hex makefile object program

help:
    @echo 'backup       Read all known memory types from controller and write it into a file. Available memory types: $(memoryTypes)'
    @echo 'clean        Delete automatically created files.'
    @echo 'disassemble  Compile source code, then disassemble object file to mnemonics.'
    @echo 'dumpelf      Dump the contents of the .elf file. Useful for information purposes only.'
    @echo 'edit     Edit the .cpp source file.'
    @echo 'eeprom       Extract EEPROM data from .elf file and program the device with it.'
    @echo 'elf      Create $(src).elf'
    @echo 'flash        Program $(src).hex to controller flash memory.'
    @echo 'fuses        Extract FUSES data from .elf file and program the device with it.'
    @echo 'help     Show this text.'
    @echo 'hex      Create all hex files for flash, eeprom and fuses.'
    @echo 'object       Create $(src).o'
    @echo 'program      Do all programming to controller.'

edit:
    vi $(src).cpp

makefile:
    vi Makefile

#all: object elf hex

clean: 
    rm $(src).elf $(src).eeprom.hex $(src).fuses.hex $(src).lfuse.hex $(src).hfuse.hex $(src).efuse.hex $(src).flash.hex $(src).o
    date

object:
    avr-gcc $(cflags) -mmcu=$(avrType) -Wa,-ahlmns=$(src).lst -c -o $(src).o $(src).cpp 

elf: object
    avr-gcc $(cflags) -mmcu=$(avrType) -o $(src).elf $(src).o
    chmod a-x $(src).elf 2>&1

hex:    elf
    avr-objcopy -j .text -j .data -O ihex $(src).elf $(src).flash.hex
    avr-objcopy -j .eeprom --set-section-flags=.eeprom="alloc,load" --change-section-lma .eeprom=0 -O ihex $(src).elf $(src).eeprom.hex
    avr-objcopy -j .fuse -O ihex $(src).elf $(src).fuses.hex --change-section-lma .fuse=0
    srec_cat $(src).fuses.hex -Intel -crop 0x00 0x01 -offset  0x00 -O $(src).lfuse.hex -Intel
    srec_cat $(src).fuses.hex -Intel -crop 0x01 0x02 -offset -0x01 -O $(src).hfuse.hex -Intel
    srec_cat $(src).fuses.hex -Intel -crop 0x02 0x03 -offset -0x02 -O $(src).efuse.hex -Intel

disassemble: elf
    avr-objdump -s -j .fuse $(src).elf
    avr-objdump -C -d $(src).elf 2>&1

eeprom: hex
    #avrdude -p$(avrType) -c$(programmerType) -P$(programmerDev) -b$(baud) -v -U eeprom:w:$(src).eeprom.hex
    date

fuses: hex
    avrdude -p$(avrType) -c$(programmerType) -P$(programmerDev) -b$(baud) -v -U lfuse:w:$(src).lfuse.hex
    #avrdude -p$(avrType) -c$(programmerType) -P$(programmerDev) -b$(baud) -v -U hfuse:w:$(src).hfuse.hex
    #avrdude -p$(avrType) -c$(programmerType) -P$(programmerDev) -b$(baud) -v -U efuse:w:$(src).efuse.hex
    date

dumpelf: elf
    avr-objdump -s -h $(src).elf

program: flash eeprom fuses

flash: hex
    avrdude -p$(avrType) -c$(programmerType) -P$(programmerDev) -b$(baud) -v -U flash:w:$(src).flash.hex
    date

backup:
    @for memory in $(memoryTypes); do \
        avrdude -p $(avrType) -c$(programmerType) -P$(programmerDev) -b$(baud) -v -U $$memory:r:./$(avrType).$$memory.hex:i; \
    done

Может показаться, что необходимо бежать avrdudeтак root, как будто это оправдывает вопрос сам по себе . Это может быть решено с помощью, udevно требует немного конкретной информации о том, как программист распознается операционной системой.

Привет, мир

Позвольте мне добавить «Hello World», который заставляет контакт 2 контроллера (PB3) (например, ATtiny13, ATtiny45, ATtiny85) переключаться на 1 Гц. Подключите светодиод и последовательный резистор к контакту, и светодиод должен начать мигать.

  • сделать редактирование

i

#include <avr/io.h>
#include <util/delay.h>

int main(void)
{
  DDRB = 0x08;

  while (1) {
    PORTB = 0x00; _delay_ms(500);
    PORTB = 0x08; _delay_ms(500);
  }
}

<ESC>:wq

  • сделать вспышку

Выполнено.

jippie
источник
2
Определенный учебник Hello World!
Vorac
11

Вы можете использовать инструменты AVR GNU как автономные пакеты в linux. К ним относятся avr-gcc, avr-binutils и avr-libc. Это то, что называется инструментарием.

После того, как вы создали шестнадцатеричный файл и хотите перенести его на свой чип, вы можете использовать avrdude.

Все они свободно и легко доступны в Linux, и их не сложно настроить для совместной работы.

LadyAda предлагает подробное пошаговое руководство по всему процессу.

NickHalden
источник
0

Для разработки AVR в Ubuntu есть всего несколько шагов:

Установить цепочку инструментов :

sudo apt-get install gcc-avr binutils-avr gdb-avr avr-libc avrdude

Создайте код Hello world и сохраните:

#include<avr/io.h>
#define F_CPU 8000000UL
#include<util/delay.h>
int main() {
    DDRB = 0xff; // make PORTB as O/P   
    PORTB = 0xFF;
    while(1) {
        PORTB |= (1 << 0);               
        _delay_ms(100); 
        PORTB &= ~(1 << 0);     
        _delay_ms(100); 
    }
}

Загрузите Makefile tempelate и сохраните в том же каталоге, где вы сохранили hello_world.cфайл.

Редактировать Makefile :

# MCU name (Specify the MCU you are using)
MCU = atmega16
# Processor frequency.
F_CPU = 8000000
# Target file name (without extension).
#in this case file name is hello_world
TARGET = main

Постройте цель

Просто введите makeв консоли и нажмите Enter.

Загрузите инструкции в AVR, используя avrdude

Используйте команду в консоли как: (предполагается, что программист, которого вы используете, это usbasp, google или посмотрите руководство для других опций)

$avrdude -c m16 -p usbasp -U flash:w:hello_world.hex
mrUnfused
источник