티스토리 뷰

Bootloader 프로그램이 동작되는 CPU의 상세정보를 알아내었고, 이 CPU에서 동작되는 application 프로그램의 Hex 파일로부터 데이터를 문제없이 추출하였으므로, 이제 다음 단계로 Hex 파일에서 추출한 데이터를 실제 CPU 내부 flash memory에 write 하는 기능을 구현해 보도록 하겠다.


이미 앞에서도 설명하였듯이 Flash 메모리에 데이터를 쓰기 위해서는 해당 영역을 지우는(Erase) 동작이 선행되어야 한다.

Erase에 대한 명령은 'e'를 사용한다.  Flash 메모리의 erase는 page 단위로 이루어지므로 page의 크기와 몇개의 page를 지워야 하는지 알려주어야 한다.

Bootloader 프로그램은 위의 정보를 이용하여 필요한 크기만큼만 Flash 메모리를 지우는 동작을 수행한다.


Erase 동작이 문제없이 수행된후에 application 프로그램의 시작주소에서부터 데이터를 쓰는(program) 동작을 수행한다.

PC 프로그램에서 AVR bootloader 프로그램으로 내리는 명령어는 block 로딩과 개별 data 로딩이 있다.

Data 로딩을 수행할 때 우선적으로 해줘야 하는것은 어떤 주소에 데이터를 써야 하는지 알려주기 위하여 주소값을 먼저 전달한다.

주소값 전달을 위한 명령은 'A'이다.  주소값은 16비트(2바이트)로 되어 있으며 상위바이트 값을 먼저 전달한 후, 이어서 하위 바이트 주소값을 전달한다.


개별 data 로딩은 항상 2바이트 단위로 전달되는데 반드시 하위바이트를 먼저 보내고 상위바이트를 이어서 보내야 한다.

하위데이터를 보낼때 사용되는 명령어는 'c'이며, 상위바이터 데이터에 대한 명령은 'C'이다.

9번 줄에 보이는 코드는 수신된 데이터를 page buffer에 쓰는 동작을 하는 것이다.  Bootloader 프로그램이 application flash memory에 데이터를 기록할때는 해당 주소에 데이터를 직접 쓰지 않고 page buffer에 데이터를 쓴다음, 이 page buffer를 한꺼번에 flash 메모리로 옮겨야 한다.


Block 로딩을 수행하기 위한 명령은 'B"로 시작된다.  Block 로딩 명령어에 이어서 몇개의 데이터를 내려보낼지 block 사이즈를 알려준다.  그 다음에는 memory type을 알려주는 명령어를 보내준다.  메모리 type에 대한 명령은 'F'와 'E'가 있다.  'F'는 flash 메모리를 의미하는 것이고, 'E'는 EEPROM 메모리를 의미하는 것이다.  이번 글에서는 flash 메모리만 설명할 것이므로 memory type은 'F'만 고려하기로 한다.

Memory type다음에는 block size만큼의 데이터를 연속해서 보내준다.  모든 데이터에 대한 수신이 완료되었으면 page buffer에 임시로 기록해 두었던 데이터를 실제 flash 메모리에 덤프하는 코드를 수행하여 물리적인 flash메모리에 데이터를 기록하게 된다.


위의 코드를 적용하여 Hex 파일의 데이터를 AVR의 application memory 영역에 옮겨보도록 하겠다.

위의 그림은 에러없이 성공적으로 수행된 결과를 보여주고 있다.  프로그램 상으로는 문제없이 보였지만, 실제로 데이터가 잘 쓰여졌는지 반드시 확인해 보아야 한다.

AVR의 flash 메모리에서 데이터를 읽어오기 위해서 AtmelStudio에서 제공하는 기능을 이용하면된다.

위의 그림처럼 AtmelStudio에서 'Device Programming' 창을 열어 'Memories' 항목을 선택하고 빨간박스에 보이는 'Read' 버튼을 클릭하면 AVR에서 읽어 들일 데이터를 저장하기위한 파일을 선택하는 dialog box가 나타난다. 적당한 이름을 선택한 후 확인을 눌러주면 Flash 메모리의 전영역의 데이터를 읽어온다.  읽어온 데이터를 저장한 파일을 열어 Bootloader 프로그램을 이용하여 다운로드한 원본 파일과 비교해본다.

위의 데이터가 AtmelStudio에서 읽어온 내용이다.  이 데이터를 원본 Hex 파일과 비교해 보면된다.  비교하는 과정은 비교적 간단하다.  맨 마지막 1바이트 값이 체크섬 값이므로 이 값만 비교해보면 나머지 데이터는 굳이 확인하지 않아도 된다.

원본 파일과 비교해 보았더니 모든 체크섬값이 동일하게 보였다. 즉, 에러없이 write된것을 확인하였다.

그러나 매번 AtmelStudio를 이용하여 데이터가 잘 쓰여졌는지 확인하기 불편하므로 PC 프로그램의 'Verify' 체크박스를 체크한 경우 'Write'이후 즉시 'Verify' 하는 기능을 구현해 보도록 하겠다.


Verify 기능은 비교적 단순하다.  그냥 메모리 시작에서부터 필요한 부분까지 연속해서 읽어 오기만 하기 때문이다.

메모리 read 명령은 'R'이다.  Bootloader 프로그램이 'R'명령을 받으면 해당 주소에서 상위바이트를 먼저 읽어서 PC로 보내주고, 연속해서 해당주소에서 하위바이트를 읽어서 PC로 보내주면 된다.


Verify 기능을 추가해서 수행한 결과 화면은 다음과 같다.

읽어온 데이터가 write한 데이터와 동일한것을 확인하였다.


이제 마지막으로 할일은 'Write'와 'Verify'가 성공적으로 동작하였거나,

Bootloader 모드가 아닌 Normal 모드로 진입하였을때 application flash 메모리의 시작 주소인 0번지로 점프하는 코드를 추가하여 bootloader 프로그램에서 빠져나와  application 프로그램이 동작되도록 하겠다.


Bootloader 모드에서 빠져 나오게 하는 명령어는 'E'이다.

Bootloader 프로그램이 PC로부터 'E'를 수신하면 다음과 같은 코드를 수행하여 application program의 시작 주소인 0번지로 점프하게 된다.


PC프로그램의 UART 커넥션을 끊거나, PC프로그램을 닫을 때, AVR에서 어떤 변화가 생기는지 확인해 본다.

또한 AVR이 처음 동작될때 PC 프로그램과의 연결이 없을때 일정 시간 경과후 application program이 동작되는지도 확인해 본다.


AvrBootloader.pybootloader.c



댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
TAG
more
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함