본문 바로가기

[ST_MICRO]/STM32F1

[STM32 EVM]부트로더 제작 ( In-Application Programming with USART )

[STM32 EVM]부트로더 제작 ( In-Application Programming with USART )

사용자 삽입 이미지



JTAG없이 마이컴 테스트 할때 가장 문제점이 플래시 다운로드 이다. ST에서 제공하는 프로그램은 속도도 느리고 라이팅 할때 마다 프로그램을 다시 시작해야 하므로 상당히 불편하다.
간단한 장비와 손쉬운 프로그램을 위해 ST에서 부트로더 방법을 설명하고 있는데 ST홈페이지에
STM32F10xxx in-application programming using the USART 라고 예제 소스를 제공하고 있다.(STM32 IAP)





이 파일을 받아서 약간의 수정으로 시리얼 부트로더를 제작해 보았다.
제공되는 부트로더를  0x800 0000 ~ 0x800 1FFF에 올려 두고 사용자 프로그램을 0x800 2000 이후에 올라 가도록 프로그램을 작성해서 부트로더를 통해 시리얼로 다운로드 하는 방식이다.
사용자 프로그램 작성할때 약간 수정을 해 주어야 하는 단점은 있지만 자주 수정해야 할 필요가 있을때 개발을 상당히 빠르게 진행 할 수 있다



먼저 [STM32 EVM]을 위해 만든 부트로더를 ST의 Flash Loader를 이용하거나 내가 만든 Flash Write로 0x800 0000번지로 다운로드 한다.

STM32 EVM을 위해 수정된 부트로더  (STM32-48, STM32-64 EVM모두 적용가능)

소스코드




다운로드 후 실행하면 시리얼 포트 115200 baudrate로 접속하면 부트로더의 메세지가 출력된다.
이때 부트로더의 진입 STM32 EVM의 SW1을 누른 상태에서 리셋을 누르면 부트로더로 실행되고 시리얼 포트로 메세지를 출력한다. 만약 그냥 리셋하면 사용자 프로그램이 실행된다.



사용자 프로그램은 0x800 2000번지부터 동작 하도록 작성해야 하므로  ld파일을 수정한 예제를 다운 받는다.




그리고 예제에는 system.c파일에 있는 인터럽터 백터테이블의 옵셋도 0x2000번지로 수정 했다.
void NVIC_Configuration(void)
{
#ifdef  VECT_TAB_RAM 
  /* Set the Vector Table base location at 0x20000000 */
  NVIC_SetVectorTable(NVIC_VectTab_RAM, 0x0);
#else  /* VECT_TAB_FLASH  */
  /* Set the Vector Table base location at 0x08000000 */
  NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x2000);  
#endif
}

시리얼포트로 1을 전송하하고 [파일 보내기]를 이용하여 파일을 전송한다. 이때 프로토콜을 "Ymodem"으로 설정하면 된다.



사용자 프로그램이 다운로드 되면 바로 0x800 2000번지로 실행을 하게 된다.



STM32-48 EVM에도 적용하여 테스트 했는데 부트로더 IAP 로 잘 동작한다.
간단히 수정하고 많은 예제 테스트 할때는 편리하게 사용할 수 있을것 같고 앞으로 이더넷이나 USB로 펌웨어를 업데이트 할 수 있도록 수정 해야 겠다.




참고로 IAR에서는 XCL파일을 수정할 필요가 있다.
// Code memory in FLASH
-DROMSTART=0x8002000
-DROMEND=0x801FFFF

// Data in RAM
-DRAMSTART=0x20000000
-DRAMEND=0x20004FFF

반응형