ฉันไม่มีเวลาสำหรับคำอธิบายแบบเต็ม แต่ฉันสามารถให้คำสั่งสไตล์ตำราอาหารที่คุณใช้ในกล่อง 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
เสร็จสิ้น