AVR - วิธีการเขียนโปรแกรมชิป AVR ใน Linux


22

ฉันเพิ่งได้โปรแกรมเมอร์ AVRISmkII AVR และฉันมี ATtiny85 และ ATmega328 ฉันสงสัยว่าฉันจะเขียนโปรแกรมชิปเหล่านี้ได้อย่างไร (กับโปรแกรมเมอร์) แต่เมื่อฉันลองใช้ Atmel Studio 6 มันเป็นเพียงสำหรับ Windows มีวิธีที่ฉันสามารถใช้ใน Linux (เฉพาะ Ubuntu) หรือไม่? ข้อเสนอแนะ Ant? ขอบคุณ!

คำตอบ:


36

ฉันไม่มีเวลาสำหรับคำอธิบายแบบเต็ม แต่ฉันสามารถให้คำสั่งสไตล์ตำราอาหารที่คุณใช้ในกล่อง Linux เพื่อเขียนโปรแกรม AVRs:

การเตรียมการ

  • บน 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 baudrate โปรแกรมเมอร์ของคุณสื่อสารกับด้วย PC:
  • programmerDev=/dev/ttyUSB003ชื่ออุปกรณ์ที่โปรแกรมเมอร์ของคุณตั้งอยู่ ตรวจสอบdmesgเอาต์พุตเพื่อดูรายละเอียด
  • programmerType=avrisp สิ่งนี้อาจแตกต่างกันไปสำหรับโปรแกรมเมอร์ของคุณ

ตัวแปรด้านล่างขึ้นอยู่กับคอนโทรลเลอร์ที่คุณต้องการตั้งโปรแกรม:

  • avrType=attiny2313ตรวจสอบavrdude -c $programmerTypeอุปกรณ์ที่รองรับ
  • avrFreq=1000000 ตรวจสอบแผ่นข้อมูลของคอนโทรลเลอร์สำหรับนาฬิกาเริ่มต้น

รวบรวม

  • ขั้นตอนแรกคือการสร้างวัตถุไฟล์: 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

เพื่อเป็นอีกทางเลือกหนึ่งในการจดจำคำสั่งฉันปรุง makefile ให้เป็นที่ชื่นชอบส่วนตัวของฉันคุณสามารถบันทึกไว้ภายใต้ชื่อMakefile(คำนึงถึงทุนM) มันทำงานได้ดังต่อไปนี้:

  • make makefile แก้ไข makefile
  • make edit แก้ไขไฟล์ต้นฉบับ
  • make flash ตั้งโปรแกรมหน่วยความจำแฟลชของอุปกรณ์
  • make help รายการคำสั่งอื่น ๆ

นี่คือ 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

มันอาจจะดูเหมือนจำเป็นในการทำงานavrdudeเป็นrootถ้าเกิดว่ามันjustifies คำถามในตัวเอง สามารถแก้ไขได้ด้วยudevแต่ต้องใช้ข้อมูลเฉพาะเล็กน้อยจากวิธีการที่โปรแกรมเมอร์รับรู้โดยระบบปฏิบัติการ

สวัสดีชาวโลก

ให้ฉันโยนใน 'Hello World' ที่ทำให้คอนโทรลเลอร์ pin 2 (PB3) (เช่น ATtiny13, ATtiny45, ATtiny85) สลับเป็น 1Hz ต่อ LED และตัวต้านทานแบบอนุกรมเข้ากับพินและไฟ LED จะเริ่มกะพริบ

  • ทำการแก้ไข

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

  • ทำแฟลช

เสร็จสิ้น


2
บทช่วยสอน Hello World ที่ชัดเจน!
Vorac

11

คุณสามารถใช้เครื่องมือ AVR GNU เป็นแพ็คเกจแบบสแตนด์อโลนใน linux เหล่านี้รวมถึง avr-gcc, avr-binutils และ avr-libc นี่คือสิ่งที่เรียกว่า toolchain

เมื่อคุณสร้างไฟล์ hex แล้วและคุณต้องการแฟลชลงบนชิปของคุณคุณสามารถใช้ avrdude

ทั้งหมดนี้มีอยู่บน Linux และพร้อมใช้งานอย่างอิสระและไม่ยากเกินกว่าที่จะกำหนดค่าให้ทำงานร่วมกันได้

LadyAda มีการสอนแบบทีละขั้นตอนในกระบวนการทั้งหมด


0

สำหรับการพัฒนา AVR ใน Ubuntu นั้นมีเพียงไม่กี่ขั้นตอน:

ติดตั้ง Tool-chain :

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

สร้างรหัสโลกสวัสดีและบันทึก:

#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
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.