티스토리 뷰
앞의 글에서 AVR이 시작될 때 조건에 따라 bootloader 모드로 진입하는지, 아니면 normal(application) 모드로 진입할 것인지 결정하는 프로그램을 만들어 보았다. 이 프로그램은 지금은 application flash section에서 동작된다.
이번 글에서는 이 프로그램이 bootloader flash section에서 바로 실행이 되도록 하는 방법에 대해서 설명하도록 하겠다.
위의 그림은 AVR data sheet 문서에 나오는 그림이다. Fuse register에 있는 BOOTSZ의 값에 따라 Bootloader flash section의 크기를 조정할 수 있다는 것을 설명하고 있다.
위의 표에서 BOOTSZ값에 따른 bootloader flash section의 크기와 주소 범위를 확인 할 수 있다. BOOTSZ의 디폴트값이 00으로 설정되어 있으므로 bootloader section의 크기는 2048Word이고 주소는 0x3800 ~ 0x3FFF이다. 참고로 이주소는 워드주소값이다. 바이트 주소로 표현하면 0x7000 ~ 0x7FFE가 된다. 표를 자세히 보면 bootloader section의 크기가 변경되면 bootloader section의 시작 주소가 따라서 바뀌는 것을 알 수 있다. section의 끝주소는 항상 일정하다.
그러므로 혹시 BOOTSZ의 값을 변경하게 되면 Bootloader section의 시작 위치가 어디서 시작되는지 반드시 확인하고 bootloader 프로그램이 이 주소에서 실행될 수 있도록 해주어야 한다.
위의 표는 Fuse registier에 있는 BOOTRST값에 따라 Reset Vector 주소를 설정할 수 있는것을 보여준다. 여기서 말하는 Reset vector 주소값이란 AVR이 처음 시작되는 주소를 의미한다. 표에서도 나오는것처럼 디폴트값이 1로 되어 있으므로 Reset vector 주소가 0으로 설정된다. 즉, application 프로그램 시작 주소가 되는 것이다. 만약 이 값을 0으로 만들면 bootloader flash section의 시작 주소가 reset vector주소가 된다.
그러므로 bootloader 프로그램을 동작 시키기 위해서는 BOOTRST 값을 0으로 만들면 된다.
그럼, Fuse register값을 변경해 보도록 하겠다.
위의 그림은 기존에 설정되어 있는 디폴트 fuse register 값을 보여주고 있다. BOOTRST값이 'unprogrammed' 되어 있는 것을 볼 수 있다.
BOOTSZ비트와 BOOTRST 비트는 Fuse High register에 있다. Fuse high 바이트값이 0xD1으로 나와 있으므로 BOOTSZ값은 00이고 BOOTRST값은 1로 되어 있음을 확인하였다. 이제 BOOTRST값을 0으로 변경하여 Reset vector주소가 0이 아닌 bootloader section의 시작 주소가 되도록 변경해 보겠다.
BOOTRST의 체크박스에 체크를 하면 HIGH register값이 0xD0로 변경되는 것을 볼 수 있다. "Program" 버튼을 눌러 변경된 값을 실제 CPU에 적용한다. 반드시 위의 화면을 닫았다가 다시 열어 변경된 값이 제대로 반영되었는지 확인하여야 한다. 위의 상태에서 "Program"버튼을 누르지 않고 그냥 창을 닫아 버리면 변경된 내용이 취소 된다.
이제 CPU는 bootloader section에서 시작될 수 있도록 만들어 놓았으니, bootloader 프로그램을 bootloader section으로 옮겨 보도록 하겠다.
먼저 Debug 폴더에서 map파일을 열어서 '.text' section이 어디서부터 시작되는지 확인한다.
.text 0x00000000 0x182
찾아보면 .text 섹션이 0번지에서 시작되고 크기는 0x182인것을 알 수 있다. lss 파일을 열어봐도 같은 내용을 확인할 수 있다.
'.text' 섹션을 0x7000번지로 이동하면 된다.
AtmelStudio의 속성창을 열어서 다음과 같은 내용을 추가한다.
위와 같이 변경하여 다시 컴파일 한 후 map파일과 lss 파일을 확인해 본다.
새로 만들어진 bootloader 프로그램을 보드에 적용하고 앞의 글에서 수행했던 UART를 통한 모드 선택하는 기능을 확인해 본다.
여기까지 문제 없이 동작되는것을 확인하였으면 본격적으로 bootloader 프로그램을 만들어 보기로 하겠다.
'프로젝트 > Bootloader' 카테고리의 다른 글
Bootloader - Flash memory write (3) | 2016.08.27 |
---|---|
Bootloader - Hex 파일 (8) | 2016.08.24 |
Bootloader - Device 정보 조회 (0) | 2016.08.19 |
Bootloader - 사전 준비 (3) | 2016.08.15 |
Bootloader (5) | 2016.08.15 |