GNU/Linux >> Belajar Linux >  >> Linux

AVR - Cara memprogram chip AVR di Linux

Saya tidak punya waktu untuk penjelasan lengkap, tapi saya bisa memberi Anda perintah bergaya buku resep yang saya gunakan di kotak Linux saya untuk memprogram AVR:

Persiapan

  • Di Ubuntu, pastikan beberapa paket yang diperlukan telah diinstal:sudo apt-get install avr-libc avrdude binutils-avr gcc-avr srecord secara opsional memasukkan gdb-avr simulavr untuk debug dan simulasi.
  • Saya mulai membuat direktori tempat semua proyek ATtiny saya menemukan rumah:mkdir ~/attiny: cd ~/attiny
  • Untuk setiap proyek, saya membuat subfolder khusus (dan saya tidak keberatan dengan nama panjang):mkdir waveShare4digit8segmentDisplay; cd waveShare4digit8segmentDisplay

Buat sumber

  • Edit file sumber dengan editor teks favorit Anda:vi project.cpp

Pengaturan

Perintah di bawah ini sangat bergantung pada variabel lingkungan, agar pemeliharaan tetap mudah.

  • Nama dasar file yang digunakan/dibuat:src=project
  • Flag compiler umum:cflags="-g -DF_CPU=${avrFreq} -Wall -Os - Werror -Wextra"

Variabel di bawah ini mungkin perlu diubah tergantung pada programmer yang Anda gunakan. Lihat man halaman untuk detail.

  • baud=19200 Baudrate yang digunakan pemrogram Anda untuk berkomunikasi dengan PC:
  • programmerDev=/dev/ttyUSB003 Nama perangkat tempat programmer Anda berada. Periksa dmesg keluaran untuk detail.
  • programmerType=avrisp Ini mungkin berbeda untuk programmer Anda yang sebenarnya.

Variabel di bawah bergantung pada pengontrol persis yang ingin Anda program:

  • avrType=attiny2313 Periksa avrdude -c $programmerType untuk perangkat yang didukung.
  • avrFreq=1000000 Periksa lembar data pengontrol untuk mengetahui jam default.

Kompilasi

  • Langkah pertama adalah membuat file objek:avr-gcc ${cflags) -mmcu=${avrType) -Wa,-ahlmns=${src).lst -c -o ${src).o ${src).cpp
  • Langkah kedua adalah membuat file ELF:avr-gcc ${cflags) -mmcu=${avrType) -o ${src).elf ${src).o
  • Langkah ketiga adalah membuat file Intel Hex, ini adalah file yang sebenarnya dikirim ke programmer:avr-objcopy -j .text -j .data -O ihex ${src).elf ${src).flash.hex

Pemrograman

  • Langkah terakhir adalah memprogram perangkat:avrdude -p${avrType} -c${programmerType} -P${programmerDev} -b${baud} -v -U flash:w:${src}.flash.hex

Makefile

Sebagai alternatif untuk mengingat perintah, saya membuat makefile sesuai keinginan pribadi saya, Anda dapat menyimpannya dengan nama Makefile (perhatikan huruf kapital M ). Cara kerjanya sebagai berikut:

  • make makefile Edit makefile;
  • make edit Edit file sumber;
  • make flash Program memori flash perangkat;
  • make help Cantumkan perintah lain.

Ini makefilenya:

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

Tampaknya perlu untuk menjalankan avrdude sebagai root , jika itu terjadi, itu membenarkan pertanyaan tersendiri . Itu bisa diselesaikan dengan udev tetapi membutuhkan sedikit informasi spesifik tentang bagaimana pemrogram dikenali oleh sistem operasi.

Halo Dunia

Biarkan saya memasukkan 'Hello World' yang membuat pin pengontrol 2 (PB3) (mis. ATtiny13, ATtiny45, ATtiny85) beralih pada 1Hz. Pasang LED dan resistor seri ke pin dan LED akan mulai berkedip.

  • lakukan pengeditan

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

  • buat flash

Selesai.


Anda dapat menggunakan alat AVR GNU sebagai paket mandiri di linux. Ini termasuk avr-gcc, avr-binutils, dan avr-libc. Inilah yang disebut sebagai toolchain.

Setelah Anda membuat file hex dan Anda ingin mem-flash-nya ke chip Anda, Anda dapat menggunakan avrdude.

Semua ini tersedia secara bebas dan tersedia di Linux dan tidak terlalu sulit dikonfigurasi untuk bekerja sama.

LadyAda memiliki tutorial langkah demi langkah yang solid tentang keseluruhan proses.


Linux
  1. Cara Membuat Thread di Linux (Dengan Program Contoh C)

  2. Bagaimana memprogram file pohon perangkat Linux .dts?

  3. Cara mengatur ID proses di Linux untuk program tertentu

  1. Cara menggunakan BusyBox di Linux

  2. Bagaimana saya menggunakan cron di Linux

  3. Bagaimana cara mendapatkan id utas dari pthread di program linux c?

  1. Cara menginstal Python di Linux

  2. Bagaimana Cara Memulai Ulang (atau Mengatur Ulang) Proses yang Berjalan Di Linux?

  3. Cara mengelola program startup di Ubuntu Linux