처음 AVR 글을 봤을 때는 리눅스(우분투)를 기준으로 해서 윈도우에서는 어떻게 하면 될까 찾아보다 Atmel Studio를 쓰면 된다는 것이었다. 하지만 나는 VScode를 쓰고 싶었고, 어떠한 IDE를 사용하던 쓸 수 있게 하고 싶어 그 방법은 고려하지 않았다.

고로 남은 방법은 MSYS2와 WSL인데, MSYS2는 라이브러리가 꼬여서 중간에 하다 그만뒀고, WSL2는 USB 연결이 되지 않아서(되기는 하는데 손이 아주 많이 간다) 마찬가지로 그만뒀다. 리눅스였다면 그냥 터미널에서 받으면 되는데... 해서 "윈도우 패키지 관리자를 쓰면 되는 거 아닌가?"라는 생각으로 검색을 했더니 레딧에서 "윈도우에서 할 사람은 Scoop 쓰면 scoop install make avr-gcc avrdude 적으면 끝이야. 로컬 scoop으로 경로가 추가되어서 매번 PATH 추가 할 필요가 없어."

레딧의 그 댓글

내가 아는 패키지 관리자는 Winget이랑 chocolatey 정도였는데, Scoop이 추가로 있었다니... 응? 윈도우에도 패키지 관리자가 있었다고? 그걸 이제 알았다고? 괜찮다. 나도 알고만 있었지 활용한 지 얼마 안 되었으니..

예를 들면 엣지 키는 것도 기분 더러워서 Winget으로 파이어폭스 설치하는 정도?

해서 Scoop을 이용해서 윈도우에서 AVR 프로그래밍을 하는 방법을 알려주려고 한다.

보통 사람이라면 그냥 아두이노 IDE나 Atmel Studio를 쓰지 나처럼 VSCode를 고집하고 컴파일하고 플래시하는 행위를 하나하나 하는 사람은 미친놈이라고 한다.

하지만 재밌죠?

AVR 개발환경 구축

제일 먼저 Scoop을 설치해야지. Powershell을 열어서 아래 명령어를 써주자.

Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope CurrentUser
Invoke-RestMethod -Uri https://get.scoop.sh | Invoke-Expression

그럼 이렇게 친절하게 설치하고 있다는 것을 알려준다.

그리고 아래 명령어로 필요한 패키지를 받자

scoop install avr-gcc

make와 avrdude는 avr-gcc 패키지 안에 다 들어있으니 굳이 설치 할 필요 없다.
끝이다. exe 파일을 받고 자시고 그냥 저 명령어로 끝난 것이다.

시작 전에 Powershell에서 아래 명령어로 경로가 인식이 되었는지 확인하자.

avr-gcc --version
avr-gdb --version
avrdude --version
make --version

위와 같이 나오면 성공.

아두이노 LED 깜빡이기

시작하기 전에 본인은 아두이노 우노 공식보드를 사용했다.

호환보드로 하는 경우 별도의 드라이버를 추가로 설치해야 한다. LED는 +가 13번, -는 GND에 연결하자.

LED를 이렇게 연결해주면 된다.
아두이노 우노의 포트위치는 장치 관리자 -> 포트에서 확인하면 된다.
COM3가 우노의 포트위치이다.

VScode(또는 다른 IDE)를 실행한 다음 폴더를 만들고 C언어 소스와 Makefile을 아래와 같이 작성하면 된다. Makefile을 만들지 않고 명령어로 하나하나 다 해도 되는데 반복작업은 조금이나마 편한 방법으로 하는 것을 추천한다.
그리고 소스파일과 Makefile은 같은 위치에 있어야 하며, Makefile은 꼭 "Makefile"로 작성해야 인식한다. makefile, Makefile.mak 이런 식으로 저장하면 인식이 되지 않는다.

 

led.c

#include <avr/io.h>

#define F_CPU 16000000 //MCU Frequency rate
#define BLINK 5000 //Delay time(ms)

#include <util/delay.h>

int main (void)
{
  // Arduino digital pin 13 (pin 5 of PORTB) for output
  DDRB |= 0B100000; // PORTB5 (1 << PB5)

  while(1) {
    // turn LED on
    PORTB |= 0B100000; // PORTB5 (1 << PB5)
    _delay_ms(BLINK);

    // turn LED off
    PORTB &= ~ 0B100000; // PORTB5 (1 << PB5)
    _delay_ms(BLINK);
  }
}

Makefile

# GNU make macro
# CFLAGS : Compiler option, CC : Compiler
# LDFLAGS : Linker option, LD : link
# PROGRAM : Source file name
# $@ : Name of current target, $< : First dependency

# avr-gcc commands (Part)
# -c : Compile only, -ihex : Intel hex file, -R : Remove, -o : output, -O : Optimize, -Os : Optimize for size
# -D : Define, -mmcu : MCU Target, UL : Unsigned Long

# avrdude commands (Part)
# -F : Override invalid Signature check, -V : Do not verify, -c : Specify programmer type 
# -p <partno> : Required. Specify AVR Device
# -P : Port, -b <boudrate> : Override RS-232 baud rate 
# -U <memtype>:r|w|v:<filename>[:format] : Memory operation specification

# Makefile rule
# <Target>: <Dependencies>
#    <Recipe> Must be indented with a TAB

# Macro define section
CC = avr-gcc
CFLAGS = -c -Os -D F_CPU=16000000UL -mmcu=atmega328p
LDFLAGS = -mmcu=atmega328p
PROGRAM = led
OBJCOPY = avr-objcopy

# Port where your Arduino Uno is connected
PORT = COM3

# command section
all: ${PROGRAM}.hex 

${PROGRAM}.hex: ${PROGRAM}.elf
    ${OBJCOPY} -O ihex -R .eeprom ${PROGRAM}.elf ${PROGRAM}.hex

${PROGRAM}.elf: ${PROGRAM}.o
    ${CC} $(LDFLAGS) -o $@ $^

${PROGRAM}.o: ${PROGRAM}.c 
    ${CC} $(CFLAGS) -c -o $@ $<

flash: ${PROGRAM}.hex
    avrdude -F -V -c arduino -p ATMEGA328P -P ${PORT} -b 115200 -U flash:w:${PROGRAM}.hex

clean: FRC
    del ${PROGRAM}.elf ${PROGRAM}.hex ${PROGRAM}.o
FRC:

작성을 다 했다면 VScode에서 터미널을 열고
make를 입력하자. 터미널이 보이지 않는다면 F1을 눌러서 아래와 같이 terminal을 입력하면 된다.

Powershell 선택하면 됩니다.

make를 입력하면

 

led.elf, led.hex, lex.o가 만들어진다.

여기서 make flash를 입력하면 비로소 led.hex가 아두이노 우노에 업로드가 되어 LED가 점등이 된다.

 

깜빡깜빡깜빡깜빡

 

이제 순수 C언어로 아두이노를 지배하자.

+ Recent posts