myProjects

Atmega328u 에 부트로더 굽기

바람C 2022. 3. 28. 15:31

ATMEGA328P 또는 ATMEGA328 에 부트로더 굽기

아두이노 우노에 사용되는 MCU

아두이노 우노에 사용되는 MCU 는 ATMEGA328P 이다. 즉, ATMEGA328P-PU 이거나 ATMEGA328P-AU가 일반적으로 사용된다. 보통 DIP 타입의 ATMEGA328P-PU MCU 와 ATMEGA16U2 를 포함한 정품과 동일한 규격의 복제품과 TQFP 타입의 ATMEGA328P-AU  MCU 와 CH340 USB 드라이버를 사용하는 복제품이 있다. 둘 다 복제품이다.

 

ATMEGA328P 와 ATMEGA328 의 차이

기본적으로 우노에 사용되는 MCU 는 P 가 붙어 있는 Pico Power 대기모드에서 소비전력을 줄인 것이 사용된다. 그러다보니 ATMEGA328P 와 ATMEGA328 즉, 뒤에 P 가 붙지 않은 칩이 다르게 인식된다.

생긴건 동일하게 생겼는데 내부 ID가 다르다보니 정작 부트로더를 구울 때 ATMEGA328 을 사용하면 에러를 발생시킨다.

 

얼마전까지만 해도 이 문제를 해결하는 것이 쉽지 않았던 것으로 보인다. 하지만 지금은 쉽게 처리할 수 있게 되었다.

 

우선 기본적인 ATMEGA328P-PU(사진의 위쪽) 또는  ATMEGA328 U(사진의 아래쪽)를 사용하는 경우 부트로더를 굽는 방법은 다음과 같다.

 

부트로더 굽는 방법

1. arduino ide 를 실행한다.

2. PC 와 아두이노 우노를 USB 케이블로 연결한다. [툴] 에서 보드와 포트 번호를 맞춘다. 이때 아두이노 우노는 사용하던 것을 사용하면 된다. DIP 타입이거나 혹은 SMD 타입이건 상관없다. 단, 우노(UNO)여야 한다.

3. [파일] - [예제] - [11.ArduinoISP] - [ArduinoISP] 를 클릭하고 업로드 한다. 이제 아두이노 우노는 ArduinoISP 로 작동한다.

4. 다음과 같이 연결한다.


5. ARDUINO IDE 의 [파일] - [환경설정] - [추가적인 보드 매니저 URLs] 에 https://mcudude.github.io/MiniCore/package_MCUdude_MiniCore_index.json 을 추가한다.

6. [툴] - [보드] - [보드 매니저] 에서 "minicore" 를 검색하고 나온 것을 설치한 후 창을 닫는다.

7. [툴] - [보드] - [MiniCore] 에서 [Atemega328] 을 선택한다.

8. Clock 은 16MHz 로, 나머지는 그대로 두고, Variant 를 P 칩을 사용한 경우 328P/328PA 를 선택하고, P 칩이 아닌경우 328/328A 를 선택한다. 328PB 는 아두이노 마이크로 보드에 사용되는 칩이다.

 

8. [툴]  - [프로그래머] - [Arduino as ISP(MiniCore)] 를 선택한다.

9. [툴] - [포트] 에서 연결된 아두이노 우노의 포트를 선택한다.

10. [툴] - [부트로더 굽기] 를 선택하면 아두이노 우노를 ISP 로 이용하여 연결된 ATMEGA328P 또는 ATMEGA328 칩에 부트로더를 굽는다. 다음과 같은 메시지를 보여준 후 완료된다.

 

