/**
*************** © COPYRIGHT 2017 Tsinghua University ************************
- @file startup.s
- @author Tsinghua
- @brief
*/
.syntax unified
.arch armv7-m;使用统一语法的ARMv7--M3
.cpu cortex-m3
.fpu softvfp;软件浮点单元
.thumb;使用Thum;指令集
.global g_pfnVectors: ;声明 g_pfnVectors 作为一个全局符号,通常用于中断向量表。
.global Default_Handler: ;声明 Default_Handler 作为一个全局符号,用于处理未预期的中断。
/* start address for the initialization values of the .data section.
defined in linker script /
.word __sidata
/ start address for the .data section. defined in linker script /
.word __sdata
/ end address for the .data section. defined in linker script /
.word __edata
/ start address for the .bss section. defined in linker script /
.word __sbss
/ end address for the .bss section. defined in linker script */
.word __ebss
/这些符号定义了.data段初始化值的起始地址和结束地址,以及.bss段的起始地址和结束地址。这些通常在链接脚本中定义。/
/**
-
@brief This is the code that gets called when the processor first
-
starts execution following a reset event. Only the absolutely
-
necessary set is performed, after which the application
-
supplied main() routine is called.
-
@param None
-
@retval : None
*/
复位处理函数 (Reset_Handler)
这段代码在处理器启动或复位后首先执行。.section .text.Reset_Handler
.weak Reset_Handler
.type Reset_Handler, %function
Reset_Handler:
cpsid i ; 关闭中断
ldr r0, =__estack ; 加载栈顶地址
mov sp, r0 ; 设置栈指针
/* 将数据段的初始化值从flash复制到SRAM */
movs r1, #0 ; 初始化数据复制索引
b LoopCopyDataInit ; 跳转到开始复制数据的地方
CopyDataInit:
ldr r3, =__sidata ; 加载flash中初始化值的地址
ldr r3, [r3, r1] ; 从flash中加载数据
str r3, [r0, r1] ; 存储数据到SRAM
adds r1, r1, #4 ; 增加数据复制索引
LoopCopyDataInit:
ldr r0, =__sdata ; 加载.data段的起始地址
ldr r3, =__edata ; 加载.data段的结束地址
adds r2, r0, r1 ; 计算当前要复制的地址
cmp r2, r3 ; 比较当前地址与结束地址
bcc CopyDataInit ; 循环直到所有数据复制完成
ldr r2, =__sbss ; 加载.bss段的起始地址
b LoopFillZerobss ; 跳转到开始清零.bss段的地方
/* 清零bss段 */
FillZerobss:
movs r3, #0 ; 初始化为零
str r3, [r2], #4 ; 存储零并增加地址
LoopFillZerobss:
ldr r3, = __ebss ; 加载.bss段的结束地址
cmp r2, r3 ; 比较当前地址与结束地址
bcc FillZerobss ; 循环直到.bss段清零完成
/* 跳转到C代码 */
bl main ; 跳转到main函数
bx lr ; 返回到调用者
.size Reset_Handler, .-Reset_Handler
/**
- @brief This is the code that gets called when the processor receives an
-
unexpected interrupt. This simply enters an infinite loop, preserving
-
the system state for examination by a debugger.
- @param None
- @retval : None
*/
.section .text.Default_Handler,“ax”,%progbits
Default_Handler:;默认中断处理函数,当处理器收到未预期的中断时,执行无限循环以保持系统状态。
Infinite_Loop:
b Infinite_Loop
.size Default_Handler, .-Default_Handler
/******************************************************************************
*
- The minimal vector table for a Cortex M3. Note that the proper constructs
- must be placed on this to ensure that it ends up at physical address
- 0x0000.0000.
******************************************************************************/
.section .isr_vector,“a”,%progbits
.type g_pfnVectors, %object
.size g_pfnVectors, .-g_pfnVectors
g_pfnVectors:
.word __estack
.word Reset_Handler
.word NMI_Handler
.word HardFault_Handler
.word MemManage_Handler
.word BusFault_Handler
.word UsageFault_Handler
.word 0
.word 0
.word 0
.word 0
.word SVC_Handler
.word DebugMon_Handler
.word 0
.word PendSV_Handler
.word SysTick_Handler
.word GPIO_0_IRQHandler /* 00 */
.word GPIO_1_IRQHandler /* 01 */
.word GPIO_2_IRQHandler /* 02 */
.word GPIO_3_IRQHandler /* 03 */
.word GPIO_4_IRQHandler /* 04 */
.word GPIO_5_IRQHandler /* 05 */
.word GPIO_6_IRQHandler /* 06 */
.word GPIO_7_IRQHandler /* 07 */
.word GPIO_8_IRQHandler /* 08 */
.word GPIO_9_IRQHandler /* 09 */
.word GPIO_10_IRQHandler /* 10 */
.word GPIO_11_IRQHandler /* 11 */
.word GPIO_12_IRQHandler /* 12 */
.word GPIO_13_IRQHandler /* 13 */
.word GPIO_14_IRQHandler /* 14 */
.word GPIO_15_IRQHandler /* 15 */
.word RESERVED_IRQHandler /* 16 */
.word RESERVED_IRQHandler /* 17 */
.word RESERVED_IRQHandler /* 18 */
.word RESERVED_IRQHandler /* 19 */
.word RESERVED_IRQHandler /* 20 */
.word RESERVED_IRQHandler /* 21 */
.word RESERVED_IRQHandler /* 22 */
.word SM2_IRQHandler /* 23 */
.word RSA_IRQHandler /* 24 */
.word RESERVED_IRQHandler /* 25 */
.word RESERVED_IRQHandler /* 26 */
.word RESERVED_IRQHandler /* 27 */
.word RESERVED_IRQHandler /* 28 */
.word RESERVED_IRQHandler /* 29 */
.word RESERVED_IRQHandler /* 30 */
.word RESERVED_IRQHandler /* 31 */
.word RPU_IRQHandler /* 32 */
.word RESERVED_IRQHandler /* 33 */
.word RESERVED_IRQHandler /* 34 */
.word RESERVED_IRQHandler /* 35 */
.word RESERVED_IRQHandler /* 36 */
.word RESERVED_IRQHandler /* 37 */
.word RESERVED_IRQHandler /* 38 */
.word PCIE_IRQHandler /* 39 */
.word DMAC_H_IRQHandler /* 40 */
.word GMII_1_N_IRQHandler /* 41 */
.word SDIO_IRQHandler /* 42 */
.word GMII_N_IRQHandler /* 43 */
.word RTC_IRQHandler /* 44 */
.word TIMER_1_IRQHandler /* 45 */
.word TIMER_2_IRQHandler /* 46 */
.word TIMER_3_IRQHandler /* 47 */
.word TIMER_4_IRQHandler /* 48 */
.word TIMER_5_IRQHandler /* 49 */
.word TIMER_6_IRQHandler /* 50 */
.word TIMER_7_IRQHandler /* 51 */
.word TIMER_8_IRQHandler /* 52 */
.word UART_1_IRQHandler /* 53 */
.word UART_2_IRQHandler /* 54 */
.word I2C_1_IRQHandler /* 55 */
.word RESERVED_IRQHandler /* 56 */
.word SPI_IRQHandler /* 57 */
.word RESERVED_IRQHandler /* 58 */
.word WDT_IRQHandler /* 59 */
.word GMII_CFP_IRQHandler /* 60 */
.word I2C_2_IRQHandler /* 61 */
.word PCIE_CMDQ_IRQHandler /* 62 */
.word PCIE_MSIX_IRQHandler /* 63 */
/*******************************************************************************
*
- Provide weak aliases for each Exception handler to the Default_Handler.
- As they are weak aliases, any function with the same name will override
- this definition.
*******************************************************************************/
.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 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
.weak RESERVED_IRQHandler
.thumb_set RESERVED_IRQHandler,Default_Handler
/* 00 */
.weak GPIO_0_IRQHandler
.thumb_set GPIO_0_IRQHandler,Default_Handler
/* 01 */
.weak GPIO_1_IRQHandler
.thumb_set GPIO_1_IRQHandler,Default_Handler
/* 02 */
.weak GPIO_2_IRQHandler
.thumb_set GPIO_2_IRQHandler,Default_Handler
/* 03 */
.weak GPIO_3_IRQHandler
.thumb_set GPIO_3_IRQHandler,Default_Handler
/* 04 */
.weak GPIO_4_IRQHandler
.thumb_set GPIO_4_IRQHandler,Default_Handler
/* 05 */
.weak GPIO_5_IRQHandler
.thumb_set GPIO_5_IRQHandler,Default_Handler
/* 06 */
.weak GPIO_6_IRQHandler
.thumb_set GPIO_6_IRQHandler,Default_Handler
/* 07 */
.weak GPIO_7_IRQHandler
.thumb_set GPIO_7_IRQHandler,Default_Handler
/* 08 */
.weak GPIO_8_IRQHandler
.thumb_set GPIO_8_IRQHandler,Default_Handler
/* 09 */
.weak GPIO_9_IRQHandler
.thumb_set GPIO_9_IRQHandler,Default_Handler
/* 10 */
.weak GPIO_10_IRQHandler
.thumb_set GPIO_10_IRQHandler,Default_Handler
/* 11 */
.weak GPIO_11_IRQHandler
.thumb_set GPIO_11_IRQHandler,Default_Handler
/* 12 */
.weak GPIO_12_IRQHandler
.thumb_set GPIO_12_IRQHandler,Default_Handler
/* 13 */
.weak GPIO_13_IRQHandler
.thumb_set GPIO_13_IRQHandler,Default_Handler
/* 14 */
.weak GPIO_14_IRQHandler
.thumb_set GPIO_14_IRQHandler,Default_Handler
/* 15 */
.weak GPIO_15_IRQHandler
.thumb_set GPIO_15_IRQHandler,Default_Handler
/* 23 */
.weak SM2_IRQHandler
.thumb_set SM2_IRQHandler,Default_Handler
/* 24 */
.weak RSA_IRQHandler
.thumb_set RSA_IRQHandler,Default_Handler
/* 25 */
/* 26 */
/* 27 */
/* 28 */
/* 29 */
/* 30 */
/* 31 */
/* 32 */
.weak RPU_IRQHandler
.thumb_set RPU_IRQHandler,Default_Handler
/* 33 */
/* 34 */
/* 35 */
/* 36 */
/* 37 */
/* 38 */
/* 39 */
.weak PCIE_IRQHandler
.thumb_set PCIE_IRQHandler,Default_Handler
/* 40 */
.weak DMAC_H_IRQHandler
.thumb_set DMAC_H_IRQHandler,Default_Handler
/* 41 */
.weak GMII_1_N_IRQHandler
.thumb_set GMII_1_N_IRQHandler,Default_Handler
/* 42 */
.weak SDIO_IRQHandler
.thumb_set SDIO_IRQHandler,Default_Handler
/* 43 */
.weak GMII_N_IRQHandler
.thumb_set GMII_N_IRQHandler,Default_Handler
/* 44 */
.weak RTC_IRQHandler
.thumb_set RTC_IRQHandler,Default_Handler
/* 45 */
.weak TIMER_1_IRQHandler
.thumb_set TIMER_1_IRQHandler,Default_Handler
/* 46 */
.weak TIMER_2_IRQHandler
.thumb_set TIMER_2_IRQHandler,Default_Handler
/* 47 */
.weak TIMER_3_IRQHandler
.thumb_set TIMER_3_IRQHandler,Default_Handler
/* 48 */
.weak TIMER_4_IRQHandler
.thumb_set TIMER_4_IRQHandler,Default_Handler
/* 49 */
.weak TIMER_5_IRQHandler
.thumb_set TIMER_5_IRQHandler,Default_Handler
/* 50 */
.weak TIMER_6_IRQHandler
.thumb_set TIMER_6_IRQHandler,Default_Handler
/* 51 */
.weak TIMER_7_IRQHandler
.thumb_set TIMER_7_IRQHandler,Default_Handler
/* 52 */
.weak TIMER_8_IRQHandler
.thumb_set TIMER_8_IRQHandler,Default_Handler
/* 53 */
.weak UART_1_IRQHandler
.thumb_set UART_1_IRQHandler,Default_Handler
/* 54 */
.weak UART_2_IRQHandler
.thumb_set UART_2_IRQHandler,Default_Handler
/* 55 */
.weak I2C_1_IRQHandler
.thumb_set I2C_1_IRQHandler,Default_Handler
/* 56 */
/* 57 */
.weak SPI_IRQHandler
.thumb_set SPI_IRQHandler,Default_Handler
/* 58 */
/* 59 */
.weak WDT_IRQHandler
.thumb_set WDT_IRQHandler,Default_Handler
/* 60 */
.weak GMII_CFP_IRQHandler
.thumb_set GMII_CFP_IRQHandler,Default_Handler
/* 61 */
.weak I2C_2_IRQHandler
.thumb_set I2C_2_IRQHandler,Default_Handler
/* 62 */
.weak PCIE_CMDQ_IRQHandler
.thumb_set PCIE_CMDQ_IRQHandler,Default_Handler
/* 63 */
.weak PCIE_MSIX_IRQHandler
.thumb_set PCIE_MSIX_IRQHandler,Default_Handler