WinAVR 의 MFile 로 Makefile 만들기 ( 주 ) 퀀텀베이스, 서울시금천구가산동 233-5, 요업기술원벤처관 305 호 TEL: 02-3282-7739, FAX: 02-3282-7740 Website: www.quantumbase.com, Email: support@quantumbase.com Copyright 2005. by Quantumbase Inc., All rights reserved. 1 WinAVR 통합개발툴옵션설정 사용자가 AVR 프로그램개발툴을이용하여 AVR MCU 프로그램을작성하고 AVR 프로그램다운로드툴을이용하여앞에서작성된 AVR MCU 프로그램을 QB-MCU100 스타터키트에있는 AVR MCU에다운로드하는작업을통해사용자가원하는 AVR MCU를이용한제품개발을수행할수있다. 이때, 앞에서말했듯이 AVR MCU를이용한실습또는제품개발을위해서는 AVR 프로그램개발툴과 AVR 프로그램다운로드툴이필요하게되는데여기서는 AVR 프로그램개발과 AVR 프로그램다운로드를모두수행할수있는 WinAVR 통합개발툴 (20040720 버전 ) 의사용법에대해서설명하고자한다. WinAVR 통합개발툴은 MFile( 컴파일및다운로드옵션설정 ) 및 Programmers Notepad( 소스편집, 컴파일, 다운로드 ) 로구성되어있다. 우선, WinAVR 의 MFile 개발툴을 이용하여 WinAVR 통합개발툴의옵션설정하는법을설명하겠다. 1.1 WinAVR의 MFile 개발툴을이용한컴파일옵션설정이제, WinAVR의 MFile 개발툴을이용하여 C 언어소스를 avr-gcc 개발툴등으로컴파일하기위해필요한 Makefile 이라는매크로파일을작성한다. Makefile을작성하기위해 MFile 개발툴을실행하는데 Windows에서 시작 모든프로그램 WinAVR MFile [WinAVR] 을차례대로선택하면된다. MFile 개발툴이실행된모습을그림 1.1에보여주고있다. 그림 1.1에보이는바와같이 MFile 개발툴의 Makefile 메뉴를선택하면컴파일옵션을설정하는 Code generation 의밑에있는서브메뉴들이보여진다. 첫번째로 Main file name... 메뉴를선택하면 Main file 입력창이나타나는데이창의입력박스에 main 함수가있는 C 언어소스파일이름 ( 예, main) 을입력하고 OK 버튼을누른다. 그러면, MFile 개발툴의편집창안의 TARGET = main 이라는부분에방금입력한내용이입력된다. 이것은 C 언어소스가컴파일되어생성되는프로그램파일의이름이된다. 즉, main.hex 형태의프로그램파일이생성된다. 1 QB-MCU100 Starter Kit
두번째로 MCU type > 메뉴를선택하면 AVR MCU 패밀리서브메뉴가나오는데여기서 ATmega > 메뉴를선택하고다시, AVR MCU 서브메뉴가나오면 atmega162 메뉴를선택하여 QB-MCU100의 AVR MCU와일치시킨다. 그러면, MFile 개발툴의편집창안의 MCU = atmega162 부분의내용이수정되어입력된다. 세번째로 Output format > 메뉴를선택하면프로그램파일형식서브메뉴가나오는데 ihex 메뉴를선택하여 Intel HEX 프로그램파일형식을선택한다. 그러면, MFile 개발툴 의편집창안의 FORMAT = ihex 부분의내용이수정되어입력된다. 네번째로 Optimization level > 메뉴를선택하면컴파일최적화옵션서브메뉴가나오는 데 s 메뉴를선택하여프로그램크기를최적화시는옵션을선택한다. 그러면, MFile 개발 툴의편집창안의 OPT = s 부분의내용이수정되어입력된다. 그림 1.1 MFile 의 Makefile 옵션설정메뉴내용 다섯번째로 Debug format > 메뉴를선택하면디버그정보형식서브메뉴가나오는데 AVR-ext-COFF(AVR Studio 4.07+, VMLAB 3.10+) 메뉴를선택하여컴파일시디버그 2 QB-MCU100 Starter Kit
정보를저장하는형식중에하나인 ext-coff를선택한다. 그러면, MFile 개발툴의편집창안의 DEBUG = stabs 부분과 build: elf hex eep lss sym extcoff 부분의내용이수정되어입력된다. 이것을선택하면디버그정보가포함된 main.cof 프로그램파일이생성되는데이파일을 Atmel사에서제공하는 AVR Studio(4.07 버전이상 ) 개발툴에서읽어서 C 언어소스를보면서디버그가가능한소스레벨디버깅을할수가있다. 1.2 WinAVR의 MFile 개발툴을이용한다운로드옵션설정앞절에서는 MFile 개발툴을이용하여컴파일옵션을설정했고지금부터는앞에서컴파일된프로그램을 ISP(In-System Programming) 방식으로 AVR MCU에다운로드하기위해 avrdude 개발툴을이용하게되는데이때다운로드장비 (stk200, stk500, avrisp 등 ) 와컴퓨터의통신포트 (com1, com2, lpt1, lpt2 등 ) 에따라다른다운로드옵션을설정하게된다. 여기서, stk200은 Kanda사의 STK200 스타터키트에서사용하는다운로드방식, stk500은 Atmel사의 STK500 키트에서사용하는다운로드방식, avrisp는 Atmel사의 AVRISP 장비에서사용하는다운로드방식이다. 또한, com1, com2는각각컴퓨터의직렬포트1, 직렬포트2로서 25핀또는 9핀의커넥터형태이고 lpt1, lpt2는각각컴퓨터의병렬포트1, 병렬포트2로서 25핀의커넥터형태로제공된다. 여기서, 주의할것은 avrdude 개발툴을사용하기위해서는 giveio.sys 드라이버파일을설치해야하는데 install_giveio.bat 배치실행파일을실행하면 giveio.sys 드라이버파일이설치되고 remove_giveio.bat 배치실행파일을실행하면 giveio.sys 드라이버파일이제거된다. 또한, status_giveio.bat 배치실행파일을실행하면 giveio.sys 드라이버상태를볼수있다. 이러한파일들은 WinAVR에설치된폴더아래의 bin 폴더 ( 보통 WinAVR bin ) 에있다. 앞의그림 1.1에보이는바와같이 MFile 개발툴의 Makefile 메뉴를선택하고 AVRdude 밑에있는서브메뉴중에 Programmer > 메뉴를선택하면다운로드장비서브메뉴가나오는데 stk200 메뉴를선택하여 Kanda사의 stk200 다운로드방식을선택한다. 그러면, MFile 개발툴의편집창안의 AVRDUDE_PROGRAMMER = stk200 부분의내용이수정되어입력된다. 다음으로 Port > 메뉴를선택하면통신포트서브메뉴가나오는데 lpt1 메뉴를선택하 여컴퓨터의병렬포트 1 을선택한다. 그러면, MFile 개발툴의편집창안의 AVRDUDE_PORT = lpt1 부분의내용이수정되어입력된다. 지금까지 WinAVR 의 MFile 개발툴에서설정한컴파일및다운로드옵션을 Makefile 이라 는이름으로저장하기위해 MFile 개발툴의 File 메뉴를선택하면파일을읽거나쓰기위 한서브메뉴가나오는데 Save as 메뉴를선택하여파일저장창이나타난다. 파일저 3 QB-MCU100 Starter Kit
장창에서 C 언어소스파일이있는폴더에 Makefile 을지정하고 저장 (S) 버튼을눌러 서파일을저장한다. 표 1.1 에 MFile 개발툴로컴파일및다운로드옵션을설정하여만든 Makefile 의내용을보여주고있다. 표 1.1. Makefile 매크로파일내용 Hey Emacs, this is a -*- makefile -*- WinAVR Sample makefile written by Eric B. Weddington, J?rg Wunsch, et al. Released to the Public Domain Please read the make user manual! Additional material for this makefile was submitted by: Tim Henigan Peter Fleury Reiner Patommel Sander Pool Frederik Rouleau Markus Pfaff On command line: make all = Make software. make clean = Clean out built project files. make coff = Convert ELF to AVR COFF (for use with AVR Studio 3.x or VMLAB). make extcoff = Convert ELF to AVR Extended COFF (for use with AVR Studio 4.07 or greater). make program = Download the hex file to the device, using avrdude. Please customize the avrdude settings below first! make filename.s = Just compile filename.c into the assembler code 4 QB-MCU100 Starter Kit
only To rebuild project do "make clean" then "make all". MCU name MCU = atmega162 Output format. (can be srec, ihex, binary) FORMAT = ihex Target file name (without extension). TARGET = port_led_test List C source files here. (C dependencies are automatically generated.) SRC = $(TARGET).c List Assembler source files here. Make them always end in a capital.s. Files ending in a lowercase.s will not be considered source files but generated files (assembler output from the compiler), and will be deleted upon "make clean"! Even though the DOS/Win* filesystem matches both.s and.s the same, it will preserve the spelling of the filenames, and gcc itself does care about how the name is spelled on its command-line. ASRC = Optimization level, can be [0, 1, 2, 3, s]. 0 = turn off optimization. s = optimize for size. (Note: 3 is not always the best optimization level. See avr-libc FAQ.) OPT = s Debugging format. Native formats for AVR-GCC's -g are stabs [default], or dwarf-2. AVR (extended) COFF requires stabs, plus an avr-objcopy run. DEBUG = stabs 5 QB-MCU100 Starter Kit
List any extra directories to look for include files here. Each directory must be seperated by a space. EXTRAINCDIRS = Compiler flag to set the C Standard level. c89 - "ANSI" C gnu89 - c89 plus GCC extensions c99 - ISO C99 standard (not yet fully implemented) gnu99 - c99 plus GCC extensions CSTANDARD = -std=gnu99 Place -D or -U options here CDEFS = Place -I options here CINCS = Compiler flags. -g*: generate debugging information -O*: optimization level -f...: tuning, see GCC manual and avr-libc documentation -Wall...: warning level -Wa,...: tell GCC to pass this to the assembler. -adhlns...: create assembler listing CFLAGS = -g$(debug) CFLAGS += $(CDEFS) $(CINCS) CFLAGS += -O$(OPT) CFLAGS += -funsigned-char -funsigned-bitfields -fpack-struct -fshortenums CFLAGS += -Wall -Wstrict-prototypes CFLAGS += -Wa,-adhlns=$(<:.c=.lst) CFLAGS += $(patsubst %,-I%,$(EXTRAINCDIRS)) CFLAGS += $(CSTANDARD) Assembler flags. -Wa,...: tell GCC to pass this to the assembler. -ahlms: create listing 6 QB-MCU100 Starter Kit
-gstabs: have the assembler create line number information; note that for use in COFF files, additional information about filenames and function names needs to be present in the assembler source files -- see avr-libc docs [FIXME: not yet described there] ASFLAGS = -Wa,-adhlns=$(<:.S=.lst),-gstabs Additional libraries. Minimalistic printf version PRINTF_LIB_MIN = -Wl,-u,vfprintf -lprintf_min Floating point printf version (requires MATH_LIB = -lm below) PRINTF_LIB_FLOAT = -Wl,-u,vfprintf -lprintf_flt PRINTF_LIB = Minimalistic scanf version SCANF_LIB_MIN = -Wl,-u,vfscanf -lscanf_min Floating point + %[ scanf version (requires MATH_LIB = -lm below) SCANF_LIB_FLOAT = -Wl,-u,vfscanf -lscanf_flt SCANF_LIB = MATH_LIB = -lm External memory options 64 KB of external RAM, starting after internal RAM (ATmega128!), used for variables (.data/.bss) and heap (malloc()). EXTMEMOPTS = -Wl,-Tdata=0x801100,--defsym= heap_end=0x80ffff 64 KB of external RAM, starting after internal RAM (ATmega128!), only used for heap (malloc()). 7 QB-MCU100 Starter Kit
EXTMEMOPTS = -Wl,--defsym= heap_start=0x801100,-- defsym= heap_end=0x80ffff EXTMEMOPTS = Linker flags. -Wl,...: tell GCC to pass this to linker. -Map: create map file --cref: add cross reference to map file LDFLAGS = -Wl,-Map=$(TARGET).map,--cref LDFLAGS += $(EXTMEMOPTS) LDFLAGS += $(PRINTF_LIB) $(SCANF_LIB) $(MATH_LIB) Programming support using avrdude. Settings and variables. Programming hardware: alf avr910 avrisp bascom bsd dt006 pavr picoweb pony-stk200 sp12 stk200 stk500 Type: avrdude -c? to get a full listing. AVRDUDE_PROGRAMMER = stk200 com1 = serial port. Use lpt1 to connect to parallel port. AVRDUDE_PORT = lpt1 AVRDUDE_WRITE_FLASH = -U flash:w:$(target).hex AVRDUDE_WRITE_EEPROM = -U eeprom:w:$(target).eep Uncomment the following if you want avrdude's erase cycle counter. Note that this counter needs to be initialized first using -Yn, see avrdude manual. AVRDUDE_ERASE_COUNTER = -y Uncomment the following if you do /not/ wish a verification to be performed after programming the device. AVRDUDE_NO_VERIFY = -V 8 QB-MCU100 Starter Kit
Increase verbosity level. Please use this when submitting bug reports about avrdude. See <http://savannah.nongnu.org/projects/avrdude> to submit bug reports. AVRDUDE_VERBOSE = -v -v AVRDUDE_FLAGS = -p $(MCU) -P $(AVRDUDE_PORT) -c $(AVRDUDE_PROGRAMMER) AVRDUDE_FLAGS += $(AVRDUDE_NO_VERIFY) AVRDUDE_FLAGS += $(AVRDUDE_VERBOSE) AVRDUDE_FLAGS += $(AVRDUDE_ERASE_COUNTER) -------------------------------------------------------------------- ------- Define directories, if needed. DIRAVR = c:/winavr DIRAVRBIN = $(DIRAVR)/bin DIRAVRUTILS = $(DIRAVR)/utils/bin DIRINC =. DIRLIB = $(DIRAVR)/avr/lib Define programs and commands. SHELL = sh CC = avr-gcc OBJCOPY = avr-objcopy OBJDUMP = avr-objdump SIZE = avr-size NM = avr-nm AVRDUDE = avrdude REMOVE = rm -f COPY = cp Define Messages English MSG_ERRORS_NONE = Errors: none MSG_BEGIN = -------- begin -------- MSG_END = -------- end -------- MSG_SIZE_BEFORE = Size before: 9 QB-MCU100 Starter Kit
MSG_SIZE_AFTER = Size after: MSG_COFF = Converting to AVR COFF: MSG_EXTENDED_COFF = Converting to AVR Extended COFF: MSG_FLASH = Creating load file for Flash: MSG_EEPROM = Creating load file for EEPROM: MSG_EXTENDED_LISTING = Creating Extended Listing: MSG_SYMBOL_TABLE = Creating Symbol Table: MSG_LINKING = Linking: MSG_COMPILING = Compiling: MSG_ASSEMBLING = Assembling: MSG_CLEANING = Cleaning project: Define all object files. OBJ = $(SRC:.c=.o) $(ASRC:.S=.o) Define all listing files. LST = $(ASRC:.S=.lst) $(SRC:.c=.lst) Compiler flags to generate dependency files. GENDEPFLAGS = -Wp,-M,-MP,-MT,$(*F).o,-MF,.dep/$(@F).d Combine all necessary flags and optional flags. Add target processor to flags. ALL_CFLAGS = -mmcu=$(mcu) -I. $(CFLAGS) $(GENDEPFLAGS) ALL_ASFLAGS = -mmcu=$(mcu) -I. -x assembler-with-cpp $(ASFLAGS) Default target. all: begin gccversion sizebefore build sizeafter finished end build: elf hex eep lss sym extcoff elf: $(TARGET).elf hex: $(TARGET).hex eep: $(TARGET).eep lss: $(TARGET).lss sym: $(TARGET).sym Eye candy. 10 QB-MCU100 Starter Kit
AVR Studio 3.x does not check make's exit code but relies on the following magic strings to be generated by the compile job. begin: $(MSG_BEGIN) finished: $(MSG_ERRORS_NONE) end: $(MSG_END) Display size of file. HEXSIZE = $(SIZE) --target=$(format) $(TARGET).hex ELFSIZE = $(SIZE) -A $(TARGET).elf sizebefore: @if [ -f $(TARGET).elf ]; then echo; echo $(MSG_SIZE_BEFORE); $(ELFSIZE); echo; fi sizeafter: @if [ -f $(TARGET).elf ]; then echo; echo $(MSG_SIZE_AFTER); $(ELFSIZE); echo; fi Display compiler version information. gccversion : @$(CC) --version Program the device. program: $(TARGET).hex $(TARGET).eep $(AVRDUDE) $(AVRDUDE_FLAGS) $(AVRDUDE_WRITE_FLASH) $(AVRDUDE_WRITE_EEPROM) Convert ELF to COFF for use in debugging / simulating in AVR Studio or VMLAB. COFFCONVERT=$(OBJCOPY) --debugging \ --change-section-address.data-0x800000 \ --change-section-address.bss-0x800000 \ 11 QB-MCU100 Starter Kit
--change-section-address.noinit-0x800000 \ --change-section-address.eeprom-0x810000 coff: $(TARGET).elf $(MSG_COFF) $(TARGET).cof $(COFFCONVERT) -O coff-avr $< $(TARGET).cof extcoff: $(TARGET).elf $(MSG_EXTENDED_COFF) $(TARGET).cof $(COFFCONVERT) -O coff-ext-avr $< $(TARGET).cof Create final output files (.hex,.eep) from ELF output file. %.hex: %.elf $(MSG_FLASH) $@ $(OBJCOPY) -O $(FORMAT) -R.eeprom $< $@ %.eep: %.elf $(MSG_EEPROM) $@ -$(OBJCOPY) -j.eeprom --set-section-flags=.eeprom="alloc,load" \ --change-section-lma.eeprom=0 -O $(FORMAT) $< $@ Create extended listing file from ELF output file. %.lss: %.elf $(MSG_EXTENDED_LISTING) $@ $(OBJDUMP) -h -S $< > $@ Create a symbol table from ELF output file. %.sym: %.elf $(MSG_SYMBOL_TABLE) $@ $(NM) -n $< > $@ 12 QB-MCU100 Starter Kit
Link: create ELF output file from object files..secondary : $(TARGET).elf.PRECIOUS : $(OBJ) %.elf: $(OBJ) $(MSG_LINKING) $@ $(CC) $(ALL_CFLAGS) $(OBJ) --output $@ $(LDFLAGS) Compile: create object files from C source files. %.o : %.c $(MSG_COMPILING) $< $(CC) -c $(ALL_CFLAGS) $< -o $@ Compile: create assembler files from C source files. %.s : %.c $(CC) -S $(ALL_CFLAGS) $< -o $@ Assemble: create object files from assembler source files. %.o : %.S $(MSG_ASSEMBLING) $< $(CC) -c $(ALL_ASFLAGS) $< -o $@ Target: clean project. clean: begin clean_list finished end clean_list : $(MSG_CLEANING) $(REMOVE) $(TARGET).hex $(REMOVE) $(TARGET).eep $(REMOVE) $(TARGET).obj $(REMOVE) $(TARGET).cof $(REMOVE) $(TARGET).elf $(REMOVE) $(TARGET).map $(REMOVE) $(TARGET).obj $(REMOVE) $(TARGET).a90 13 QB-MCU100 Starter Kit
$(REMOVE) $(TARGET).sym $(REMOVE) $(TARGET).lnk $(REMOVE) $(TARGET).lss $(REMOVE) $(OBJ) $(REMOVE) $(LST) $(REMOVE) $(SRC:.c=.s) $(REMOVE) $(SRC:.c=.d) $(REMOVE).dep/* Include the dependency files. -include $(shell mkdir.dep 2>/dev/null) $(wildcard.dep/*) Listing of phony targets..phony : all begin finish end sizebefore sizeafter gccversion \ build elf hex eep lss sym coff extcoff \ clean clean_list program 14 QB-MCU100 Starter Kit
2 WinAVR 을이용한 AVR 프로그램개발방법 AVR MCU 프로그램을개발하는경우에그림 2.1과같은개발흐름도를가지고개발을수행하게된다. 우선, 프로그램소스를작성하고프로그램소스를컴파일러 (avr-gcc) 를이용하여컴파일하는데이때, 에러가발생하면프로그램소스를수정한후재컴파일을수행한다. 컴파일되어생성된프로그램을다운로드개발툴 (AVRdude) 과다운로드장비 (ISP 회로또는보드 ) 를이용하여 QB-MCU100의 QB-AM162-TK 보드에다운로드하고실제로 QB- AM162-TK 보드에서프로그램이실행된다. 이때, 프로그램실행에에러가있으면다시처음으로가서프로그램소스를수정하고재컴파일, 다운로드, 프로그램실행을수행하여개발을완료하게된다. 이것은 AVR MCU 뿐만아니라대부분의 MCU 개발환경과동일하다. 앞에서설명한 WinAVR 통합개발툴을이용하여 AVR 프로그램을개발한다면그림 2.2에보이는바와같이 Windows에서 시작 모든프로그램 WinAVR Programmers Notepad [WinAVR] 을선택하여 WinAVR의 Programmers Notepad 개발툴을실행한후, Programmers Notepad 개발툴의 File Open 메뉴를선택하여나타나는파일열기창에서프로그램소스를읽어들이고 Programmers Notepad 개발툴의 Tools 메뉴를선택하면 Makefile 매크로파일을이용하여소스컴파일, 컴파일된파일삭제, 프로그램다운로드기능을수행하는서브메뉴가나오는데이러한서브메뉴들을선택함으로써해당기능을실행하게된다. 여기서, [WinAVR] Make All 메뉴를선택하면 Makefile 매크로파일에서 all: 로시작하는부분의내용이실행되어프로그램소스가컴파일된다. 그리고, [WinAVR] Make Clean 메뉴를선택하면 Makefile 매크로파일에서 clean: 로시작하는부분의내용이실행되어컴파일할때생성된파일들이삭제된다. 또한, [WinAVR] Program 메뉴를선택하면 Makefile 매크로파일에서 program: 로시작하는부분의내용이실행되어 프로그램파일이름.hex 파일을 QB-MCU100의 QB-AM162-TK 보드에다운로드하게된다. 이때, 컴퓨터의병렬포트와 QB-AM162-TK 보드의 25핀 ISP 포트가병렬케이블로연결되어있고 QB-AM162-TK 보드에는전원이인가되어있어야한다. 15 QB-MCU100 Starter Kit
시작 프로그램소스작성 / 수정 프로그램소스컴파일 Error OK 프로그램다운로드 프로그램실행 Error OK 완료 그림 2.1 AVR MCU 프로그램개발흐름도 16 QB-MCU100 Starter Kit
그림 2.2 WinAVR 의 Programmers Notepad 개발툴 Tools 메뉴 지금까지 WinAVR 통합개발툴을이용하여 AVR 프로그램을작성하고작성된 AVR 프로그램을 QB-MCU100의 QB-AM162-TK 보드에다운로드하여 AVR MCU를이용한실습또는제품개발을수행할수있다. 이외에도 Ponyprog2000이라는 AVR 프로그램다운로드툴이있는데이것은 AVR 뿐만아니라 PIC 등의 MCU와 EEPROM 등의메모리에데이터를다운로드하는기능도있다. 또한, Atmel사의 AVR Studio는 AVR 전용으로어셈블러, 다운로드, 시뮬레이션, 에뮬레이션기능을가지고있어 AVR 프로그램개발과다운로드및디버그수행도가능하다. 17 QB-MCU100 Starter Kit
QB-MCU100 Starter Kit를이용하여 Atmel사의 AVR MCU에대한이해와활용방법을익히는데도움이되기를바랍니다. 또한, QB-MCU100 Starter Kit를활용하는데필요한관련자료는본 퀀텀베이스홈페이지 www.quantumbase.com의자료실에있으니참조하시기바랍니다. 본제품활용성을극대화하고고객의의견교환의장으로저희 ( 주 ) 퀀텀베이스는 Naver에펀칩 (fun chip) 카페를개설하였습니다. 저희 www.quantumbase.com, www.funchip.co.kr 홈페이지와함께 FPGA와 AVR에대한정보교환의장으로활성화시키고자하오니항상관심가져주시기바랍니다. 감사합니다. 18 QB-MCU100 Starter Kit