로망와니 2025. 2. 13. 22:22

__attribute__( ( naked, noreturn ) ) void BootJumpASM( uint32_t SP, uint32_t RH )
{
  __asm("MSR      MSP,r0");
  __asm("BX       r1");
}

void BootJump(uint32_t *Address)
{
DEBUGPRINT("Boot Jump\r\n");

if( CONTROL_nPRIV_Msk & __get_CONTROL( ) ){  /* not in privileged mode */
}
// 2. NVIC 인터럽트 초기화
for (int i = 0; i < 8; i++) {
NVIC->ICER[i] = 0xFFFFFFFF;
NVIC->ICPR[i] = 0xFFFFFFFF;
}

SysTick->CTRL = 0 ;
SCB->ICSR |= SCB_ICSR_PENDSTCLR_Msk ;

SCB->SHCSR &= ~( SCB_SHCSR_USGFAULTENA_Msk | \
 SCB_SHCSR_BUSFAULTENA_Msk | \
 SCB_SHCSR_MEMFAULTENA_Msk ) ;

if( CONTROL_SPSEL_Msk & __get_CONTROL( ) ){  /* MSP is not active */
__set_MSP( __get_PSP( ) ) ;
__set_CONTROL( __get_CONTROL( ) & ~CONTROL_SPSEL_Msk ) ;
}

SCB->VTOR = ( uint32_t )Address ;
BootJumpASM( Address[ 0 ], Address[ 1 ] ) ;
}

 

void main(void)

{

BootJump( ( uint32_t * )IAP_ADDRESS ) ;

}