아트메가/ATMEGA32U4 Breakout

ATMEGA32U4 breakout-보드 사용하기 1편(avrdude사용)

원원 2024. 3. 16. 16:01

안녕하세요. 오늘은 ATMEGA32U4 breakout 보드를 사용해보겠습니다
해당보드는 sparkfun에서 만든보드고 특징으로는 USB인터페이스가 있으므로 ISP장비가 없어도 펌웨어를 다운로드 가능합니다. https://www.sparkfun.com/products/retired/11117


ATMEGA32U4는 아두이노 레오나르도보드에 사용됩니다. ATMEGA32U4는 USB 인터페이스를 제공하므로 아두이노 레오나르도보드가 펌웨어를 다운받을때 별도의 장비가 필요없습니다. 많이 사용하는 아두이노 우노는 ATMEGA328p을 사용하고 해당 MCU는 USB인터페이스를 지원하지않으므로 아두이노우노에는 ATMGEA16u2가 들어가있어서 펌웨어를 다운로드하게 해줍니다. 아두이노 IDE는 펌웨어를 다운로드할때 avrdude(Advanced Virtual RISC microcontroller Device Programmer)라는 툴을 사용하고 해당 글에서도 avrdude를 사용해서 펌웨어를 다운로드해보는것을 해보고 실제 mcu의 hex를 읽어서 어느위치에 저장이 되는지 확인해보겠습니다.


.hex 알아보기)))
해당보드를 구매하면 부트로더가 포함되어있습니다. 펌웨어를 read해서 부트로더를 hex파일로 추출해보겠습니다.
MICROCHIP STUDIO IDE와, ISP장비를 이용하면 됩니다.

spark_boot.hex
0.09MB

해당 hex는 intel format입니다. intel  format에 대해 간단히 알아보겠습니다.

RECORD MARK ':' : 시작을 의미합니다.
RECLEN : 바이트 수를 의미합니다.
LOAD OFFSET : 주소를 의미합니다.
RECTYP : 레코드 타입을 의미합니다.

NFO or DATA : 데이터를 의미합니다.
CHKSUM : 체크섬을 의미합니다.

예시로 0x7000번지에 있는 데이터를 알아보겠습니다
:1070000055C000006EC000006CC000006AC00000E7
===> :10 7000 00 55C000006EC000006CC000006AC00000 E7

RECORD MARK ':' : :
RECLEN : 0x10 (16개)
LOAD OFFSET : 0x7000
RECTYP : 00(Data Record)
NFO or DATA : 55C000006EC000006CC000006AC00000
CHKSUM : E7
CHKSUM 구하는법은 문자를 바이트단위로 나눈다음에 모두 더하고 2의보수를 취하고 하위1바이트를 체크섬으로 사용하면 됩니다.
(CHECK SUM 구하는 함수)

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

// 주어진 문자열을 16진수로 변환하여 바이트 단위로 더하는 함수
unsigned int calculate_checksum(char *data) {
    unsigned int checksum = 0;
    int i;

    // 문자열의 길이를 가져옴
    int length = strlen(data);

    // 문자열을 16진수로 변환하여 바이트 단위로 더함
    for (i = 1; i < length - 2; i += 2) {
        char byte[3];
        byte[0] = data[i];
        byte[1] = data[i + 1];
        byte[2] = '\0';
        checksum += strtol(byte, NULL, 16);
    }

    // 2의 보수 취함
    checksum = ~checksum + 1;
    
    // 하위 1바이트만 리턴 
    checksum = checksum&0xff;
    
    return checksum;
}

int main() {
    char data[] = ":1070000055C000006EC000006CC000006AC00000";
    unsigned int checksum = calculate_checksum(data);
    
    
    // 결과 출력
    printf("Checksum: %X\n", checksum);
    
    return 0;
}

hex파일의 맨 아래에 보면 아래처럼 나와있습니다
:00000001FF
00 0000 01 FF
RECTYP 가 01이므로 End of File Record를 의미합니다

그래서 데이터가 없는 주소는 FFFF로 채워져있고 데이터가 있는 0x7000번지부터는 데이터가 채워져있는것을 볼 수 있습니다. 그래서 부트로더는 0x7000~0x7FFF까지 차지하고있는것을 예상할수있습니다.

(참고로 eXtreme Burner프로그램으로 hex파일을 열면 좀더 쉽게 보기가 가능합니다)


ATMEGA32u4의 데이터시트를보면  애플리케이션영역은 0x00시작이고 부트로더영역은 뒷쪽에 있습니다

부트로더 영역에 대한 설정입니다. hex파일을 추출했을때 데이터가 들어있던 범위가 0x7000~0x7FFF이므로 BOOTSZ1:0 BOOTSZ0: 0가 됩니다.



avrdude 사용하기))


D4포트에 LED를 연결하였고 LED를 ON하는 해당 hex파일을 avrdude를 통해서 펌웨어를 MCU로 다운로드해보겠습니다.

#include <avr/io.h>


int main(void)
{
    /* Replace with your application code */
    DDRD= 0xff;
    while (1) 
    {
        PORTD=0xff;
    }
}

단순히 LED만 키는 펌웨어입니다. 컴파일하면 나오는 .hex파일 입니다

:100000000C9456000C9460000C9460000C946000FA
:100010000C9460000C9460000C9460000C946000E0
:100020000C9460000C9460000C9460000C946000D0
:100030000C9460000C9460000C9460000C946000C0
:100040000C9460000C9460000C9460000C946000B0
:100050000C9460000C9460000C9460000C946000A0
:100060000C9460000C9460000C9460000C94600090
:100070000C9460000C9460000C9460000C94600080
:100080000C9460000C9460000C9460000C94600070
:100090000C9460000C9460000C9460000C94600060
:1000A0000C9460000C9460000C94600011241FBE3E
:1000B000CFEFDAE0DEBFCDBF0E9462000C94670094
:1000C0000C9400008FEF8AB98FEF8BB9FDCFF894B5
:0200D000FFCF60
:00000001FF

0000번지부터 데이터가 저장되어있는것을 볼 수 있습니다

avrdude.zip
1.00MB

avrdude는 명령프롬프트창에서 실행해야 됩니다. 압축을 풀고 같은 경로에 다운받을 .hex파일을 놔두고
avrdude -c AVR109 -p atmega32u4 -P  COM43 -U flash:w:atmega32u4_breakout.hex 을 입력합니다
avrdude -?를 입력하면 각 파라메터에 대한 설명이 나옵니다

펌웨어 다운로드가 성공했고 LED가 켜졌습니다.

이제 다시 hex파일을 추출해서 컴파일해서 나온 .hex파일이 그대로 들어가있는지 확인해보겠습니다.


이전에 FFFF로 채워져있던게 컴파일해서 나온 데이터로 채워졌습니다. 그리고 0x7000번지에 있는 부트로더도 그대로 남아있습니다. 

avrdude를 명령프롬프트창에서 실행하지않고 MICROCHIP STUDIO에서 바로 실행하는 방법이 있습니다.

Arguments : -Cd:\new_computer\project\avr\avr_tools\avrdude.conf  -c AVR109 -p atmega32u4 -P COM43 -U flash:w:atmega32u4_breakout.hex
해당 설정처럼하면 tools를 눌렀을때 atmega32u4_avrdude 옵션이 나오고 클릭하면 펌웨어가 정상적으로 다운로드 됩니다.


참고사항))

HIGH.BOOTRST가 체크되어있으면 MCU가 리셋했을때, 부트로더영역부터 실행되고 체크가 안되어있으면 애플리케이션영역부터 실행합니다