AVR - Cách lập trình chip AVR trong Linux


22

Gần đây tôi có một lập trình viên AVRISmkII, và tôi có ATtiny85 và ATmega328. Tôi đã tự hỏi làm thế nào tôi có thể lập trình các chip này (với lập trình viên) nhưng khi tôi thử tải Atmel Studio 6 thì nó chỉ dành cho Windows. Có cách nào tôi có thể sử dụng trong Linux (cụ thể là Ubuntu) không? Kiến đề nghị? Cảm ơn!

Câu trả lời:


36

Tôi không có thời gian để giải thích đầy đủ, nhưng tôi có thể cung cấp cho bạn các kiểu lệnh trong sách nấu ăn mà tôi sử dụng trên hộp Linux của mình để lập trình các AVR:

Chuẩn bị

  • Trên Ubuntu, đảm bảo một số gói yêu cầu được cài đặt: sudo apt-get install avr-libc avrdude binutils-avr gcc-avr srecordtùy chọn đưa vào gdb-avr simulavrđể gỡ lỗi và mô phỏng.
  • Tôi bắt đầu tạo một thư mục trong đó tất cả các dự án ATtiny của tôi tìm thấy một ngôi nhà: mkdir ~/attiny: cd ~/attiny
  • Đối với mỗi dự án, tôi tạo một thư mục con chuyên dụng (và tôi không nhớ tên dài): mkdir waveShare4digit8segmentDisplay; cd waveShare4digit8segmentDisplay

Tạo nguồn

  • Chỉnh sửa tệp nguồn bằng trình soạn thảo văn bản yêu thích của bạn: vi project.cpp

Cài đặt

Các lệnh dưới đây phụ thuộc rất nhiều vào các biến môi trường, để giữ cho việc bảo trì dễ dàng.

  • Tên cơ sở của các tệp được sử dụng / tạo: src=project
  • Cờ trình biên dịch phổ biến: cflags="-g -DF_CPU=${avrFreq} -Wall -Os - Werror -Wextra"

Các biến dưới đây có thể cần phải thay đổi tùy thuộc vào lập trình viên chính xác mà bạn sử dụng. Tham khảo các mantrang để biết chi tiết.

  • baud=19200 Baudrate lập trình viên của bạn giao tiếp với PC:
  • programmerDev=/dev/ttyUSB003Tên thiết bị nơi lập trình viên của bạn được đặt. Kiểm tra dmesgđầu ra để biết chi tiết.
  • programmerType=avrisp Điều này có thể khác nhau cho lập trình viên chính xác của bạn.

Các biến dưới đây phụ thuộc vào bộ điều khiển chính xác mà bạn muốn lập trình:

  • avrType=attiny2313Kiểm tra avrdude -c $programmerTypecác thiết bị được hỗ trợ.
  • avrFreq=1000000 Kiểm tra bảng dữ liệu của bộ điều khiển cho đồng hồ mặc định.

Biên dịch

  • Bước đầu tiên là tạo một tệp đối tượng: avr-gcc ${cflags) -mmcu=${avrType) -Wa,-ahlmns=${src).lst -c -o ${src).o ${src).cpp
  • Bước thứ hai là tạo tệp ELF: avr-gcc ${cflags) -mmcu=${avrType) -o ${src).elf ${src).o
  • Bước thứ ba là tạo tệp Intel Hex, đây là tệp thực sự được gửi cho lập trình viên: avr-objcopy -j .text -j .data -O ihex ${src).elf ${src).flash.hex

Lập trình

  • Bước cuối cùng là lập trình thiết bị: avrdude -p${avrType} -c${programmerType} -P${programmerDev} -b${baud} -v -U flash:w:${src}.flash.hex

Makefile

Để thay thế cho việc ghi nhớ các lệnh, tôi đã tạo ra một tệp thực hiện theo ý thích cá nhân của mình, bạn có thể lưu nó dưới tên Makefile(nhớ thủ đô M). Nó hoạt động như sau:

  • make makefile Chỉnh sửa tệp thực hiện;
  • make edit Chỉnh sửa tập tin nguồn;
  • make flash Lập trình bộ nhớ flash của thiết bị;
  • make help Liệt kê các lệnh khác.

Đây là tệp thực hiện:

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

Nó có thể được dường như cần thiết để chạy avrdudenhư root, nếu điều đó xảy ra nó biện minh cho một câu hỏi trong riêng của mình . Nó có thể được giải quyết với udevnhưng đòi hỏi một chút thông tin cụ thể từ cách lập trình viên được hệ điều hành nhận ra.

Chào thế giới

Hãy để tôi ném vào một 'Thế giới xin chào' làm cho chân điều khiển 2 (PB3) (ví dụ: ATtiny13, ATtiny45, ATtiny85) chuyển đổi với tần số 1Hz. Gắn một đèn LED và điện trở nối tiếp vào pin và đèn LED sẽ bắt đầu nhấp nháy.

  • chỉnh sửa

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

  • làm đèn flash

Làm xong.


2
Hướng dẫn Hello World xác định!
Vorac

11

Bạn có thể sử dụng các công cụ GNU GNU như các gói độc lập trong linux. Chúng bao gồm avr-gcc, avr-binutils và avr-libc. Đây là những gì được gọi là toolchain.

Khi bạn đã tạo một tệp hex và bạn muốn flash nó vào chip của mình, bạn có thể sử dụng avrdude.

Tất cả những thứ này đều miễn phí và có sẵn trên Linux và không quá khó để cấu hình để hoạt động cùng nhau.

LadyAda có một hướng dẫn từng bước vững chắc về toàn bộ quá trình.


0

Để phát triển AVR trong Ubuntu, chỉ có vài bước:

Cài đặt chuỗi công cụ :

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

Tạo một mã thế giới Hello và lưu lại:

#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); 
    }
}

Tải xuống Makefile tempelate và lưu trong cùng thư mục mà bạn đã lưu hello_world.ctệp.

Chỉnh sửa 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

Xây dựng mục tiêu

Chỉ cần gõ makevào giao diện điều khiển và nhấn enter.

Hướng dẫn tải lên vào AVR bằng avrdude

Sử dụng lệnh trong bảng điều khiển như: (giả sử rằng lập trình viên bạn đang sử dụng là usbasp, google hoặc xem hướng dẫn sử dụng cho các tùy chọn khác)

$avrdude -c m16 -p usbasp -U flash:w:hello_world.hex
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.