티스토리 뷰
Bootloader 프로젝트는 UART를 이용하여 진행되므로 UART 연결 회로를 구성하여야 되고, 디버깅 목적으로 LED 하나를 연결하는 회로를 추가하면 된다.
위의 회로가 정상적으로 연결되었는지 확인하는것으로부터 프로젝트를 시작하도록 하겠다.
uart.c 파일은 심화 과정중에서 패킷통신 글에서 사용하였던 파일을 그대로 사용하도록 하겠다. 그리고 위에 보이는 uart_poll() 이라는 함수를 추가하였다. 이미 기존에 사용하였던 uart_rx()함수는 UART로 어떤 데이터가 수신될 때까지 무한히 기다리는 함수이다. 다시 말해서 새로운 데이터가 수신되지 않으면 더 이상 프로그램이 진행되지 않고 멈추어 있는것처럼 보이게 된다.
이에 반해 uart_poll() 함수는 UART로부터 새로운 데이터가 있으면 그 데이터값을 리턴해주면 되고, 만일 아무런 데이터가 수신되지 않았으면 단순히 0을 리턴해주는 기능을 수행한다. 그러므로 UART 수신 여부와 관계없이 다음 동작으로 넘어갈 수 있게 된다.
위의 코드를 실행하면 LED가 1초 주기로 깜빡이는 것을 볼 수 있을것이다. 그리고 UART터미널에서 아무 글자를 보내면 echo 되어서 다시 UART 터미널에 보여지는 것을 확인할 수 있다. 만약 uart_poll()을 사용하지 않고, uart_rx() 함수를 사용했다면 LED가 주기적으로 점멸하는 동작은 하지 않게 된다.
UART 통신과 LED 점멸이 정상적으로 동작되는 것을 확인하였으면 다음 단계로 넘어가도록 하겠다.
앞의 글에서도 설명하였지만 bootloader 프로그램은 application program을 업데이트 할 경우에만 동작을 하고, 그렇지 않은 경우에는 바로 0번지로 점프하여 기존에 만들어져 있던 Application 프로그램이 실행되도록 하여야 한다.
AVR109에 설명되어 있는 방법은 푸쉬버튼을 이용하여 모드를 결정한다. bootloader 프로그램이 실행될 때 버튼이 눌러져 있으면 bootloader 프로그램 모드로 진입하게 하고, 버튼이 눌리워져 있지 않으면 application 프로그램으로 점프되도록 되어 있다.
그러나, 이 블로그에서는 별도의 푸쉬버튼을 사용하지 않고 UART 만으로 이러한 모드를 선택하는 방법으로 설명하도록 하겠다.
그 절차는 다음과 같다.
1. 컴퓨터에서 AVR의 bootloader가 시작되기 전에 'B'라는 글자를 반복해서 송신한다.
2. AVR의 bootloader 프로그램이 시작되면서 UART로 'B'라는 글자가 들어오는지 모니터링 한다.
3. 일정 시간동안 UART로 'B'라는 문자가 수신되지 않으면 application 프로그램 영역으로 점프한다.
4. 만약 일정 시간이 경과되기 전에 'B'를 수신하면 'R'을 회신한다.
5. 컴퓨터에서 'B'에 대한 request에 'R' reply가 수신되면 'T'를 송신한다.
6. AVR bootloader는 'T'에 대하여 'E'을 회신한다.
7. 컴퓨터에서 'E'를 수신하면 'L'을 송신한다.
8. AVR bootloader는 'L'에 대하여 'D'를 회신한다.
9. 컴퓨터에서 'D'를 회신하면 마지막으로 'D'를 송신한다.
10. AVR bootloader는 'D'에 대한 회신으로 'Y'를 송신한 후 bootloader mode로 진입한다.
11. 컴퓨터에서 'Y'를 수신하면 application 프로그램 로딩 절차를 수행한다.
요약하면 컴퓨터에서 'BTLD'를 차례로 보내고, AVR bootloader에서는 'REDY'를 회신하는 절차를 수행하는 것이다.
AVR bootloader에서의 동작을 flow chart로 표현하면 위의 절차가 된다.
wait_nego_char() 함수는 특정 글자가 수신되는지 모니터링하다가 해당 문자가 들어 오면 0을 리턴하고, 만약 일정시간동안 해당 문자가 들어오지 않으면 -1을 리턴한다.
위의 코드에서 보듯이 모든 절차가 성공적으로 완료되면 LED를 켜놓은 상태로 유지된다. 즉, LED가 계속 켜져 있으면 컴퓨터 프로그램과 연결이 잘 되었다고 판단하여 bootloader 모드로 들어갈 수 있다는 뜻이다.
AVR이 처음 동작되는 시점에 컴퓨터에서 적절한 문자가 순서대로 들어오지 않으면 노말 모드로 진입하도록 한다.
Bootloader 모드로 진입하면 LED가 계속 켜져 있는 상태가 되고, Normal 모드로 들어가게 되면 LED가 1초 주기로 점멸하므로 어떤 모드로 들어가게 되는지 눈으로 확인할 수 있다.
위의 그림은 컴퓨터 프로그램에서 UART 포트를 오픈하자마자 계속 네고 문자를 보냈음에도 불구하고 AVR로부터 아무런 응답이 없는 상태인것을 보여 주는 것이다.
위의 그림은 timeout 되기전에 AVR과 연결이 성공적으로 진행된 경우를 보여 주고 있다. 이 상태에서 AVR 보드를 보면 LED가 계속 켜진 상태를 유지하고 있게 된다.
지금까지는 bootloader 프로그램을 본격적으로 구현하기에 앞서 UART를 통하여 bootloader 모드로 진입하는 절차가 잘 이루어지는지 확인하기 위한 코드를 만들어 보았을 뿐이다. 즉, 이 프로그램 역시 일반적인 application 프로그램이라고 보면 된다.
'프로젝트 > Bootloader' 카테고리의 다른 글
Bootloader - Flash memory write (3) | 2016.08.27 |
---|---|
Bootloader - Hex 파일 (8) | 2016.08.24 |
Bootloader - Device 정보 조회 (0) | 2016.08.19 |
Bootloader - Bootloader flash section에서 프로그램 시작 (0) | 2016.08.17 |
Bootloader (5) | 2016.08.15 |