STM32를 이용해 Bootloader를 만들어야 할 이유는 다양하다. 보통은 Flash 영역 쓰기를 손쉽게 하기 위해서 사용하는데, 지금 목적은 매우 단순하다.

MPU - STM32F407VGT6

갑작스레 참여하게 된 Project.

편의를 위해 단순히 0x08020000으로 Jump 하는 Bootloader를 아래와 같이 작성하였다.

아래 Code는 STM32CubeIDE 에서 작성하였다.

main.c

volatile uint32_t appAddress = 0x08020000 ;
volatile uint32_t mspBegin   = 0x20000000 ;
volatile uint32_t mspEnd     = 0x20030000 ;
volatile uint32_t msp        = ( * ( __IO uint32_t * ) appAddress ) ;

void ( ** pJumpFunc )( void ) = ( void ( ** )( void ) )( appAddress + 4 ) ;

char isWritten = 0x00 ;
if( ( uint32_t )( *pJumpFunc ) != 0xFFFFFFFF )
{
    isWritten = 0x01 ;
}

if( isWritten && mspBegin <= msp && msp <= mspEnd )
{
    HAL_DeInit() ;
    ( *pJumpFunc )() ;
}

STM32CubeIDE를 통해 Program의 시작 위치를 변경하려면,

STM32F407VGTX_FLASH.ld

MEMORY
{
  CCMRAM   (xrw)    : ORIGIN = 0x10000000,   LENGTH = 64K
  RAM      (xrw)    : ORIGIN = 0x20000000,   LENGTH = 128K
  FLASH    (rx)     : ORIGIN = 0x8020000,    LENGTH = 896K   // <--- ORGIN and LENGTH
}