Arduino Bootloader 이해하기

아두이노는 MCU Microcontroller인 Atmel의 8비트 AVR을 이용해 다른 회로와 결합할 수 있도록 제공하고 있다. 초기에 ATmega8, ATmega16B, ATmega328같은 megaAVR 시리즈를 주로 사용하고 기본적으로 5V 리니어 레귤레이터와 16Mhz 수정 진동자가 내장되어 있고, 프로그램의 업로드의 편의를 위해 MCU에 부트로더가 내장되어 있다.

Bootloader

MCU 는 내장한 플래시 메모리에 Firmware를 장착해서 펌웨어에서 프로그램에 의해 IO port를 제어하고 다루고 있다. 이 펌웨어가 코드를 입력해 완성한 응용 애플리케이션인 것이다. 이런 펌웨어를 설치해 주는 장치 혹은 프로그램들을 Programmer라고 한다. 이런 Programmer는 MCU의 외부에 위치해서 MCU의 Flash 메모리에 프로그램을 장착해주는데 이를 Bootloader라고 한다. MCU는 플래시에 장착된 펌웨어가 없으면 프로그래머를 통해서 MCU를 프로그램하게 된다. 이런 프로그래머는 MCU외부에서 Bootloader를 사용해서 프로그램할 수 있다는 의미이다.
내장한 부트로더를 사용하지 않는다면 칩의 전체 프로그램 공간을 다 사용하거나 혹은 부트로더의 지연을 피하려면 외부 프로그래머를 사용해 스케치를 구울 수 있다.

External Programmer

Arduino는 내장된 프로그래머를 가지고 있다. MCU 내부에 부트로더를 내장하고 있다. 또한 외부 프로그래머인 AVR-ISP, USBtinyISP를 구매하거나 혹은 ParallelProgrammer를 빌드해서 사용할 수 있다. 이들 프로그래머는 ICSP pin에 연결하게 되고, 보드에는 외부 전원 혹은 USB 전원에 연결해 준다.

Programming

Uno의 경우 USB Type B 포트에 개발머신과 USB cable을 연결해서 프로그램을 업로드한다. 그리고 IDE에서 코드를 작성해서 업로드를 하면 USB cable을 통해 MCU에 기계어 코드가 업로드된다.
Arduino Uno R3 보드 레이아웃
[Arduino Uno R3 보드 레이아웃(그림 출처:http://cactus.io/)]
Uno의 경우 USB Type B 포트와 케이블을 사용해서 개발머신과 아두이노를 연결한다.
Arduino Uno와 USB Type B cable
[Arduino Uno R3와 USB Type B cable(그림 출처:https://s-media-cache-ak0.pinimg.com/)]

USB to Serial

개발 컴퓨터와 아두이노 사이는 USB to Serial 케이블로 연결되는데, 이때 UART를 위해서 ATmega16U2 (초기에는 FT232R)에 의해 시리얼 신호가 TTL 레벨로 변환된다.
Arduino의 ATmega16u2 Schematic
[Arduino의 ATmega16u2 Schematic (그림 출처:https://rheingoldheavy.com/)]
ATmega16U2에 대해서 자세히 분석한 기사 https://rheingoldheavy.com/arduino-from-scratch-part-8-atmega16u2-subsystem/

Upload

IDE에서 코드를 작성후 업로드를 실행하면 기계어 코드로 변환되어 MCU의 UART를 사용해서 USB to serial을 이용해서 부트로더를 실행해 시리얼로 들어오는 기계어를 플래시 메모리에 쓰게 된다. 그리고 내부 프로그래머에 의해 응용 프로그램 코드가 적재되게 된다.
Arduino Uno R3의 코드 업로드 (Wikipedia)
[Arduino Uno R3의 코드 업로드 (Wikipedia)]
IDE에서 업로드가 실행되면 위 그림에 표시한 경로 처럼 부트로더가 실행된다.
  1. 그림 (1)번 DTR 신호가 MCU에 전달되어 리셋되고 부트로더가 동작한다.
  2. ATmega16u2에서 리셋 신호를 전달하기 위해 캐패시터(0.1~0.22uF)를 사용해서 MCU에 연결되어 있다
  3. 코드를 포함한 데이터는 그림 (2)번 선으로 연결되어 있다.
업로드 후에 MCU에 프로그램이 장착되면 MCU에 전원이 켜지면 MCU에서 프로그램을 실행한다. 리셋 버튼을 누르면 부트로더는 코드를 새로 써서 변경할 필요가 없다면 응용 프로그램으로 이동해 실행한다.

참조

  1. 아두이노-위키피디아
  2. Bootloader Developement
  3. Arduino Uno R3 - 레이아웃

댓글

이 블로그의 인기 게시물

Raspberry Pi에서 OpenAuto 로 Android Auto 사용하기 Wow!!!

Pi Jack - Raspberry Pi Power HAT

브라우저 시크릿 창을 사용하면 문을 잠그는 아두이노 잠금 장치!!!