먼저 Arduino는 두개의 ATmega로 구성되어 있습니다.
ATmega16U2는 USB-Serial 컨버터의 역할을 하는 녀석이고,
ATmega328P는 부트로더와 앱(APP)이 들어가는 녀석입니다.
구조를 보면 아래의 그림과 같습니다.
"Arduino Uploader ko" by Dolicom - 자작. Licensed under CC BY-SA 3.0 via 위키미디어 공용 - https://commons.wikimedia.org/wiki/File:Arduino_Uploader_ko.svg#/media/File:Arduino_Uploader_ko.svg
아두이노의 USB로 전원이 연결되면 ATmega16U2를 거쳐 UART를 통해 ATmega328P로 전달됩니다.
"AVR8 Bootloader Flash Config" by Dolicom - 자작. Licensed under CC BY-SA 4.0 via 위키미디어 공용 - https://commons.wikimedia.org/wiki/File:AVR8_Bootloader_Flash_Config.png#/media/File:AVR8_Bootloader_Flash_Config.png
ATmega328P의 Flash 영역을 보면 0번지부터 프로그래밍을 할 수 있고, 뒷부분에 부트로더가 장착되어 있습니다.
Arduino는 AVR과 같은 체계의 부트로더를 사용하는데 BOOTRST비트가 1이면 0번지(APP영역)부터
시작을 하게되고, BOOTRST비트가 0이면 부트로더의 시작주소부터 시작하게 됩니다.
부트영역의 공간은 BOOTSZ1, BOOTSZ0 에 의해 총 4가지 영역의 크기가 선택됩니다.
하지만 아두이노가 리붓 될 때마다 BOOTRST 비트 퓨징을 매번 하는것이 쉽지 않아 BOOTRST비트는
0으로 고정하고 부트로더에서 업로드를 할지 0번지(APP영억)부터 시작할지를 결정합니다.
"AVR bootloader Proc" by Dolicom - 자작. Licensed under CC BY-SA 4.0 via 위키미디어 공용 - https://commons.wikimedia.org/wiki/File:AVR_bootloader_Proc.jpg#/media/File:AVR_bootloader_Proc.jpg
부트로더의 실행 순서는 위 그림과 같은데, 전원이 인가되면 PORT D를 입력으로 설정합니다.
PORT D 핀의 특정핀이 1이면 0번지(APP)영역이 실행되고, 0이면 부트로더로 진입합니다.
그리고 프로토콜을 확인하고, 유효한 프로토콜이면 프로토콜대로 작업을 수행하게 됩니다.
추가로 시리얼 터미널 연결시 Arduino가 리셋되는 것을 확인 할 수 있는데, 시리얼 연결시
부트로더로 들어와 리셋명령을 수행하는 것을 확인할 수 있습니다.
'Study > Arduino' 카테고리의 다른 글
플래쉬 다운로딩이 안될때 (0) | 2016.08.30 |
---|---|
자주쓰이는 체터링방지 버튼(Button) 코딩법 (1) | 2016.06.13 |
hex string to byte array (0) | 2016.06.01 |
Intel Edison 초기설정하기 (0) | 2015.11.23 |
arduino uno (0) | 2015.03.26 |