APP 에서 BOOT로
__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 ) ;
}