본문 바로가기
Robot/Device Control

SmartRobot Board Bootloader (In-Application Program)

by lifeseed 2013. 11. 13.

※ 본 게시물은 Naver Cafe 오로카 (오픈소스 소프트웨어 & 하드웨어 : 로봇 기술 공유카페) 에서 포스팅한 것을 옮겨왔음을 알려드립니다.   http://cafe.naver.com/openrt/2668

 

1. IAP Concept

STM32에서는 System Memory Booting을 통한 Flash Firmware Download 외에 IAP라는 Flash Writing Application을 제공한다. ST Resource Page에 링크된 stsw-stm32008 이 바로 이와 관련된 예제 소스 코드이다.

IAP는 플래쉬의 Base Address에 최소 사이즈로 Writing 되어 있으며, 부팅시 스위치 등에 의해 Firmware를 Flash에 다운로딩할지, Flash에 다운로드되어 있는 이미지를 실행할지 결정하게 된다.

 

Source Code :: srbd-iap.zip 

 
첨부된 코드는 USB 커넥터와 가까운 부분의 스위치를 이용하였으며, 스위치가 눌러진 상태에서 부팅될 경우 Download 기능을 선택할 수 있는 메뉴모드로 진입하고, 그렇지 않은 경우엔 Flash에 저장된 이미지를 실행하게 된다.

 

부트모드 진입을 위한 버튼설정만 변경한다면 꼭 STM32F10x가 탑재된 어떤 보드라도 동작할 것이다. 

컴파일된 bootloader Binary는 ST에서 제공하는 Flash Write 툴을 이용하여 Flash에 Write하여하 한다. 

 

2. Flash Memory Map 

 

 

 

 
앞서 언급한 바와 같이 IAP를 포함한 BootLoader가 Flash의 Base Address인 0x8000000에 저장되어 있으며, 부팅시 시작코드가 된다.
Bootloader에서는 S/W에 의해 다운로드 모드로 갈지, 부팅 모드로 갈지 결정하게 되고, 부팅 모드로 갈 경우, 0x8004000에 저장된 코드로 점프하게 된다.
 
이때 0x8004000에 저장될 Firmware는 linkscript를 약간 수정해야 한다.
기존에는 일반적으로 FLASH의 Base Address가 0x8000000으로 지정되어 있으나, 플래쉬 메모리 맵에서 보는 바와 같이 Base Address가 0x8004000으로 변경되어야 한다.
 
 
기존에 배포한 코드의
.\arch\stm32f10x\stm32f103cb-ROM.ld  파일에서 3번째 라인을 아래와 같이 수정해야한다.
  FLASH (rx) : ORIGIN = 0x08004000, LENGTH = 0x1C000   /* 128k-0x4000 */
바람님이 배포한 코드의 경우
.\Build\STM32F10x_128k_20k_flash.ld 파일에서 19번째 라인을 다음과 같이 수정하면 된다.
  FLASH    (RX)  : ORIGIN = 0x08000000+0x4000, LENGTH = 128K-2K-16K
 
 
이렇게 link script를 수정하고 빌드할 경우 0x800 4000 에 Stack Point의 초기 값이 들어가고, 0x8004004에 ResetHandler의 시작주소가 들어가게된다.
 
이때 부트로더에서는 아래의 명령으로 Firmware 호출이 가능해진다.
 
 
  pFunction Jump_To_Application;
  Jump_To_Application = (pFunction) (0x8004004);
  __set_MSP(*(vu32*) 0x8004000);
  Jump_To_Application();
 
 

3. IAP를 이용한 Download

IAP는 UART 통신상에서 Y-Modem Protocol을 이용하여 download 및 upload가 수행된다.
Flash Size보다 RAM Size가 작은 경우 Flash에 Write할 데이터는 일부 데이터를 전송해서 Flash에 write하고 이를 확인 한 후 다시 그 다음 데이터를 전송하는 방식을 사용해야 하는데, Y-Modem은 128 혹은 1024 byte씩 동기화를 맞추어 Host - Slave 간에 데이터를 주고 받는 방식이므로, 이를 이용하여 IAP기능이 어렵지 않게 구현 되었다.
 
아래는 부팅시 IAP로 진입한 상태의 UART 메세지이다.
(Bootloader가 Flash 0x8000000에 저장되어 있는 상태에서 USB 커넥터 부근에 있는 Switch (SW3)를 누르고 부팅(혹은 Reset) 하면 된다.)

 

 
'1' 을 눌러 Download 모드를 선택하고 y-modem을 이용하여 컴파일된 firware를 전송하도록 하자.

 


 
TeraTerm에서 YModem전송시 Progress 상태를 알 수 있다. 
 
다운로드가 완료되면 Name및 Size가 출력되고 다시 메뉴가 출력된다. 
3번을 누르거나 Switch (SW3)를 누르지 않은 상태에서 Reset 키 혹은 전원을 껐다 켜면 Firmware가 실행된다.

 

참고 자료

[1] stsw-stm32008