121 lines
3.2 KiB
ArmAsm
121 lines
3.2 KiB
ArmAsm
/*
|
|
* STM32N6 FSBL stub Cortex-M55 startup for the GCC toolchain.
|
|
*
|
|
* The boot ROM loads the entire payload (incl. .text + .data) into AXISRAM2
|
|
* at the address in the FSBL header, so only a .data LMA->VMA copy is
|
|
* required (no flash-to-RAM .text copy).
|
|
*
|
|
* .data copy and .bss zero must run BEFORE SystemInit, otherwise SystemInit
|
|
* writes to HAL globals (uwTick, SystemCoreClock) land in uninitialised
|
|
* memory and HAL_GetTick() reads garbage on the first HAL timeout.
|
|
*
|
|
* The default exception handlers are stub infinite loops. SysTick_Handler
|
|
* is overridden by stm32n6xx_it.c which calls HAL_IncTick.
|
|
*/
|
|
|
|
.syntax unified
|
|
.arch armv8.1-m.main
|
|
.fpu softvfp
|
|
.thumb
|
|
|
|
.global g_pfnVectors
|
|
.global Default_Handler
|
|
|
|
/* Linker symbols used below */
|
|
.word _sidata
|
|
.word _sdata
|
|
.word _edata
|
|
.word _sbss
|
|
.word _ebss
|
|
|
|
.section .text.Reset_Handler
|
|
.weak Reset_Handler
|
|
.type Reset_Handler, %function
|
|
Reset_Handler:
|
|
ldr r0, =_sstack
|
|
msr MSPLIM, r0
|
|
ldr r0, =_estack
|
|
mov sp, r0
|
|
|
|
/* Copy .data from LMA (end of .text in ROM region) to VMA (RAM). */
|
|
ldr r0, =_sdata
|
|
ldr r1, =_edata
|
|
ldr r2, =_sidata
|
|
movs r3, #0
|
|
b LoopCopyDataInit
|
|
CopyDataInit:
|
|
ldr r4, [r2, r3]
|
|
str r4, [r0, r3]
|
|
adds r3, r3, #4
|
|
LoopCopyDataInit:
|
|
adds r4, r0, r3
|
|
cmp r4, r1
|
|
bcc CopyDataInit
|
|
|
|
/* Zero-fill .bss. */
|
|
ldr r2, =_sbss
|
|
ldr r4, =_ebss
|
|
movs r3, #0
|
|
b LoopFillZerobss
|
|
FillZerobss:
|
|
str r3, [r2]
|
|
adds r2, r2, #4
|
|
LoopFillZerobss:
|
|
cmp r2, r4
|
|
bcc FillZerobss
|
|
|
|
bl SystemInit
|
|
bl main
|
|
LoopForever:
|
|
b LoopForever
|
|
.size Reset_Handler, .-Reset_Handler
|
|
|
|
.section .text.Default_Handler, "ax", %progbits
|
|
Default_Handler:
|
|
b Default_Handler
|
|
.size Default_Handler, .-Default_Handler
|
|
|
|
/* Cortex-M55 vector table — only the system vectors are populated.
|
|
* IRQ handlers default to Default_Handler via .weak aliases. */
|
|
.section .isr_vector, "a", %progbits
|
|
.type g_pfnVectors, %object
|
|
g_pfnVectors:
|
|
.word _estack
|
|
.word Reset_Handler
|
|
.word NMI_Handler
|
|
.word HardFault_Handler
|
|
.word MemManage_Handler
|
|
.word BusFault_Handler
|
|
.word UsageFault_Handler
|
|
.word SecureFault_Handler
|
|
.word 0
|
|
.word 0
|
|
.word 0
|
|
.word SVC_Handler
|
|
.word DebugMon_Handler
|
|
.word 0
|
|
.word PendSV_Handler
|
|
.word SysTick_Handler
|
|
.size g_pfnVectors, .-g_pfnVectors
|
|
|
|
.weak NMI_Handler
|
|
.thumb_set NMI_Handler, Default_Handler
|
|
.weak HardFault_Handler
|
|
.thumb_set HardFault_Handler, Default_Handler
|
|
.weak MemManage_Handler
|
|
.thumb_set MemManage_Handler, Default_Handler
|
|
.weak BusFault_Handler
|
|
.thumb_set BusFault_Handler, Default_Handler
|
|
.weak UsageFault_Handler
|
|
.thumb_set UsageFault_Handler, Default_Handler
|
|
.weak SecureFault_Handler
|
|
.thumb_set SecureFault_Handler, Default_Handler
|
|
.weak SVC_Handler
|
|
.thumb_set SVC_Handler, Default_Handler
|
|
.weak DebugMon_Handler
|
|
.thumb_set DebugMon_Handler, Default_Handler
|
|
.weak PendSV_Handler
|
|
.thumb_set PendSV_Handler, Default_Handler
|
|
.weak SysTick_Handler
|
|
.thumb_set SysTick_Handler, Default_Handler
|