__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 ) ;
}
'초보의 아웅다웅 설계하기 > STM32' 카테고리의 다른 글
[STM32H5]GENERAL TIMER VS ADVANCED TIMER (0) | 2025.02.19 |
---|---|
[STM32L031]FLASH 라이팅 문제 (0) | 2024.12.20 |
CRC 8-MAXIM, 16-ARC (0) | 2024.11.21 |
[STM32L031] RNG 없음 (0) | 2024.09.27 |
[STM32]H5xx 핀 정의 (0) | 2024.09.05 |