GNU/Linux >> Znalost Linux >  >> Linux

AVR - Jak naprogramovat čip AVR v Linuxu

Nemám čas na úplné vysvětlení, ale mohu vám poskytnout příkazy ve stylu kuchařky, které používám na svém Linuxovém boxu k programování AVR:

Přípravy

  • V Ubuntu se ujistěte, že je nainstalováno několik požadovaných balíčků:sudo apt-get install avr-libc avrdude binutils-avr gcc-avr srecord volitelně vhoďte gdb-avr simulavr pro ladění a simulaci.
  • Začal jsem vytvářet adresář, ve kterém najdou domov všechny mé projekty ATtiny:mkdir ~/attiny: cd ~/attiny
  • Pro každý projekt vytvořím vyhrazenou podsložku (a nevadí mi dlouhé názvy):mkdir waveShare4digit8segmentDisplay; cd waveShare4digit8segmentDisplay

Vytvořit zdroj

  • Upravte zdrojový soubor pomocí svého oblíbeného textového editoru:vi project.cpp

Nastavení

Níže uvedené příkazy silně spoléhají na proměnné prostředí, aby byla údržba snadná.

  • Základní název použitých/vytvořených souborů:src=project
  • Běžné příznaky kompilátoru:cflags="-g -DF_CPU=${avrFreq} -Wall -Os - Werror -Wextra"

Níže uvedené proměnné může být nutné změnit v závislosti na konkrétním programátoru, který používáte. Viz man stránky pro podrobnosti.

  • baud=19200 Přenosová rychlost, kterou váš programátor komunikuje s PC:
  • programmerDev=/dev/ttyUSB003 Název zařízení, kde se nachází váš programátor. Zkontrolujte dmesg výstup pro podrobnosti.
  • programmerType=avrisp To se může u vašeho přesného programátora lišit.

Níže uvedené proměnné závisí na přesném ovladači, který chcete naprogramovat:

  • avrType=attiny2313 Zkontrolujte avrdude -c $programmerType pro podporovaná zařízení.
  • avrFreq=1000000 Výchozí hodiny naleznete v datovém listu ovladače.

Zkompilovat

  • Prvním krokem je vytvoření objektového souboru:avr-gcc ${cflags) -mmcu=${avrType) -Wa,-ahlmns=${src).lst -c -o ${src).o ${src).cpp
  • Druhým krokem je vytvoření souboru ELF:avr-gcc ${cflags) -mmcu=${avrType) -o ${src).elf ${src).o
  • Třetím krokem je vytvoření souboru Intel Hex, toto je soubor, který je ve skutečnosti odeslán programátorovi:avr-objcopy -j .text -j .data -O ihex ${src).elf ${src).flash.hex

Programování

  • Posledním krokem je naprogramování zařízení:avrdude -p${avrType} -c${programmerType} -P${programmerDev} -b${baud} -v -U flash:w:${src}.flash.hex

Makefile

Jako alternativu k zapamatování příkazů jsem si uvařil makefile podle mého osobního vkusu, můžete si jej uložit pod názvem Makefile (pamatujte na velké M ). Funguje následovně:

  • make makefile Upravte soubor makefile;
  • make edit Upravte zdrojový soubor;
  • make flash Naprogramujte flash paměť zařízení;
  • make help Seznam dalších příkazů.

Zde je makefile:

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

Může se zdát nezbytné spustit avrdude jako root , pokud k tomu dojde, odůvodní otázku sám o sobě . Lze to vyřešit pomocí udev ale vyžaduje trochu specifické informace o tom, jak je programátor rozpoznán operačním systémem.

Ahoj světe

Dovolte mi hodit 'Hello World', které způsobí, že kolík 2 ovladače (PB3) (např. ATtiny13, ATtiny45, ATtiny85) přepíná na 1Hz. Připojte LED a sériový odpor ke kolíku a LED by měla začít blikat.

  • provést úpravy

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

  • vytvořit flash

Hotovo.


Nástroje AVR GNU můžete použít jako samostatné balíčky v linuxu. Patří mezi ně avr-gcc, avr-binutils a avr-libc. To je to, co se nazývá toolchain.

Jakmile vytvoříte hex soubor a budete jej chtít flashovat na svůj čip, můžete použít avrdude.

Všechny jsou volně a snadno dostupné na Linuxu a není příliš obtížné je nakonfigurovat, aby spolupracovaly.

LadyAda má solidní krok za krokem návod na celý proces.


Linux
  1. Jak nainstalovat Python na Linux

  2. Jak programovat soubory stromu zařízení Linux .dts?

  3. Jak získat ID vlákna pthread v programu linux c?

  1. Jak používat BusyBox na Linuxu

  2. Jak používám cron v Linuxu

  3. Jak restartovat (nebo resetovat) běžící proces v Linuxu?

  1. Jak vytvářet vlákna v Linuxu (pomocí ukázkového programu C)

  2. Jak spravovat spouštěcí programy na Ubuntu Linux

  3. Jak nastavit ID procesu v Linuxu pro konkrétní program