avrdude: Version 6.3-20201216
         Copyright (c) 2000-2005 Brian Dean, http://www.bdmicro.com/
         Copyright (c) 2007-2014 Joerg Wunsch

         System wide configuration file is "C:\Users\eventia\AppData\Local\Arduino15\packages\MiniCore\hardware\avr\2.1.3/avrdude.conf"

         Using Port                    : COM3
         Using Programmer              : stk500v1
         Overriding Baud Rate          : 19200
         AVR Part                      : ATmega328
         Chip Erase delay              : 9000 us
         PAGEL                         : PD7
         BS2                           : PC2
         RESET disposition             : dedicated
         RETRY pulse                   : SCK
         serial program mode           : yes
         parallel program mode         : yes
         Timeout                       : 200
         StabDelay                     : 100
         CmdexeDelay                   : 25
         SyncLoops                     : 32
         ByteDelay                     : 0
         PollIndex                     : 3
         PollValue                     : 0x53
         Memory Detail                 :

                                  Block Poll               Page                       Polled
           Memory Type Mode Delay Size  Indx Paged  Size   Size #Pages MinW  MaxW   ReadBack
           ----------- ---- ----- ----- ---- ------ ------ ---- ------ ----- ----- ---------
           eeprom        65    20     4    0 no       1024    4      0  3600  3600 0xff 0xff
           flash         65     6   128    0 yes     32768  128    256  4500  4500 0xff 0xff
           lfuse          0     0     0    0 no          1    0      0  4500  4500 0x00 0x00
           hfuse          0     0     0    0 no          1    0      0  4500  4500 0x00 0x00
           efuse          0     0     0    0 no          1    0      0  4500  4500 0x00 0x00
           lock           0     0     0    0 no          1    0      0  4500  4500 0x00 0x00
           calibration    0     0     0    0 no          1    0      0     0     0 0x00 0x00
           signature      0     0     0    0 no          3    0      0     0     0 0x00 0x00

         Programmer Type : STK500
         Description     : Atmel STK500 Version 1.x firmware
         Hardware Version: 2
         Firmware Version: 1.18
         Topcard         : Unknown
         Vtarget         : 0.0 V
         Varef           : 0.0 V
         Oscillator      : Off
         SCK period      : 0.1 us

...(중략)...

avrdude: verifying ...
avrdude: 32768 bytes of flash verified
avrdude: reading input file "0x0f"
avrdude: writing lock (1 bytes):

Writing | ################################################## | 100% 0.02s

avrdude: 1 bytes of lock written
avrdude: verifying lock memory against 0x0f:
avrdude: load data lock data from input file 0x0f:
avrdude: input file 0x0f contains 1 bytes
avrdude: reading on-chip lock data:

Reading | ################################################## | 100% 0.01s

avrdude: verifying ...
avrdude: 1 bytes of lock verified

avrdude done.  Thank you.

 

부트로더 구워진 칩 프로그래밍 하기

부트로더 구워진 칩을 사용하는 방법은 다양하다. 알아서 사용하면 된다. 아직 잘 모르는 초보들을 위해 간단한 한가지 방법을 알려주겠다. 기존 아두이노 보드에 넣어서 프로그램한 후 다시 빼서 사용하고자 하는 곳에 넣으면 된다.

 

제대로 되었는지 확인하기 위해 DIP 타입 ATMEGA328P-PU 를 사용하고 있는 아두이노 우노의 칩을 핀셋으로 조심스럽게 꺼내고 새롭게 부트로더를 구운 ATMEGA328 U 칩을 넣어서 BLINK 예제를 작동시켜본다. 

이때 주의할 것이 있다.

 

우리가 사용한 칩이 ATMEGA328 U 이라면 보드를 Arduino UNO 를 선택하면 안된다. ATMEGA328P-PU 와 ATMEGA328 U 는 ID 가 다르기 때문에 다른 기종으로 인식된다. 즉, [툴] - [보드] - [MiniCore] 에서 ATmega328 을 선택하고, 나머지 사항도 그에 맞게 맞춰주어야 한다.

 

[파일] - [예제] - [01.Basic] - [Blink] 를 선택하고 업로드 버튼을 클릭한다. 이때 [툴] - [프로그래머] 는 어느 것이든 관계없다. [툴] - [프로그래머] 는 부트로더를 업로드 할 때만 사용되고, 부트로더가 올라간 상태의 아두이노는 USB 를 통해 UART 통신으로 프로그램코드가 올라간다. 즉 [툴] - [프로그래머] 는 상관없다.

 

 

 

아무 문제 없이 1초에 한번씩 LED가 켜지고 꺼지며 정상 작동하는 것을 확인할 수 있다.

 

[정리]

  1. ATMEGA328 칩을 구했을때 부트로더 굽기
    1. IDE - 환경설정 - 추가적인 보드매니저 URLs- https://mcudude.github.io/MiniCore/package_MCUdude_MiniCore_index.json
    2. 툴 - 보드 - 보드매니저 - MiniCore
    3. 보드 - MiniCore - ATmega328 // Variant - 328/328A
    4. ArduinoISP & 프로그래머 Arduino as ISP
  2. 부트로더 구워진 ATMEGA328 칩 사용하기
    1. DIP 타입 사용하는 아두이노 우노에서 칩을 뺀 후 그 자리에 삽입하여 사용
    2. 보드 - MiniCore - ATmega328 & 기타 설정